1 file index instead of 2

GitOrigin-RevId: 212a231955876b16c27e03151661567b4fd8b0d8
This commit is contained in:
adelf
2020-08-01 20:32:06 +03:00
committed by intellij-monorepo-bot
parent d20e9653cf
commit e9f17d2053
7 changed files with 117 additions and 142 deletions

View File

@@ -11,8 +11,6 @@ import com.intellij.util.Processor;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.indexing.DotEnvKeyValuesIndex;
import ru.adelf.idea.dotenv.indexing.DotEnvKeysIndex;
import ru.adelf.idea.dotenv.models.EnvironmentKeyValue;
import ru.adelf.idea.dotenv.util.EnvironmentVariablesProviderUtil;
import ru.adelf.idea.dotenv.util.EnvironmentVariablesUtil;
@@ -27,33 +25,33 @@ public class EnvironmentVariablesApi {
Map<String, String> secondaryKeyValues = new HashMap<>();
Map<VirtualFile, FileAcceptResult> resultsCache = new HashMap<>();
fileBasedIndex.processAllKeys(DotEnvKeyValuesIndex.KEY, s -> {
for(VirtualFile virtualFile : fileBasedIndex.getContainingFiles(DotEnvKeyValuesIndex.KEY, s, GlobalSearchScope.allScope(project))) {
GlobalSearchScope scope = GlobalSearchScope.allScope(project);
fileBasedIndex.processAllKeys(DotEnvKeyValuesIndex.KEY, key -> {
for (VirtualFile virtualFile : fileBasedIndex.getContainingFiles(DotEnvKeyValuesIndex.KEY, key, scope)) {
FileAcceptResult fileAcceptResult;
if(resultsCache.containsKey(virtualFile)) {
if (resultsCache.containsKey(virtualFile)) {
fileAcceptResult = resultsCache.get(virtualFile);
} else {
fileAcceptResult = getFileAcceptResult(virtualFile);
resultsCache.put(virtualFile, fileAcceptResult);
}
if(!fileAcceptResult.isAccepted()) {
if (!fileAcceptResult.isAccepted()) {
continue;
}
EnvironmentKeyValue keyValue = EnvironmentVariablesUtil.getKeyValueFromString(s);
if(fileAcceptResult.isPrimary()) {
if(keyValues.containsKey(keyValue.getKey())) return true;
keyValues.put(keyValue.getKey(), keyValue.getValue());
} else {
if(!secondaryKeyValues.containsKey(keyValue.getKey())) {
secondaryKeyValues.put(keyValue.getKey(), keyValue.getValue());
fileBasedIndex.processValues(DotEnvKeyValuesIndex.KEY, key, virtualFile, ((file, val) -> {
if (fileAcceptResult.isPrimary()) {
keyValues.putIfAbsent(key, val);
} else {
secondaryKeyValues.putIfAbsent(key, val);
}
}
return true;
}), scope);
}
return true;
@@ -72,15 +70,15 @@ public class EnvironmentVariablesApi {
List<PsiElement> targets = new ArrayList<>();
List<PsiElement> secondaryTargets = new ArrayList<>();
FileBasedIndex.getInstance().getFilesWithKey(DotEnvKeysIndex.KEY, new HashSet<>(Collections.singletonList(key)), virtualFile -> {
FileBasedIndex.getInstance().getFilesWithKey(DotEnvKeyValuesIndex.KEY, new HashSet<>(Collections.singletonList(key)), virtualFile -> {
PsiFile psiFileTarget = PsiManager.getInstance(project).findFile(virtualFile);
if(psiFileTarget == null) {
if (psiFileTarget == null) {
return true;
}
for(EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
FileAcceptResult fileAcceptResult = provider.acceptFile(virtualFile);
if(!fileAcceptResult.isAccepted()) {
if (!fileAcceptResult.isAccepted()) {
continue;
}
@@ -120,9 +118,9 @@ public class EnvironmentVariablesApi {
}
private static FileAcceptResult getFileAcceptResult(VirtualFile virtualFile) {
for(EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
FileAcceptResult fileAcceptResult = provider.acceptFile(virtualFile);
if(!fileAcceptResult.isAccepted()) {
if (!fileAcceptResult.isAccepted()) {
continue;
}

View File

@@ -1,23 +1,74 @@
package ru.adelf.idea.dotenv.indexing;
import com.intellij.util.indexing.ID;
import com.intellij.util.indexing.*;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesProvider;
import ru.adelf.idea.dotenv.models.KeyValuePsiElement;
import ru.adelf.idea.dotenv.util.EnvironmentVariablesProviderUtil;
public class DotEnvKeyValuesIndex extends EnvironmentVariablesIndex {
import java.util.HashMap;
import java.util.Map;
public static final ID<String, Void> KEY = ID.create("ru.adelf.idea.php.dotenv.keyValues");
public class DotEnvKeyValuesIndex extends FileBasedIndexExtension<String, String> {
public static final ID<String, String> KEY = ID.create("ru.adelf.idea.php.dotenv.keyValues");
@NotNull
@Override
public ID<String, Void> getName() {
public ID<String, String> getName() {
return KEY;
}
@NotNull
@Override
public DataIndexer<String, String, FileContent> getIndexer() {
return fileContent -> {
final Map<String, String> map = new HashMap<>();
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for (KeyValuePsiElement keyValueElement : provider.getElements(fileContent.getPsiFile())) {
map.put(keyValueElement.getKey(), keyValueElement.getShortValue());
}
}
return map;
};
}
@NotNull
@Override
String getIndexKey(KeyValuePsiElement keyValue) {
return keyValue.getKey() + "=" + keyValue.getShortValue();
public KeyDescriptor<String> getKeyDescriptor() {
return EnumeratorStringDescriptor.INSTANCE;
}
@NotNull
@Override
public DataExternalizer<String> getValueExternalizer() {
return EnumeratorStringDescriptor.INSTANCE;
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return file -> {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
if (provider.acceptFile(file).isAccepted()) return true;
}
return false;
};
}
@Override
public boolean dependsOnFileContent() {
return true;
}
@Override
public int getVersion() {
return 5;
}
}

View File

@@ -1,22 +0,0 @@
package ru.adelf.idea.dotenv.indexing;
import com.intellij.util.indexing.ID;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.models.KeyValuePsiElement;
public class DotEnvKeysIndex extends EnvironmentVariablesIndex {
public static final ID<String, Void> KEY = ID.create("ru.adelf.idea.php.dotenv.keys");
@NotNull
@Override
public ID<String, Void> getName() {
return KEY;
}
@NotNull
@Override
String getIndexKey(KeyValuePsiElement keyValue) {
return keyValue.getKey();
}
}

View File

@@ -1,71 +0,0 @@
package ru.adelf.idea.dotenv.indexing;
import com.intellij.util.indexing.*;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import com.intellij.util.io.VoidDataExternalizer;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesProvider;
import ru.adelf.idea.dotenv.models.KeyValuePsiElement;
import ru.adelf.idea.dotenv.util.EnvironmentVariablesProviderUtil;
import java.util.HashMap;
import java.util.Map;
abstract class EnvironmentVariablesIndex extends FileBasedIndexExtension<String, Void> {
private final KeyDescriptor<String> myKeyDescriptor = EnumeratorStringDescriptor.INSTANCE;
@NotNull
@Override
public DataIndexer<String, Void, FileContent> getIndexer() {
return fileContent -> {
final Map<String, Void> map = new HashMap<>();
for(EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for(KeyValuePsiElement keyValueElement : provider.getElements(fileContent.getPsiFile())) {
map.put(getIndexKey(keyValueElement), null);
}
}
return map;
};
}
@NotNull
abstract String getIndexKey(KeyValuePsiElement keyValueElement);
@NotNull
@Override
public KeyDescriptor<String> getKeyDescriptor() {
return this.myKeyDescriptor;
}
@NotNull
@Override
public DataExternalizer<Void> getValueExternalizer() {
return VoidDataExternalizer.INSTANCE;
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return file -> {
for(EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
if(provider.acceptFile(file).isAccepted()) return true;
}
return false;
};
}
@Override
public boolean dependsOnFileContent() {
return true;
}
@Override
public int getVersion() {
return 4;
}
}

View File

@@ -67,7 +67,6 @@
<extensions defaultExtensionNs="com.intellij">
<gotoDeclarationHandler implementation="ru.adelf.idea.dotenv.extension.DotEnvKeyGotoHandler"/>
<fileBasedIndex implementation="ru.adelf.idea.dotenv.indexing.DotEnvKeysIndex"/>
<fileBasedIndex implementation="ru.adelf.idea.dotenv.indexing.DotEnvKeyValuesIndex"/>
<fileType name=".env file" extensions="env" fileNames=".env" patterns=".env.*" fieldName="INSTANCE" language="DotEnv"

View File

@@ -8,11 +8,13 @@ import com.intellij.util.indexing.FileBasedIndexImpl;
import com.intellij.util.indexing.ID;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi;
import ru.adelf.idea.dotenv.indexing.DotEnvKeyValuesIndex;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Copy of LaravelLightCodeInsightFixtureTestCase from laravel plugin
@@ -38,9 +40,9 @@ public abstract class DotEnvLightCodeInsightFixtureTestCase extends BasePlatform
return true;
}, GlobalSearchScope.allScope(getProject()));
if(notCondition && virtualFiles.size() > 0) {
if (notCondition && virtualFiles.size() > 0) {
fail(String.format("Fail that ID '%s' not contains '%s'", id.toString(), key));
} else if(!notCondition && virtualFiles.size() == 0) {
} else if (!notCondition && virtualFiles.size() == 0) {
fail(String.format("Fail that ID '%s' contains '%s'", id.toString(), key));
}
}
@@ -49,9 +51,26 @@ public abstract class DotEnvLightCodeInsightFixtureTestCase extends BasePlatform
protected void assertUsagesContains(@NotNull String... keys) {
for (String key : keys) {
PsiElement[] usages = EnvironmentVariablesApi.getKeyUsages(this.myFixture.getProject(), key);
if(usages.length == 0) {
if (usages.length == 0) {
fail(String.format("Fail that usages contains '%s'", key));
}
}
}
protected void assertContainsKeyAndValue(@NotNull String key, @NotNull String value) {
assertIndexContains(DotEnvKeyValuesIndex.KEY, key);
final AtomicBoolean found = new AtomicBoolean(false);
FileBasedIndexImpl.getInstance().processValues(DotEnvKeyValuesIndex.KEY, key, null, (virtualFile, s) -> {
if (s.equals(value)) {
found.set(true);
}
return false;
}, GlobalSearchScope.allScope(myFixture.getProject()));
if (!found.get()) {
fail(String.format("Fail that index contains pair '%s' => '%s'", key, value));
}
}
}

View File

@@ -1,7 +1,6 @@
package ru.adelf.idea.dotenv.tests.dotenv;
import ru.adelf.idea.dotenv.indexing.DotEnvKeyValuesIndex;
import ru.adelf.idea.dotenv.indexing.DotEnvKeysIndex;
import ru.adelf.idea.dotenv.tests.DotEnvLightCodeInsightFixtureTestCase;
public class DotEnvFileTest extends DotEnvLightCodeInsightFixtureTestCase {
@@ -17,44 +16,46 @@ public class DotEnvFileTest extends DotEnvLightCodeInsightFixtureTestCase {
}
public void testEnvKeys() {
assertIndexContains(DotEnvKeysIndex.KEY,"TEST", "TEST2", "TEST3", "EMPTY_KEY", "OFFSET_KEY");
assertIndexContains(DotEnvKeyValuesIndex.KEY, "TEST", "TEST2", "TEST3", "EMPTY_KEY", "OFFSET_KEY");
}
public void testEnvKeyValues() {
assertIndexContains(DotEnvKeyValuesIndex.KEY,"TEST=1");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"TEST2=2");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"TEST3=3");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"OFFSET_KEY=offset");
assertContainsKeyAndValue("TEST", "1");
assertContainsKeyAndValue("TEST2", "2");
assertContainsKeyAndValue("TEST3", "3");
assertContainsKeyAndValue("OFFSET_KEY", "offset");
}
public void testEnvCommentedVars() {
assertIndexContains(DotEnvKeyValuesIndex.KEY,"COMMENTED_VAR=123");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"COMMENTED_VAR2=123 #comment");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"COMMENTED_VAR3=123 #com\\\"ment");
assertContainsKeyAndValue("COMMENTED_VAR", "123");
assertContainsKeyAndValue("COMMENTED_VAR2", "123 #comment");
assertContainsKeyAndValue("COMMENTED_VAR3", "123 #com\\\"ment");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"COMMENTED_VAR4=1");
assertContainsKeyAndValue("COMMENTED_VAR4", "1");
}
public void testEnvEmptyCommentedVars() {
assertIndexContains(DotEnvKeyValuesIndex.KEY,"COMMENTED_EMPTY=");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"COMMENTED_EMPTY2=");
assertContainsKeyAndValue("COMMENTED_EMPTY", "");
assertContainsKeyAndValue("COMMENTED_EMPTY2", "");
}
public void testEnvComments() {
assertIndexNotContains(DotEnvKeysIndex.KEY,"Comment", "#Comment", "#Another comment");
assertIndexNotContains(DotEnvKeyValuesIndex.KEY, "Comment", "#Comment", "#Another comment");
}
public void testSlashInTheEndOfQuoted() {
assertIndexContains(DotEnvKeysIndex.KEY,"SLASH_IN_THE_END_OF_QUOTED", "AFTER");
assertIndexContains(DotEnvKeyValuesIndex.KEY, "SLASH_IN_THE_END_OF_QUOTED", "AFTER");
assertIndexContains(DotEnvKeyValuesIndex.KEY,"SLASH_IN_THE_END_OF_QUOTED=123 #com\\\\", "AFTER=1");
assertContainsKeyAndValue("SLASH_IN_THE_END_OF_QUOTED", "123 #com\\\\");
assertContainsKeyAndValue("AFTER", "1");
}
public void testMultiLine() {
assertIndexContains(DotEnvKeyValuesIndex.KEY,"MULTI_LINE=MULTI...");
assertContainsKeyAndValue("MULTI_LINE", "MULTI...");
}
public void testEnvExportKeys() {
assertIndexContains(DotEnvKeysIndex.KEY,"EXPORTED");
assertIndexContains(DotEnvKeyValuesIndex.KEY, "EXPORTED");
}
}