mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
1 file index instead of 2
GitOrigin-RevId: 212a231955876b16c27e03151661567b4fd8b0d8
This commit is contained in:
committed by
intellij-monorepo-bot
parent
d20e9653cf
commit
e9f17d2053
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user