Propagate lazy resolve session to getJetCallableExtensions()

This commit is contained in:
Nikolay Krasko
2012-08-14 16:19:41 +04:00
parent b5b72f93dc
commit b722e85c2b
3 changed files with 49 additions and 37 deletions
@@ -234,13 +234,12 @@ public class JetShortNamesCache extends PsiShortNamesCache {
public Collection<DeclarationDescriptor> getJetCallableExtensions(
@NotNull Condition<String> acceptedNameCondition,
@NotNull JetSimpleNameExpression expression,
@NotNull ResolveSession resolveSession,
@NotNull GlobalSearchScope searchScope
) {
Collection<DeclarationDescriptor> resultDescriptors = new ArrayList<DeclarationDescriptor>();
JetFile jetFile = (JetFile) expression.getContainingFile();
BindingContext context = WholeProjectAnalyzerFacade.getLazyResolveContext(jetFile, expression);
BindingContext context = LazyBindingContextUtils.getExpressionBindingContext(resolveSession, expression);
JetExpression receiverExpression = expression.getReceiverExpression();
if (receiverExpression != null) {
@@ -55,6 +55,8 @@ public class JetCompletionContributor extends CompletionContributor {
private static class CompletionSession {
public boolean isSomethingAdded = false;
public int customInvocationCount = 0;
public ResolveSession resolveSession = null;
public BindingContext expressionBindingContext = null;
@Nullable
public DeclarationDescriptor inDescriptor = null;
@@ -79,18 +81,25 @@ public class JetCompletionContributor extends CompletionContributor {
JetSimpleNameReference jetReference = getJetReference(parameters);
if (jetReference != null) {
BindingContext jetContext = WholeProjectAnalyzerFacade.getLazyResolveContext(
(JetFile) position.getContainingFile(), jetReference.getExpression());
session.resolveSession =
WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) position.getContainingFile());
JetScope scope = jetContext.get(BindingContext.RESOLUTION_SCOPE, jetReference.getExpression());
session.expressionBindingContext = LazyBindingContextUtils.getExpressionBindingContext(
session.resolveSession, jetReference.getExpression());
JetScope scope = session.expressionBindingContext.get(BindingContext.RESOLUTION_SCOPE, jetReference.getExpression());
session.inDescriptor = scope != null ? scope.getContainingDeclaration() : null;
completeForReference(parameters, result, position, jetReference, session, jetContext);
completeForReference(parameters, result, position, jetReference, session);
if (!session.isSomethingAdded && session.customInvocationCount == 0) {
// Rerun completion if nothing was found
session.customInvocationCount = 1;
completeForReference(parameters, result, position, jetReference, session, jetContext);
session.resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) position.getContainingFile());
session.expressionBindingContext = LazyBindingContextUtils.getExpressionBindingContext(
session.resolveSession, jetReference.getExpression());
completeForReference(parameters, result, position, jetReference, session);
}
}
@@ -105,18 +114,17 @@ public class JetCompletionContributor extends CompletionContributor {
@NotNull CompletionResultSet result,
@NotNull PsiElement position,
@NotNull JetSimpleNameReference jetReference,
@NotNull CompletionSession session,
BindingContext jetContext) {
@NotNull CompletionSession session) {
if (isOnlyKeywordCompletion(position)) {
return;
}
if (shouldRunTypeCompletionOnly(position, jetReference)) {
if (session.customInvocationCount > 0) {
addClasses(parameters, result, session, jetContext);
addClasses(parameters, result, session);
}
else {
for (LookupElement variant : getReferenceVariants(jetReference, result, session, jetContext)) {
for (LookupElement variant : getReferenceVariants(jetReference, result, session)) {
if (isTypeDeclaration(variant)) {
addCheckedCompletionToResult(result, variant, session);
}
@@ -126,7 +134,7 @@ public class JetCompletionContributor extends CompletionContributor {
return;
}
for (LookupElement variant : getReferenceVariants(jetReference, result, session, jetContext)) {
for (LookupElement variant : getReferenceVariants(jetReference, result, session)) {
addCheckedCompletionToResult(result, variant, session);
}
@@ -144,12 +152,12 @@ public class JetCompletionContributor extends CompletionContributor {
}
if (shouldRunTopLevelCompletion(parameters, session)) {
addClasses(parameters, result, session, jetContext);
addClasses(parameters, result, session);
addJetTopLevelFunctions(jetReference.getExpression(), result, position, session);
}
if (shouldRunExtensionsCompletion(parameters, prefix, session)) {
addJetExtensions(jetReference.getExpression(), result, position);
addJetExtensions(jetReference.getExpression(), result, position, session);
}
}
@@ -157,7 +165,12 @@ public class JetCompletionContributor extends CompletionContributor {
return PsiTreeUtil.getParentOfType(position, JetModifierList.class) != null;
}
private static void addJetExtensions(@NotNull JetSimpleNameExpression expression, @NotNull CompletionResultSet result, @NotNull PsiElement position) {
private static void addJetExtensions(
@NotNull JetSimpleNameExpression expression,
@NotNull CompletionResultSet result,
@NotNull PsiElement position,
@NotNull CompletionSession session
) {
final PrefixMatcher prefixMatcher = result.getPrefixMatcher();
JetShortNamesCache namesCache = JetCacheManager.getInstance(position.getProject()).getNamesCache();
Condition<String> matchPrefixCondition = new Condition<String>() {
@@ -168,13 +181,10 @@ public class JetCompletionContributor extends CompletionContributor {
};
Collection<DeclarationDescriptor> jetCallableExtensions = namesCache.getJetCallableExtensions(
matchPrefixCondition, expression, GlobalSearchScope.allScope(position.getProject()));
BindingContext context = WholeProjectAnalyzerFacade.getLazyResolveContext(
(JetFile) position.getContainingFile(), expression);
matchPrefixCondition, expression, session.resolveSession, GlobalSearchScope.allScope(position.getProject()));
for (DeclarationDescriptor jetCallableExtension : jetCallableExtensions) {
result.addElement(DescriptorLookupConverter.createLookupElement(context, jetCallableExtension));
result.addElement(DescriptorLookupConverter.createLookupElement(session.expressionBindingContext, jetCallableExtension));
}
}
@@ -222,9 +232,8 @@ public class JetCompletionContributor extends CompletionContributor {
private static void addClasses(
@NotNull CompletionParameters parameters,
@NotNull final CompletionResultSet result,
@NotNull final CompletionSession session,
BindingContext jetContext) {
JetClassCompletionContributor.addClasses(parameters, result, jetContext, new Consumer<LookupElement>() {
@NotNull final CompletionSession session) {
JetClassCompletionContributor.addClasses(parameters, result, session.expressionBindingContext, new Consumer<LookupElement>() {
@Override
public void consume(@NotNull LookupElement element) {
addCompletionToResult(result, element, session);
@@ -342,10 +351,9 @@ public class JetCompletionContributor extends CompletionContributor {
private static LookupElement[] getReferenceVariants(
@NotNull JetSimpleNameReference reference,
@NotNull final CompletionResultSet result,
@NotNull final CompletionSession session,
BindingContext jetContext
@NotNull final CompletionSession session
) {
Collection<DeclarationDescriptor> descriptors = TipsManager.getReferenceVariants(reference.getExpression(), jetContext);
Collection<DeclarationDescriptor> descriptors = TipsManager.getReferenceVariants(reference.getExpression(), session.expressionBindingContext);
Collection<DeclarationDescriptor> checkedDescriptors = Collections2.filter(descriptors, new Predicate<DeclarationDescriptor>() {
@Override
@@ -358,6 +366,6 @@ public class JetCompletionContributor extends CompletionContributor {
}
});
return DescriptorLookupConverter.collectLookupElements(jetContext, checkedDescriptors);
return DescriptorLookupConverter.collectLookupElements(session.expressionBindingContext, checkedDescriptors);
}
}
@@ -50,6 +50,7 @@ import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.actions.JetAddImportAction;
@@ -92,10 +93,12 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
assert referenceName != null;
ResolveSession resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) element.getContainingFile());
List<FqName> result = Lists.newArrayList();
result.addAll(getClassNames(referenceName, (JetFile) file));
result.addAll(getJetTopLevelFunctions(referenceName, element, file.getProject()));
result.addAll(getJetExtensionFunctions(referenceName, element, file.getProject()));
result.addAll(getJetTopLevelFunctions(referenceName, element, resolveSession, file.getProject()));
result.addAll(getJetExtensionFunctions(referenceName, element, resolveSession, file.getProject()));
return Collections2.filter(result, new Predicate<FqName>() {
@Override
@@ -106,16 +109,16 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
});
}
private static Collection<FqName> getJetTopLevelFunctions(@NotNull String referenceName,
JetSimpleNameExpression expression,
@NotNull Project project) {
private static Collection<FqName> getJetTopLevelFunctions(
@NotNull String referenceName,
@NotNull JetSimpleNameExpression expression,
@NotNull ResolveSession resolveSession,
@NotNull Project project
) {
JetShortNamesCache namesCache = JetCacheManager.getInstance(project).getNamesCache();
Collection<FunctionDescriptor> topLevelFunctions = namesCache.getTopLevelFunctionDescriptorsByName(
referenceName,
expression,
WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) expression.getContainingFile()),
GlobalSearchScope.allScope(project));
referenceName, expression, resolveSession, GlobalSearchScope.allScope(project));
return Sets.newHashSet(Collections2.transform(topLevelFunctions, new Function<DeclarationDescriptor, FqName>() {
@Override
@@ -129,6 +132,7 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
private static Collection<FqName> getJetExtensionFunctions(
@NotNull final String referenceName,
@NotNull JetSimpleNameExpression expression,
@NotNull ResolveSession resolveSession,
@NotNull Project project
) {
JetShortNamesCache namesCache = JetCacheManager.getInstance(project).getNamesCache();
@@ -140,6 +144,7 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
}
},
expression,
resolveSession,
GlobalSearchScope.allScope(project));
return Sets.newHashSet(Collections2.transform(jetCallableExtensions, new Function<DeclarationDescriptor, FqName>() {