diff options
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.java | 72 |
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); + } + +} |