From e9f17d20538c1aef9a8666ccf13dbe85e36a05cb Mon Sep 17 00:00:00 2001 From: adelf Date: Sat, 1 Aug 2020 20:32:06 +0300 Subject: [PATCH] 1 file index instead of 2 GitOrigin-RevId: 212a231955876b16c27e03151661567b4fd8b0d8 --- .../dotenv/api/EnvironmentVariablesApi.java | 42 ++++++----- .../dotenv/indexing/DotEnvKeyValuesIndex.java | 63 ++++++++++++++-- .../idea/dotenv/indexing/DotEnvKeysIndex.java | 22 ------ .../indexing/EnvironmentVariablesIndex.java | 71 ------------------- .../src/main/resources/META-INF/plugin.xml | 1 - ...DotEnvLightCodeInsightFixtureTestCase.java | 25 ++++++- .../dotenv/tests/dotenv/DotEnvFileTest.java | 35 ++++----- 7 files changed, 117 insertions(+), 142 deletions(-) delete mode 100644 plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeysIndex.java delete mode 100644 plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/EnvironmentVariablesIndex.java diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java index a4d8e1b1ab92..b0872a67d9f6 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesApi.java @@ -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 secondaryKeyValues = new HashMap<>(); Map 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 targets = new ArrayList<>(); List 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; } diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java index b907e11842c8..9a9989651806 100644 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java +++ b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java @@ -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 KEY = ID.create("ru.adelf.idea.php.dotenv.keyValues"); +public class DotEnvKeyValuesIndex extends FileBasedIndexExtension { + + public static final ID KEY = ID.create("ru.adelf.idea.php.dotenv.keyValues"); @NotNull @Override - public ID getName() { + public ID getName() { return KEY; } + @NotNull + @Override + public DataIndexer getIndexer() { + return fileContent -> { + final Map 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 getKeyDescriptor() { + return EnumeratorStringDescriptor.INSTANCE; + } + + @NotNull + @Override + public DataExternalizer 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; } } diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeysIndex.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeysIndex.java deleted file mode 100644 index 60cb1d01dd15..000000000000 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeysIndex.java +++ /dev/null @@ -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 KEY = ID.create("ru.adelf.idea.php.dotenv.keys"); - - @NotNull - @Override - public ID getName() { - return KEY; - } - - @NotNull - @Override - String getIndexKey(KeyValuePsiElement keyValue) { - return keyValue.getKey(); - } -} diff --git a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/EnvironmentVariablesIndex.java b/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/EnvironmentVariablesIndex.java deleted file mode 100644 index 770c5e067588..000000000000 --- a/plugins/env-files-support/src/main/java/ru/adelf/idea/dotenv/indexing/EnvironmentVariablesIndex.java +++ /dev/null @@ -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 { - private final KeyDescriptor myKeyDescriptor = EnumeratorStringDescriptor.INSTANCE; - - @NotNull - @Override - public DataIndexer getIndexer() { - return fileContent -> { - final Map 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 getKeyDescriptor() { - return this.myKeyDescriptor; - } - - @NotNull - @Override - public DataExternalizer 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; - } -} diff --git a/plugins/env-files-support/src/main/resources/META-INF/plugin.xml b/plugins/env-files-support/src/main/resources/META-INF/plugin.xml index b19dcc057c24..0315da722333 100644 --- a/plugins/env-files-support/src/main/resources/META-INF/plugin.xml +++ b/plugins/env-files-support/src/main/resources/META-INF/plugin.xml @@ -67,7 +67,6 @@ - 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)); + } + } } diff --git a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/DotEnvFileTest.java b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/DotEnvFileTest.java index 0f710a662bc3..841f7938ab50 100644 --- a/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/DotEnvFileTest.java +++ b/plugins/env-files-support/src/test/java/ru/adelf/idea/dotenv/tests/dotenv/DotEnvFileTest.java @@ -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"); } }