stdlib reference might be multi

(for fake reference defined in several super traits)
This commit is contained in:
Svetlana Isakova
2012-09-05 14:53:39 +04:00
parent e622be8a2d
commit f8d341cb13
2 changed files with 31 additions and 20 deletions
@@ -103,19 +103,19 @@ public abstract class JetPsiReference implements PsiPolyVariantReference {
protected PsiElement doResolve() { protected PsiElement doResolve() {
JetFile file = (JetFile) getElement().getContainingFile(); JetFile file = (JetFile) getElement().getContainingFile();
BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(file).getBindingContext(); BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(file).getBindingContext();
List<PsiElement> psiElement = BindingContextUtils.resolveToDeclarationPsiElements(bindingContext, myExpression); List<PsiElement> psiElements = BindingContextUtils.resolveToDeclarationPsiElements(bindingContext, myExpression);
if (psiElement.size() == 1) { if (psiElements.size() == 1) {
return psiElement.iterator().next(); return psiElements.iterator().next();
} }
if (psiElement.size() > 1) { if (psiElements.size() > 1) {
return null; return null;
} }
if (psiElement.isEmpty()) { List<PsiElement> stdlibSymbols = resolveStandardLibrarySymbol(bindingContext);
PsiElement stdlibSymbol = myExpression.getProject().getComponent(StandardLibraryReferenceResolver.class) if (stdlibSymbols.size() == 1) {
.resolveStandardLibrarySymbol(bindingContext, myExpression); return stdlibSymbols.iterator().next();
if (stdlibSymbol != null) { }
return stdlibSymbol; if (stdlibSymbols.size() > 1) {
} return null;
} }
Collection<? extends DeclarationDescriptor> declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression); Collection<? extends DeclarationDescriptor> declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression);
if (declarationDescriptors != null) return null; if (declarationDescriptors != null) return null;
@@ -129,9 +129,15 @@ public abstract class JetPsiReference implements PsiPolyVariantReference {
BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(file) BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(file)
.getBindingContext(); .getBindingContext();
Collection<? extends DeclarationDescriptor> declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression); Collection<? extends DeclarationDescriptor> declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression);
if (declarationDescriptors == null) return ResolveResult.EMPTY_ARRAY; if (declarationDescriptors == null) {
List<PsiElement> standardLibraryElements = resolveStandardLibrarySymbol(bindingContext);
if (!standardLibraryElements.isEmpty()) {
return PsiElementResolveResult.createResults(standardLibraryElements);
}
return ResolveResult.EMPTY_ARRAY;
}
ArrayList<ResolveResult> results = new ArrayList<ResolveResult>(declarationDescriptors.size()); List<ResolveResult> results = new ArrayList<ResolveResult>(declarationDescriptors.size());
for (DeclarationDescriptor descriptor : declarationDescriptors) { for (DeclarationDescriptor descriptor : declarationDescriptors) {
List<PsiElement> elements = BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor); List<PsiElement> elements = BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor);
@@ -149,4 +155,9 @@ public abstract class JetPsiReference implements PsiPolyVariantReference {
return results.toArray(new ResolveResult[results.size()]); return results.toArray(new ResolveResult[results.size()]);
} }
private List<PsiElement> resolveStandardLibrarySymbol(@NotNull BindingContext bindingContext) {
return myExpression.getProject().getComponent(StandardLibraryReferenceResolver.class)
.resolveStandardLibrarySymbol(bindingContext, myExpression);
}
} }
@@ -157,26 +157,26 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent {
} }
} }
@Nullable @NotNull
public PsiElement resolveStandardLibrarySymbol(@NotNull BindingContext originalContext, public List<PsiElement> resolveStandardLibrarySymbol(@NotNull BindingContext originalContext,
@Nullable JetReferenceExpression referenceExpression) { @Nullable JetReferenceExpression referenceExpression) {
ensureInitialized(); ensureInitialized();
DeclarationDescriptor declarationDescriptor = originalContext.get(BindingContext.REFERENCE_TARGET, referenceExpression); DeclarationDescriptor declarationDescriptor = originalContext.get(BindingContext.REFERENCE_TARGET, referenceExpression);
return declarationDescriptor != null ? resolveStandardLibrarySymbol(declarationDescriptor) : null; return declarationDescriptor != null ? resolveStandardLibrarySymbol(declarationDescriptor) : Collections.<PsiElement>emptyList();
} }
@Nullable @NotNull
public PsiElement resolveStandardLibrarySymbol(@NotNull DeclarationDescriptor declarationDescriptor) { public List<PsiElement> resolveStandardLibrarySymbol(@NotNull DeclarationDescriptor declarationDescriptor) {
ensureInitialized(); ensureInitialized();
DeclarationDescriptor descriptor = declarationDescriptor; DeclarationDescriptor descriptor = declarationDescriptor;
descriptor = descriptor.getOriginal(); descriptor = descriptor.getOriginal();
descriptor = findCurrentDescriptor(descriptor); descriptor = findCurrentDescriptor(descriptor);
if (descriptor != null) { if (descriptor != null) {
return BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor); return BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor);
} }
return null; return Collections.emptyList();
} }
@Nullable @Nullable