mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-30 02:09:59 +07:00
find usages support
GitOrigin-RevId: 3957cab3223765f7f305157fc2b0a4588bce66fc
This commit is contained in:
committed by
intellij-monorepo-bot
parent
36c8fc5883
commit
fb4ed29e91
@@ -4,25 +4,27 @@ import com.intellij.lang.cacheBuilder.DefaultWordsScanner;
|
||||
import com.intellij.lang.cacheBuilder.WordsScanner;
|
||||
import com.intellij.lang.findUsages.FindUsagesProvider;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import ru.adelf.idea.dotenv.grammars.DotEnvLexerAdapter;
|
||||
import ru.adelf.idea.dotenv.psi.DotEnvProperty;
|
||||
import ru.adelf.idea.dotenv.psi.DotEnvTypes;
|
||||
|
||||
public class DotEnvFindUsagesProvider implements FindUsagesProvider {
|
||||
@Nullable
|
||||
@Override
|
||||
public WordsScanner getWordsScanner() {
|
||||
return null;/*new DefaultWordsScanner(new DotEnvLexerAdapter(),
|
||||
return new DefaultWordsScanner(new DotEnvLexerAdapter(),
|
||||
TokenSet.create(DotEnvTypes.KEY),
|
||||
TokenSet.create(DotEnvTypes.COMMENT),
|
||||
TokenSet.EMPTY);*/
|
||||
TokenSet.EMPTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFindUsagesFor(@NotNull PsiElement psiElement) {
|
||||
return true;//psiElement instanceof PsiNamedElement;
|
||||
return true;//psiElement instanceof DotEnvProperty;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -34,33 +36,30 @@ public class DotEnvFindUsagesProvider implements FindUsagesProvider {
|
||||
@NotNull
|
||||
@Override
|
||||
public String getType(@NotNull PsiElement element) {
|
||||
// if (element instanceof SimpleProperty) {
|
||||
// return "simple property";
|
||||
// } else {
|
||||
if (element instanceof DotEnvProperty) {
|
||||
return "Environment variable";
|
||||
} else {
|
||||
return "";
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getDescriptiveName(@NotNull PsiElement element) {
|
||||
// if (element instanceof SimpleProperty) {
|
||||
// return ((SimpleProperty) element).getKey();
|
||||
// } else {
|
||||
// return "";
|
||||
// }
|
||||
return "";
|
||||
if (element instanceof DotEnvProperty) {
|
||||
return ((DotEnvProperty) element).getKeyText();
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getNodeText(@NotNull PsiElement element, boolean useFullName) {
|
||||
// if (element instanceof SimpleProperty) {
|
||||
// return ((SimpleProperty) element).getKey() + ":" + ((SimpleProperty) element).getValue();
|
||||
// } else {
|
||||
// return "";
|
||||
// }
|
||||
|
||||
return "";
|
||||
if (element instanceof DotEnvProperty) {
|
||||
return ((DotEnvProperty) element).getKeyText() + ":" + ((DotEnvProperty) element).getValueText();
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package ru.adelf.idea.dotenv.extension;
|
||||
|
||||
import com.intellij.lang.refactoring.RefactoringSupportProvider;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.adelf.idea.dotenv.psi.DotEnvProperty;
|
||||
|
||||
public class DotEnvRefactoringSupportProvider extends RefactoringSupportProvider {
|
||||
@Override
|
||||
public boolean isMemberInplaceRenameAvailable(@NotNull PsiElement element, PsiElement context) {
|
||||
return element instanceof DotEnvProperty;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package ru.adelf.idea.dotenv.extension;
|
||||
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class DotEnvReference extends PsiReferenceBase<PsiElement> implements PsiPolyVariantReference {
|
||||
private String key;
|
||||
|
||||
public DotEnvReference(@NotNull PsiElement element, TextRange textRange) {
|
||||
super(element, textRange);
|
||||
key = element.getText().substring(textRange.getStartOffset(), textRange.getEndOffset());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ResolveResult[] multiResolve(boolean incompleteCode) {
|
||||
Project project = myElement.getProject();
|
||||
final PsiElement[] elements = EnvironmentVariablesApi.getKeyDeclarations(project, key);
|
||||
|
||||
return Arrays.stream(elements)
|
||||
.filter(psiElement -> psiElement instanceof PsiNamedElement)
|
||||
.map(PsiElementResolveResult::new)
|
||||
.toArray(ResolveResult[]::new);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public PsiElement resolve() {
|
||||
ResolveResult[] resolveResults = multiResolve(false);
|
||||
return resolveResults.length == 1 ? resolveResults[0].getElement() : null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Object[] getVariants() {
|
||||
Project project = myElement.getProject();
|
||||
final PsiElement[] elements = EnvironmentVariablesApi.getKeyDeclarations(project, key);
|
||||
|
||||
return Arrays.stream(elements)
|
||||
.filter(psiElement -> psiElement instanceof PsiNamedElement)
|
||||
.map(psiElement -> LookupElementBuilder.create(psiElement).
|
||||
withTypeText(psiElement.getContainingFile().getName()))
|
||||
.toArray(LookupElement[]::new);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package ru.adelf.idea.dotenv.php;
|
||||
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.patterns.PlatformPatterns;
|
||||
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.adelf.idea.dotenv.extension.DotEnvReference;
|
||||
import ru.adelf.idea.dotenv.util.PsiUtil;
|
||||
|
||||
public class PhpDotEnvReferenceContributor extends PsiReferenceContributor {
|
||||
@Override
|
||||
public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
|
||||
registrar.registerReferenceProvider(PlatformPatterns.psiElement(StringLiteralExpression.class),
|
||||
new PsiReferenceProvider() {
|
||||
@NotNull
|
||||
@Override
|
||||
public PsiReference[] getReferencesByElement(@NotNull PsiElement element,
|
||||
@NotNull ProcessingContext
|
||||
context) {
|
||||
StringLiteralExpression literal = (StringLiteralExpression) element;
|
||||
|
||||
if(!PsiUtil.isEnvFunctionParameter(literal)) {
|
||||
return PsiReference.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
String value = literal.getContents();
|
||||
|
||||
return new PsiReference[]{new DotEnvReference(element, new TextRange(1, value.length() + 1))};
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user