find usages support

GitOrigin-RevId: 3957cab3223765f7f305157fc2b0a4588bce66fc
This commit is contained in:
adelf
2019-03-09 21:15:46 +03:00
committed by intellij-monorepo-bot
parent 36c8fc5883
commit fb4ed29e91
4 changed files with 119 additions and 20 deletions

View File

@@ -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 "";
}
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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))};
}
});
}
}