Navigation to get/set in property delegates when they are located in the libraries
This commit is contained in:
+39
-14
@@ -18,20 +18,27 @@ package org.jetbrains.jet.plugin.references;
|
|||||||
|
|
||||||
import com.beust.jcommander.internal.Lists;
|
import com.beust.jcommander.internal.Lists;
|
||||||
import com.intellij.lang.ASTNode;
|
import com.intellij.lang.ASTNode;
|
||||||
|
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.*;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
import com.intellij.util.IncorrectOperationException;
|
import com.intellij.util.IncorrectOperationException;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||||
import org.jetbrains.jet.lang.psi.JetProperty;
|
import org.jetbrains.jet.lang.psi.JetProperty;
|
||||||
import org.jetbrains.jet.lang.psi.JetPropertyDelegate;
|
import org.jetbrains.jet.lang.psi.JetPropertyDelegate;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
||||||
|
import org.jetbrains.jet.plugin.libraries.DecompiledNavigationUtils;
|
||||||
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
|
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class JetPropertyDelegationMethodsReference implements PsiPolyVariantReference {
|
public class JetPropertyDelegationMethodsReference implements PsiPolyVariantReference {
|
||||||
@@ -64,23 +71,41 @@ public class JetPropertyDelegationMethodsReference implements PsiPolyVariantRefe
|
|||||||
List<ResolveResult> results = Lists.newArrayList();
|
List<ResolveResult> results = Lists.newArrayList();
|
||||||
|
|
||||||
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
|
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
|
||||||
addResultsForAccessor(context, results, propertyDescriptor.getGetter());
|
addResultsForAccessor(property.getProject(), context, results, propertyDescriptor.getGetter());
|
||||||
addResultsForAccessor(context, results, propertyDescriptor.getSetter());
|
addResultsForAccessor(property.getProject(), context, results, propertyDescriptor.getSetter());
|
||||||
|
|
||||||
return results.toArray(new ResolveResult[results.size()]);
|
return results.toArray(new ResolveResult[results.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addResultsForAccessor(BindingContext context, List<ResolveResult> results, PropertyAccessorDescriptor accessor) {
|
private static void addResultsForAccessor(
|
||||||
if (accessor != null) {
|
Project project,
|
||||||
ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, accessor);
|
BindingContext context,
|
||||||
if (resolvedCall != null) {
|
List<ResolveResult> results,
|
||||||
FunctionDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor();
|
PropertyAccessorDescriptor accessor
|
||||||
|
) {
|
||||||
|
if (accessor == null) return;
|
||||||
|
|
||||||
PsiElement declaration = BindingContextUtils.descriptorToDeclaration(context, resultingDescriptor);
|
ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, accessor);
|
||||||
if (declaration != null) {
|
if (resolvedCall == null) return;
|
||||||
results.add(new PsiElementResolveResult(declaration, true));
|
|
||||||
}
|
FunctionDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor().getOriginal();
|
||||||
}
|
|
||||||
|
List<PsiElement> declarations = BindingContextUtils.descriptorToDeclarations(context, resultingDescriptor);
|
||||||
|
for (PsiElement declaration : declarations) {
|
||||||
|
results.add(new PsiElementResolveResult(declaration, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
JetDeclaration declarationInDecompiledFile =
|
||||||
|
DecompiledNavigationUtils.findDeclarationForReference(project, resultingDescriptor);
|
||||||
|
if (declarationInDecompiledFile != null) {
|
||||||
|
results.add(new PsiElementResolveResult(declarationInDecompiledFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<PsiElement> stdlibSymbols =
|
||||||
|
project.getComponent(BuiltInsReferenceResolver.class).resolveStandardLibrarySymbol(resultingDescriptor);
|
||||||
|
|
||||||
|
for (PsiElement symbol : stdlibSymbols) {
|
||||||
|
results.add(new PsiElementResolveResult(symbol));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +132,7 @@ public class JetPropertyDelegationMethodsReference implements PsiPolyVariantRefe
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public String getCanonicalText() {
|
public String getCanonicalText() {
|
||||||
return "get";
|
return "<unknown>";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user