From f8d341cb13ff4b7fe2aab4c579ef9ca5b840bde2 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 5 Sep 2012 14:53:39 +0400 Subject: [PATCH] stdlib reference might be multi (for fake reference defined in several super traits) --- .../plugin/references/JetPsiReference.java | 37 ++++++++++++------- .../StandardLibraryReferenceResolver.java | 14 +++---- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java index a4bfbabd7df..c7120a1e635 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java @@ -103,19 +103,19 @@ public abstract class JetPsiReference implements PsiPolyVariantReference { protected PsiElement doResolve() { JetFile file = (JetFile) getElement().getContainingFile(); BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(file).getBindingContext(); - List psiElement = BindingContextUtils.resolveToDeclarationPsiElements(bindingContext, myExpression); - if (psiElement.size() == 1) { - return psiElement.iterator().next(); + List psiElements = BindingContextUtils.resolveToDeclarationPsiElements(bindingContext, myExpression); + if (psiElements.size() == 1) { + return psiElements.iterator().next(); } - if (psiElement.size() > 1) { + if (psiElements.size() > 1) { return null; } - if (psiElement.isEmpty()) { - PsiElement stdlibSymbol = myExpression.getProject().getComponent(StandardLibraryReferenceResolver.class) - .resolveStandardLibrarySymbol(bindingContext, myExpression); - if (stdlibSymbol != null) { - return stdlibSymbol; - } + List stdlibSymbols = resolveStandardLibrarySymbol(bindingContext); + if (stdlibSymbols.size() == 1) { + return stdlibSymbols.iterator().next(); + } + if (stdlibSymbols.size() > 1) { + return null; } Collection declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression); if (declarationDescriptors != null) return null; @@ -129,10 +129,16 @@ public abstract class JetPsiReference implements PsiPolyVariantReference { BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(file) .getBindingContext(); Collection declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression); - if (declarationDescriptors == null) return ResolveResult.EMPTY_ARRAY; + if (declarationDescriptors == null) { + List standardLibraryElements = resolveStandardLibrarySymbol(bindingContext); + if (!standardLibraryElements.isEmpty()) { + return PsiElementResolveResult.createResults(standardLibraryElements); + } + return ResolveResult.EMPTY_ARRAY; + } + + List results = new ArrayList(declarationDescriptors.size()); - ArrayList results = new ArrayList(declarationDescriptors.size()); - for (DeclarationDescriptor descriptor : declarationDescriptors) { List elements = BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor); if (elements.isEmpty()) { @@ -149,4 +155,9 @@ public abstract class JetPsiReference implements PsiPolyVariantReference { return results.toArray(new ResolveResult[results.size()]); } + + private List resolveStandardLibrarySymbol(@NotNull BindingContext bindingContext) { + return myExpression.getProject().getComponent(StandardLibraryReferenceResolver.class) + .resolveStandardLibrarySymbol(bindingContext, myExpression); + } } diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 461fcf24780..39810eb235f 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -157,26 +157,26 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { } } - @Nullable - public PsiElement resolveStandardLibrarySymbol(@NotNull BindingContext originalContext, + @NotNull + public List resolveStandardLibrarySymbol(@NotNull BindingContext originalContext, @Nullable JetReferenceExpression referenceExpression) { ensureInitialized(); DeclarationDescriptor declarationDescriptor = originalContext.get(BindingContext.REFERENCE_TARGET, referenceExpression); - return declarationDescriptor != null ? resolveStandardLibrarySymbol(declarationDescriptor) : null; + return declarationDescriptor != null ? resolveStandardLibrarySymbol(declarationDescriptor) : Collections.emptyList(); } - @Nullable - public PsiElement resolveStandardLibrarySymbol(@NotNull DeclarationDescriptor declarationDescriptor) { + @NotNull + public List resolveStandardLibrarySymbol(@NotNull DeclarationDescriptor declarationDescriptor) { ensureInitialized(); DeclarationDescriptor descriptor = declarationDescriptor; descriptor = descriptor.getOriginal(); descriptor = findCurrentDescriptor(descriptor); if (descriptor != null) { - return BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor); + return BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor); } - return null; + return Collections.emptyList(); } @Nullable