stdlib reference might be multi
(for fake reference defined in several super traits)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user