From b722e85c2b56951eef1eabf5a71010d31a1710c3 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 14 Aug 2012 16:19:41 +0400 Subject: [PATCH] Propagate lazy resolve session to getJetCallableExtensions() --- .../jet/plugin/caches/JetShortNamesCache.java | 5 +- .../completion/JetCompletionContributor.java | 58 +++++++++++-------- .../plugin/quickfix/ImportClassAndFunFix.java | 23 +++++--- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java b/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java index 997f9f094c1..d27db8e10ad 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java @@ -234,13 +234,12 @@ public class JetShortNamesCache extends PsiShortNamesCache { public Collection getJetCallableExtensions( @NotNull Condition acceptedNameCondition, @NotNull JetSimpleNameExpression expression, + @NotNull ResolveSession resolveSession, @NotNull GlobalSearchScope searchScope ) { Collection resultDescriptors = new ArrayList(); - JetFile jetFile = (JetFile) expression.getContainingFile(); - - BindingContext context = WholeProjectAnalyzerFacade.getLazyResolveContext(jetFile, expression); + BindingContext context = LazyBindingContextUtils.getExpressionBindingContext(resolveSession, expression); JetExpression receiverExpression = expression.getReceiverExpression(); if (receiverExpression != null) { diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java index 6653bd1fd18..a193571eee3 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java @@ -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 matchPrefixCondition = new Condition() { @@ -168,13 +181,10 @@ public class JetCompletionContributor extends CompletionContributor { }; Collection 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() { + @NotNull final CompletionSession session) { + JetClassCompletionContributor.addClasses(parameters, result, session.expressionBindingContext, new Consumer() { @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 descriptors = TipsManager.getReferenceVariants(reference.getExpression(), jetContext); + Collection descriptors = TipsManager.getReferenceVariants(reference.getExpression(), session.expressionBindingContext); Collection checkedDescriptors = Collections2.filter(descriptors, new Predicate() { @Override @@ -358,6 +366,6 @@ public class JetCompletionContributor extends CompletionContributor { } }); - return DescriptorLookupConverter.collectLookupElements(jetContext, checkedDescriptors); + return DescriptorLookupConverter.collectLookupElements(session.expressionBindingContext, checkedDescriptors); } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java index 01bb8193002..d2d12e4fb97 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java @@ -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 assert referenceName != null; + ResolveSession resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) element.getContainingFile()); + List 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() { @Override @@ -106,16 +109,16 @@ public class ImportClassAndFunFix extends JetHintAction }); } - private static Collection getJetTopLevelFunctions(@NotNull String referenceName, - JetSimpleNameExpression expression, - @NotNull Project project) { + private static Collection getJetTopLevelFunctions( + @NotNull String referenceName, + @NotNull JetSimpleNameExpression expression, + @NotNull ResolveSession resolveSession, + @NotNull Project project + ) { JetShortNamesCache namesCache = JetCacheManager.getInstance(project).getNamesCache(); Collection 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() { @Override @@ -129,6 +132,7 @@ public class ImportClassAndFunFix extends JetHintAction private static Collection 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 } }, expression, + resolveSession, GlobalSearchScope.allScope(project)); return Sets.newHashSet(Collections2.transform(jetCallableExtensions, new Function() {