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( public Collection<DeclarationDescriptor> getJetCallableExtensions(
@NotNull Condition<String> acceptedNameCondition, @NotNull Condition<String> acceptedNameCondition,
@NotNull JetSimpleNameExpression expression, @NotNull JetSimpleNameExpression expression,
@NotNull ResolveSession resolveSession,
@NotNull GlobalSearchScope searchScope @NotNull GlobalSearchScope searchScope
) { ) {
Collection<DeclarationDescriptor> resultDescriptors = new ArrayList<DeclarationDescriptor>(); Collection<DeclarationDescriptor> resultDescriptors = new ArrayList<DeclarationDescriptor>();
JetFile jetFile = (JetFile) expression.getContainingFile(); BindingContext context = LazyBindingContextUtils.getExpressionBindingContext(resolveSession, expression);
BindingContext context = WholeProjectAnalyzerFacade.getLazyResolveContext(jetFile, expression);
JetExpression receiverExpression = expression.getReceiverExpression(); JetExpression receiverExpression = expression.getReceiverExpression();
if (receiverExpression != null) { if (receiverExpression != null) {
@@ -55,6 +55,8 @@ public class JetCompletionContributor extends CompletionContributor {
private static class CompletionSession { private static class CompletionSession {
public boolean isSomethingAdded = false; public boolean isSomethingAdded = false;
public int customInvocationCount = 0; public int customInvocationCount = 0;
public ResolveSession resolveSession = null;
public BindingContext expressionBindingContext = null;
@Nullable @Nullable
public DeclarationDescriptor inDescriptor = null; public DeclarationDescriptor inDescriptor = null;
@@ -79,18 +81,25 @@ public class JetCompletionContributor extends CompletionContributor {
JetSimpleNameReference jetReference = getJetReference(parameters); JetSimpleNameReference jetReference = getJetReference(parameters);
if (jetReference != null) { if (jetReference != null) {
BindingContext jetContext = WholeProjectAnalyzerFacade.getLazyResolveContext( session.resolveSession =
(JetFile) position.getContainingFile(), jetReference.getExpression()); 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; 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) { if (!session.isSomethingAdded && session.customInvocationCount == 0) {
// Rerun completion if nothing was found // Rerun completion if nothing was found
session.customInvocationCount = 1; 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 CompletionResultSet result,
@NotNull PsiElement position, @NotNull PsiElement position,
@NotNull JetSimpleNameReference jetReference, @NotNull JetSimpleNameReference jetReference,
@NotNull CompletionSession session, @NotNull CompletionSession session) {
BindingContext jetContext) {
if (isOnlyKeywordCompletion(position)) { if (isOnlyKeywordCompletion(position)) {
return; return;
} }
if (shouldRunTypeCompletionOnly(position, jetReference)) { if (shouldRunTypeCompletionOnly(position, jetReference)) {
if (session.customInvocationCount > 0) { if (session.customInvocationCount > 0) {
addClasses(parameters, result, session, jetContext); addClasses(parameters, result, session);
} }
else { else {
for (LookupElement variant : getReferenceVariants(jetReference, result, session, jetContext)) { for (LookupElement variant : getReferenceVariants(jetReference, result, session)) {
if (isTypeDeclaration(variant)) { if (isTypeDeclaration(variant)) {
addCheckedCompletionToResult(result, variant, session); addCheckedCompletionToResult(result, variant, session);
} }
@@ -126,7 +134,7 @@ public class JetCompletionContributor extends CompletionContributor {
return; return;
} }
for (LookupElement variant : getReferenceVariants(jetReference, result, session, jetContext)) { for (LookupElement variant : getReferenceVariants(jetReference, result, session)) {
addCheckedCompletionToResult(result, variant, session); addCheckedCompletionToResult(result, variant, session);
} }
@@ -144,12 +152,12 @@ public class JetCompletionContributor extends CompletionContributor {
} }
if (shouldRunTopLevelCompletion(parameters, session)) { if (shouldRunTopLevelCompletion(parameters, session)) {
addClasses(parameters, result, session, jetContext); addClasses(parameters, result, session);
addJetTopLevelFunctions(jetReference.getExpression(), result, position, session); addJetTopLevelFunctions(jetReference.getExpression(), result, position, session);
} }
if (shouldRunExtensionsCompletion(parameters, prefix, 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; 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(); final PrefixMatcher prefixMatcher = result.getPrefixMatcher();
JetShortNamesCache namesCache = JetCacheManager.getInstance(position.getProject()).getNamesCache(); JetShortNamesCache namesCache = JetCacheManager.getInstance(position.getProject()).getNamesCache();
Condition<String> matchPrefixCondition = new Condition<String>() { Condition<String> matchPrefixCondition = new Condition<String>() {
@@ -168,13 +181,10 @@ public class JetCompletionContributor extends CompletionContributor {
}; };
Collection<DeclarationDescriptor> jetCallableExtensions = namesCache.getJetCallableExtensions( Collection<DeclarationDescriptor> jetCallableExtensions = namesCache.getJetCallableExtensions(
matchPrefixCondition, expression, GlobalSearchScope.allScope(position.getProject())); matchPrefixCondition, expression, session.resolveSession, GlobalSearchScope.allScope(position.getProject()));
BindingContext context = WholeProjectAnalyzerFacade.getLazyResolveContext(
(JetFile) position.getContainingFile(), expression);
for (DeclarationDescriptor jetCallableExtension : jetCallableExtensions) { 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( private static void addClasses(
@NotNull CompletionParameters parameters, @NotNull CompletionParameters parameters,
@NotNull final CompletionResultSet result, @NotNull final CompletionResultSet result,
@NotNull final CompletionSession session, @NotNull final CompletionSession session) {
BindingContext jetContext) { JetClassCompletionContributor.addClasses(parameters, result, session.expressionBindingContext, new Consumer<LookupElement>() {
JetClassCompletionContributor.addClasses(parameters, result, jetContext, new Consumer<LookupElement>() {
@Override @Override
public void consume(@NotNull LookupElement element) { public void consume(@NotNull LookupElement element) {
addCompletionToResult(result, element, session); addCompletionToResult(result, element, session);
@@ -342,10 +351,9 @@ public class JetCompletionContributor extends CompletionContributor {
private static LookupElement[] getReferenceVariants( private static LookupElement[] getReferenceVariants(
@NotNull JetSimpleNameReference reference, @NotNull JetSimpleNameReference reference,
@NotNull final CompletionResultSet result, @NotNull final CompletionResultSet result,
@NotNull final CompletionSession session, @NotNull final CompletionSession session
BindingContext jetContext
) { ) {
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>() { Collection<DeclarationDescriptor> checkedDescriptors = Collections2.filter(descriptors, new Predicate<DeclarationDescriptor>() {
@Override @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.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath; 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.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.actions.JetAddImportAction; import org.jetbrains.jet.plugin.actions.JetAddImportAction;
@@ -92,10 +93,12 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
assert referenceName != null; assert referenceName != null;
ResolveSession resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) element.getContainingFile());
List<FqName> result = Lists.newArrayList(); List<FqName> result = Lists.newArrayList();
result.addAll(getClassNames(referenceName, (JetFile) file)); result.addAll(getClassNames(referenceName, (JetFile) file));
result.addAll(getJetTopLevelFunctions(referenceName, element, file.getProject())); result.addAll(getJetTopLevelFunctions(referenceName, element, resolveSession, file.getProject()));
result.addAll(getJetExtensionFunctions(referenceName, element, file.getProject())); result.addAll(getJetExtensionFunctions(referenceName, element, resolveSession, file.getProject()));
return Collections2.filter(result, new Predicate<FqName>() { return Collections2.filter(result, new Predicate<FqName>() {
@Override @Override
@@ -106,16 +109,16 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
}); });
} }
private static Collection<FqName> getJetTopLevelFunctions(@NotNull String referenceName, private static Collection<FqName> getJetTopLevelFunctions(
JetSimpleNameExpression expression, @NotNull String referenceName,
@NotNull Project project) { @NotNull JetSimpleNameExpression expression,
@NotNull ResolveSession resolveSession,
@NotNull Project project
) {
JetShortNamesCache namesCache = JetCacheManager.getInstance(project).getNamesCache(); JetShortNamesCache namesCache = JetCacheManager.getInstance(project).getNamesCache();
Collection<FunctionDescriptor> topLevelFunctions = namesCache.getTopLevelFunctionDescriptorsByName( Collection<FunctionDescriptor> topLevelFunctions = namesCache.getTopLevelFunctionDescriptorsByName(
referenceName, referenceName, expression, resolveSession, GlobalSearchScope.allScope(project));
expression,
WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) expression.getContainingFile()),
GlobalSearchScope.allScope(project));
return Sets.newHashSet(Collections2.transform(topLevelFunctions, new Function<DeclarationDescriptor, FqName>() { return Sets.newHashSet(Collections2.transform(topLevelFunctions, new Function<DeclarationDescriptor, FqName>() {
@Override @Override
@@ -129,6 +132,7 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
private static Collection<FqName> getJetExtensionFunctions( private static Collection<FqName> getJetExtensionFunctions(
@NotNull final String referenceName, @NotNull final String referenceName,
@NotNull JetSimpleNameExpression expression, @NotNull JetSimpleNameExpression expression,
@NotNull ResolveSession resolveSession,
@NotNull Project project @NotNull Project project
) { ) {
JetShortNamesCache namesCache = JetCacheManager.getInstance(project).getNamesCache(); JetShortNamesCache namesCache = JetCacheManager.getInstance(project).getNamesCache();
@@ -140,6 +144,7 @@ public class ImportClassAndFunFix extends JetHintAction<JetSimpleNameExpression>
} }
}, },
expression, expression,
resolveSession,
GlobalSearchScope.allScope(project)); GlobalSearchScope.allScope(project));
return Sets.newHashSet(Collections2.transform(jetCallableExtensions, new Function<DeclarationDescriptor, FqName>() { return Sets.newHashSet(Collections2.transform(jetCallableExtensions, new Function<DeclarationDescriptor, FqName>() {