reference_contributor.md: Use PsiPolyVariantReferenceBase

This commit is contained in:
Karol Lewandowski 2024-12-17 13:44:31 +01:00
parent affd74da22
commit f6049a1dc0
2 changed files with 12 additions and 15 deletions

View File

@ -6,27 +6,30 @@ import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange; 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.intellij.sdk.language.psi.SimpleProperty;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
final class SimpleReference extends PsiReferenceBase<PsiElement> implements PsiPolyVariantReference { final class SimpleReference extends PsiPolyVariantReferenceBase<PsiElement> {
private final String key; private final String key;
SimpleReference(@NotNull PsiElement element, TextRange textRange) { SimpleReference(@NotNull PsiElement element, TextRange textRange) {
super(element, textRange); super(element, textRange);
key = element.getText().substring(textRange.getStartOffset(), textRange.getEndOffset()); key = element.getText()
.substring(textRange.getStartOffset(), textRange.getEndOffset());
} }
@Override @Override
public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) { public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) {
Project project = myElement.getProject(); Project project = myElement.getProject();
final List<SimpleProperty> properties = SimpleUtil.findProperties(project, key); List<SimpleProperty> properties = SimpleUtil.findProperties(project, key);
List<ResolveResult> results = new ArrayList<>(); List<ResolveResult> results = new ArrayList<>();
for (SimpleProperty property : properties) { for (SimpleProperty property : properties) {
results.add(new PsiElementResolveResult(property)); results.add(new PsiElementResolveResult(property));
@ -34,19 +37,12 @@ final class SimpleReference extends PsiReferenceBase<PsiElement> implements PsiP
return results.toArray(new ResolveResult[0]); return results.toArray(new ResolveResult[0]);
} }
@Nullable
@Override
public PsiElement resolve() {
ResolveResult[] resolveResults = multiResolve(false);
return resolveResults.length == 1 ? resolveResults[0].getElement() : null;
}
@Override @Override
public Object @NotNull [] getVariants() { public Object @NotNull [] getVariants() {
Project project = myElement.getProject(); Project project = myElement.getProject();
List<SimpleProperty> properties = SimpleUtil.findProperties(project); List<SimpleProperty> properties = SimpleUtil.findProperties(project);
List<LookupElement> variants = new ArrayList<>(); List<LookupElement> variants = new ArrayList<>();
for (final SimpleProperty property : properties) { for (SimpleProperty property : properties) {
if (property.getKey() != null && !property.getKey().isEmpty()) { if (property.getKey() != null && !property.getKey().isEmpty()) {
variants.add(LookupElementBuilder variants.add(LookupElementBuilder
.create(property).withIcon(SimpleIcons.FILE) .create(property).withIcon(SimpleIcons.FILE)

View File

@ -121,8 +121,9 @@ property ::= (KEY? SEPARATOR VALUE?) | KEY {
## Define a Reference ## 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. 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). 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).
The latter enables the reference to resolve to more than one element or to resolve result(s) for a superset of valid resolve cases. To simplify the implementation, [`PsiPolyVariantReferenceBase`](%gh-ic%/platform/core-api/src/com/intellij/psi/PsiPolyVariantReferenceBase.java) is used as a base class.
```java ```java
``` ```