From f6049a1dc06d89f4fcdead94f4644a95197876db Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Tue, 17 Dec 2024 13:44:31 +0100 Subject: [PATCH] reference_contributor.md: Use PsiPolyVariantReferenceBase --- .../sdk/language/SimpleReference.java | 22 ++++++++----------- .../reference_contributor.md | 5 +++-- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/code_samples/simple_language_plugin/src/main/java/org/intellij/sdk/language/SimpleReference.java b/code_samples/simple_language_plugin/src/main/java/org/intellij/sdk/language/SimpleReference.java index ec49b96e6..6c64acae8 100644 --- a/code_samples/simple_language_plugin/src/main/java/org/intellij/sdk/language/SimpleReference.java +++ b/code_samples/simple_language_plugin/src/main/java/org/intellij/sdk/language/SimpleReference.java @@ -6,27 +6,30 @@ 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 com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementResolveResult; +import com.intellij.psi.PsiPolyVariantReferenceBase; +import com.intellij.psi.ResolveResult; import org.intellij.sdk.language.psi.SimpleProperty; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -final class SimpleReference extends PsiReferenceBase implements PsiPolyVariantReference { +final class SimpleReference extends PsiPolyVariantReferenceBase { private final String key; SimpleReference(@NotNull PsiElement element, TextRange textRange) { super(element, textRange); - key = element.getText().substring(textRange.getStartOffset(), textRange.getEndOffset()); + key = element.getText() + .substring(textRange.getStartOffset(), textRange.getEndOffset()); } @Override public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) { Project project = myElement.getProject(); - final List properties = SimpleUtil.findProperties(project, key); + List properties = SimpleUtil.findProperties(project, key); List results = new ArrayList<>(); for (SimpleProperty property : properties) { results.add(new PsiElementResolveResult(property)); @@ -34,19 +37,12 @@ final class SimpleReference extends PsiReferenceBase implements PsiP return results.toArray(new ResolveResult[0]); } - @Nullable - @Override - public PsiElement resolve() { - ResolveResult[] resolveResults = multiResolve(false); - return resolveResults.length == 1 ? resolveResults[0].getElement() : null; - } - @Override public Object @NotNull [] getVariants() { Project project = myElement.getProject(); List properties = SimpleUtil.findProperties(project); List variants = new ArrayList<>(); - for (final SimpleProperty property : properties) { + for (SimpleProperty property : properties) { if (property.getKey() != null && !property.getKey().isEmpty()) { variants.add(LookupElementBuilder .create(property).withIcon(SimpleIcons.FILE) diff --git a/topics/tutorials/custom_language_support/reference_contributor.md b/topics/tutorials/custom_language_support/reference_contributor.md index 790ef65b8..58ea9fc4b 100644 --- a/topics/tutorials/custom_language_support/reference_contributor.md +++ b/topics/tutorials/custom_language_support/reference_contributor.md @@ -121,8 +121,9 @@ property ::= (KEY? SEPARATOR VALUE?) | KEY { ## Define a Reference Now define a reference class [`SimpleReference.java`](%gh-sdk-samples-master%/simple_language_plugin/src/main/java/org/intellij/sdk/language/SimpleReference.java) to resolve a property from its usage. -This requires extending [`PsiReferenceBase`](%gh-ic%/platform/core-api/src/com/intellij/psi/PsiReferenceBase.java) and implementing [`PsiPolyVariantReference`](%gh-ic%/platform/core-api/src/com/intellij/psi/PsiPolyVariantReference.java). -The latter enables the reference to resolve to more than one element or to resolve result(s) for a superset of valid resolve cases. +As a single reference can [resolve to multiple](references_and_resolve.md#resolving-to-multiple-targets) Simple properties, it implements [`PsiPolyVariantReference`](%gh-ic%/platform/core-api/src/com/intellij/psi/PsiPolyVariantReference.java). +To simplify the implementation, [`PsiPolyVariantReferenceBase`](%gh-ic%/platform/core-api/src/com/intellij/psi/PsiPolyVariantReferenceBase.java) is used as a base class. + ```java ```