Extract method for finding declarations for descriptor without trace

Use it where appropriate
This commit is contained in:
Pavel V. Talanov
2013-09-02 19:50:29 +04:00
parent e4b2e32827
commit 3daa66424b
2 changed files with 32 additions and 19 deletions
@@ -18,35 +18,55 @@ package org.jetbrains.jet.plugin.codeInsight;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
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.plugin.libraries.DecompiledNavigationUtils;
import org.jetbrains.jet.plugin.references.BuiltInsReferenceResolver; import org.jetbrains.jet.plugin.references.BuiltInsReferenceResolver;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
public final class DescriptorToDeclarationUtil { public final class DescriptorToDeclarationUtil {
private DescriptorToDeclarationUtil() { private DescriptorToDeclarationUtil() {
} }
@Nullable
public static PsiElement getDeclaration(JetFile file, DeclarationDescriptor descriptor, BindingContext bindingContext) { public static PsiElement getDeclaration(JetFile file, DeclarationDescriptor descriptor, BindingContext bindingContext) {
return getDeclaration(file.getProject(), descriptor, bindingContext); return getDeclaration(file.getProject(), descriptor, bindingContext);
} }
@Nullable
public static PsiElement getDeclaration(Project project, DeclarationDescriptor descriptor, BindingContext bindingContext) { public static PsiElement getDeclaration(Project project, DeclarationDescriptor descriptor, BindingContext bindingContext) {
Collection<PsiElement> elements = BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor); Collection<PsiElement> elements = BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor);
if (elements.isEmpty()) { if (elements.isEmpty()) {
BuiltInsReferenceResolver libraryReferenceResolver = elements = findDeclarationsForDescriptorWithoutTrace(project, descriptor);
project.getComponent(BuiltInsReferenceResolver.class);
elements = libraryReferenceResolver.resolveBuiltInSymbol(descriptor);
} }
if (!elements.isEmpty()) { if (!elements.isEmpty()) {
return elements.iterator().next(); return elements.iterator().next();
} }
return null; return null;
} }
@NotNull
public static Collection<PsiElement> findDeclarationsForDescriptorWithoutTrace(
@NotNull Project project,
@NotNull DeclarationDescriptor descriptor
) {
BuiltInsReferenceResolver libraryReferenceResolver = project.getComponent(BuiltInsReferenceResolver.class);
Collection<PsiElement> elements = libraryReferenceResolver.resolveBuiltInSymbol(descriptor);
if (!elements.isEmpty()) {
return elements;
}
JetDeclaration decompiledDeclaration = DecompiledNavigationUtils.findDeclarationForReference(project, descriptor);
if (decompiledDeclaration != null) {
return Collections.<PsiElement>singleton(decompiledDeclaration);
}
return Collections.emptySet();
}
} }
@@ -25,13 +25,11 @@ 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.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression;
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.java.jetAsJava.JetClsMethod; import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetClsMethod;
import org.jetbrains.jet.plugin.libraries.DecompiledNavigationUtils;
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
import java.util.ArrayList; import java.util.ArrayList;
@@ -40,6 +38,7 @@ import java.util.List;
import static org.jetbrains.jet.lang.resolve.BindingContext.AMBIGUOUS_LABEL_TARGET; import static org.jetbrains.jet.lang.resolve.BindingContext.AMBIGUOUS_LABEL_TARGET;
import static org.jetbrains.jet.lang.resolve.BindingContext.AMBIGUOUS_REFERENCE_TARGET; import static org.jetbrains.jet.lang.resolve.BindingContext.AMBIGUOUS_REFERENCE_TARGET;
import static org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil.findDeclarationsForDescriptorWithoutTrace;
public abstract class JetPsiReference implements PsiPolyVariantReference { public abstract class JetPsiReference implements PsiPolyVariantReference {
@@ -107,7 +106,6 @@ public abstract class JetPsiReference implements PsiPolyVariantReference {
@Nullable @Nullable
protected PsiElement doResolve() { protected PsiElement doResolve() {
BindingContext context = AnalyzerFacadeWithCache.getContextForElement(myExpression); BindingContext context = AnalyzerFacadeWithCache.getContextForElement(myExpression);
List<PsiElement> psiElements = BindingContextUtils.resolveToDeclarationPsiElements(context, myExpression); List<PsiElement> psiElements = BindingContextUtils.resolveToDeclarationPsiElements(context, myExpression);
if (psiElements.size() == 1) { if (psiElements.size() == 1) {
return psiElements.iterator().next(); return psiElements.iterator().next();
@@ -116,18 +114,13 @@ public abstract class JetPsiReference implements PsiPolyVariantReference {
return null; return null;
} }
DeclarationDescriptor referencedDescriptor = context.get(BindingContext.REFERENCE_TARGET, myExpression); DeclarationDescriptor referencedDescriptor = context.get(BindingContext.REFERENCE_TARGET, myExpression);
if (referencedDescriptor != null) { if (referencedDescriptor == null) {
JetDeclaration declarationInDecompiledFile = return null;
DecompiledNavigationUtils.findDeclarationForReference(myExpression.getProject(), referencedDescriptor);
if (declarationInDecompiledFile != null) {
return declarationInDecompiledFile;
}
} }
Collection<PsiElement> stdlibSymbols = resolveStandardLibrarySymbol(context); Collection<PsiElement> elements = findDeclarationsForDescriptorWithoutTrace(myExpression.getProject(), referencedDescriptor);
if (stdlibSymbols.size() == 1) { if (elements.size() == 1) {
return stdlibSymbols.iterator().next(); return elements.iterator().next();
} }
return null; return null;
} }