aboutsummaryrefslogtreecommitdiffstats
path: root/sd-plugin/src/main/java/org/intellij/sdk/language/SdReference.java
diff options
context:
space:
mode:
Diffstat (limited to 'sd-plugin/src/main/java/org/intellij/sdk/language/SdReference.java')
-rw-r--r--sd-plugin/src/main/java/org/intellij/sdk/language/SdReference.java72
1 files changed, 72 insertions, 0 deletions
diff --git a/sd-plugin/src/main/java/org/intellij/sdk/language/SdReference.java b/sd-plugin/src/main/java/org/intellij/sdk/language/SdReference.java
new file mode 100644
index 00000000000..891d94e15cb
--- /dev/null
+++ b/sd-plugin/src/main/java/org/intellij/sdk/language/SdReference.java
@@ -0,0 +1,72 @@
+package org.intellij.sdk.language;
+
+import com.intellij.codeInsight.lookup.LookupElement;
+import com.intellij.codeInsight.lookup.LookupElementBuilder;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiElementResolveResult;
+import com.intellij.psi.PsiPolyVariantReference;
+import com.intellij.psi.PsiReferenceBase;
+import com.intellij.psi.ResolveResult;
+import com.intellij.util.IncorrectOperationException;
+import org.intellij.sdk.language.psi.SdDeclaration;
+import org.intellij.sdk.language.psi.SdIdentifierVal;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SdReference extends PsiReferenceBase<PsiElement> implements PsiPolyVariantReference {
+
+ private final String elementName;
+
+ public SdReference(@NotNull PsiElement element, TextRange textRange) {
+ super(element, textRange);
+ elementName = element.getText().substring(textRange.getStartOffset(), textRange.getEndOffset());
+ }
+
+ @NotNull
+ @Override
+ public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) {
+
+ PsiElement file = myElement.getContainingFile();
+
+ final List<SdDeclaration> declarations = SdUtil.findDeclarationsByScope(file, myElement, elementName);
+
+ List<ResolveResult> results = new ArrayList<>();
+
+ for (SdDeclaration declaration : declarations) {
+ results.add(new PsiElementResolveResult(declaration));
+ }
+ return results.toArray(new ResolveResult[results.size()]);
+ }
+
+ @Nullable
+ @Override
+ public PsiElement resolve() {
+ ResolveResult[] resolveResults = multiResolve(false);
+ return resolveResults.length == 1 ? resolveResults[0].getElement() : null;
+ }
+
+ @Override
+ public Object @NotNull [] getVariants() {
+ List<SdDeclaration> declarations = SdUtil.findDeclarations(myElement.getContainingFile());
+ List<LookupElement> variants = new ArrayList<>();
+ for (final SdDeclaration element : declarations) {
+ if (element.getName() != null && element.getName().length() > 0) {
+ variants.add(LookupElementBuilder
+ .create(element).withIcon(SdIcons.FILE)
+ .withTypeText(element.getContainingFile().getName())
+ );
+ }
+ }
+ return variants.toArray();
+ }
+
+ @Override
+ public PsiElement handleElementRename(@NotNull String newElementName) throws IncorrectOperationException {
+ return ((SdIdentifierVal) myElement).setName(newElementName);
+ }
+
+}