Propagate lazy resolve session to getJetCallableExtensions()
This commit is contained in:
@@ -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>() {
|
||||||
|
|||||||
Reference in New Issue
Block a user