Do reference resolution with lazy resolve

This commit is contained in:
Nikolay Krasko
2013-06-10 18:40:36 +04:00
parent 2621df3243
commit 642def0133
2 changed files with 12 additions and 4 deletions
@@ -18,8 +18,11 @@ package org.jetbrains.jet.plugin.project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils;
public final class WholeProjectAnalyzerFacade {
@@ -35,4 +38,9 @@ public final class WholeProjectAnalyzerFacade {
public static ResolveSession getLazyResolveSessionForFile(@NotNull JetFile file) {
return AnalyzerFacadeWithCache.getLazyResolveSession(file);
}
public static BindingContext getContextForExpression(@NotNull JetExpression jetExpression) {
ResolveSession resolveSession = getLazyResolveSessionForFile((JetFile) jetExpression.getContainingFile());
return ResolveSessionUtils.resolveToExpression(resolveSession, jetExpression);
}
}
@@ -102,16 +102,16 @@ public abstract class JetPsiReference implements PsiPolyVariantReference {
@Nullable
protected PsiElement doResolve() {
JetFile file = (JetFile) getElement().getContainingFile();
BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(file).getBindingContext();
List<PsiElement> psiElements = BindingContextUtils.resolveToDeclarationPsiElements(bindingContext, myExpression);
BindingContext context = WholeProjectAnalyzerFacade.getContextForExpression(myExpression);
List<PsiElement> psiElements = BindingContextUtils.resolveToDeclarationPsiElements(context, myExpression);
if (psiElements.size() == 1) {
return psiElements.iterator().next();
}
if (psiElements.size() > 1) {
return null;
}
Collection<PsiElement> stdlibSymbols = resolveStandardLibrarySymbol(bindingContext);
Collection<PsiElement> stdlibSymbols = resolveStandardLibrarySymbol(context);
if (stdlibSymbols.size() == 1) {
return stdlibSymbols.iterator().next();
}