diff --git a/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java b/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java index dee80681d3d..bbc69f4f771 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.plugin.JetDescriptorIconProvider; @@ -53,11 +54,11 @@ public final class DescriptorLookupConverter { private DescriptorLookupConverter() {} @NotNull - public static LookupElement createLookupElement(@NotNull BindingContext bindingContext, + public static LookupElement createLookupElement(@NotNull ResolveSession resolveSession, @NotNull DeclarationDescriptor descriptor, @Nullable PsiElement declaration) { LookupElementBuilder element = LookupElementBuilder.create( - new JetLookupObject(descriptor, bindingContext, declaration), descriptor.getName().getName()); + new JetLookupObject(descriptor, resolveSession, declaration), descriptor.getName().getName()); String presentableText = descriptor.getName().getName(); String typeText = ""; @@ -80,14 +81,14 @@ public final class DescriptorLookupConverter { // TODO: A special case when it's impossible to resolve type parameters from arguments. Need '<' caret '>' // TODO: Support omitting brackets for one argument functions if (functionDescriptor.getValueParameters().isEmpty()) { - element = element.setInsertHandler(EMPTY_FUNCTION_HANDLER); + element = element.withInsertHandler(EMPTY_FUNCTION_HANDLER); } else { if (functionDescriptor.getValueParameters().size() == 1 && JetStandardClasses.isFunctionType(functionDescriptor.getValueParameters().get(0).getType())) { - element = element.setInsertHandler(PARAMS_BRACES_FUNCTION_HANDLER); + element = element.withInsertHandler(PARAMS_BRACES_FUNCTION_HANDLER); } else { - element = element.setInsertHandler(PARAMS_PARENTHESIS_FUNCTION_HANDLER); + element = element.withInsertHandler(PARAMS_PARENTHESIS_FUNCTION_HANDLER); } } } @@ -100,20 +101,23 @@ public final class DescriptorLookupConverter { assert declaredIn != null; tailText = " (" + DescriptorUtils.getFQName(declaredIn) + ")"; tailTextGrayed = true; - element = element.setInsertHandler(JetClassInsertHandler.INSTANCE); + element = element.withInsertHandler(JetClassInsertHandler.INSTANCE); } else { typeText = DescriptorRenderer.TEXT.render(descriptor); } - element = element.setTailText(tailText, tailTextGrayed).setTypeText(typeText).setPresentableText(presentableText); - element = element.setIcon(JetDescriptorIconProvider.getIcon(descriptor, Iconable.ICON_FLAG_VISIBILITY)); + element = element.withTailText(tailText, tailTextGrayed).withTypeText(typeText).withPresentableText(presentableText); + element = element.withIcon(JetDescriptorIconProvider.getIcon(descriptor, Iconable.ICON_FLAG_VISIBILITY)); return element; } @NotNull - public static LookupElement createLookupElement(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor descriptor) { + public static LookupElement createLookupElement( + @NotNull ResolveSession resolveSession, + @NotNull BindingContext bindingContext, + @NotNull DeclarationDescriptor descriptor) { if (descriptor instanceof CallableMemberDescriptor) { CallableMemberDescriptor callableMemberDescriptor = (CallableMemberDescriptor) descriptor; while (callableMemberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { @@ -122,14 +126,17 @@ public final class DescriptorLookupConverter { } descriptor = callableMemberDescriptor; } - return createLookupElement(bindingContext, descriptor, BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor)); + return createLookupElement(resolveSession, descriptor, BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor)); } - public static LookupElement[] collectLookupElements(BindingContext bindingContext, Iterable descriptors) { + public static LookupElement[] collectLookupElements( + @NotNull ResolveSession resolveSession, + @NotNull BindingContext bindingContext, + @NotNull Iterable descriptors) { List result = Lists.newArrayList(); for (final DeclarationDescriptor descriptor : descriptors) { - result.add(createLookupElement(bindingContext, descriptor)); + result.add(createLookupElement(resolveSession, bindingContext, descriptor)); } return result.toArray(new LookupElement[result.size()]); diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetClassCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetClassCompletionContributor.java index 29fe370a5fc..8f4eca746bd 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetClassCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetClassCompletionContributor.java @@ -60,7 +60,7 @@ public class JetClassCompletionContributor extends CompletionContributor { final Collection jetOnlyClasses = JetShortNamesCache.getJetOnlyTypes(); for (DeclarationDescriptor jetOnlyClass : jetOnlyClasses) { - consumer.consume(DescriptorLookupConverter.createLookupElement(jetContext, jetOnlyClass)); + consumer.consume(DescriptorLookupConverter.createLookupElement(resolveSession, jetContext, jetOnlyClass)); } if (!JsModuleDetector.isJsModule((JetFile)parameters.getOriginalFile())) { @@ -98,7 +98,7 @@ public class JetClassCompletionContributor extends CompletionContributor { }, resolveSession); for (ClassDescriptor descriptor : descriptors) { - consumer.consume(DescriptorLookupConverter.createLookupElement(jetContext, descriptor)); + consumer.consume(DescriptorLookupConverter.createLookupElement(resolveSession, jetContext, descriptor)); } } } @@ -121,7 +121,7 @@ public class JetClassCompletionContributor extends CompletionContributor { Collection classDescriptors = ResolveSessionUtils.getClassDescriptorsByFqName( resolveSession,((JetLightClass) aClass).getFqName()); for (ClassDescriptor descriptor : classDescriptors) { - consumer.consume(DescriptorLookupConverter.createLookupElement(context, descriptor)); + consumer.consume(DescriptorLookupConverter.createLookupElement(resolveSession, context, descriptor)); } return true; diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java index 6a5c014aa03..e29431bccea 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java @@ -184,7 +184,8 @@ public class JetCompletionContributor extends CompletionContributor { matchPrefixCondition, expression, session.resolveSession, GlobalSearchScope.allScope(position.getProject())); for (DeclarationDescriptor jetCallableExtension : jetCallableExtensions) { - result.addElement(DescriptorLookupConverter.createLookupElement(session.expressionBindingContext, jetCallableExtension)); + result.addElement(DescriptorLookupConverter.createLookupElement( + session.resolveSession, session.expressionBindingContext, jetCallableExtension)); } } @@ -214,13 +215,11 @@ public class JetCompletionContributor extends CompletionContributor { GlobalSearchScope scope = GlobalSearchScope.allScope(project); Collection functionNames = namesCache.getAllTopLevelFunctionNames(); - ResolveSession resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) position.getContainingFile()); - BindingContext resolutionContext = ResolveSessionUtils.getExpressionBindingContext(resolveSession, expression); - for (String name : functionNames) { if (name.contains(actualPrefix)) { - for (FunctionDescriptor function : namesCache.getTopLevelFunctionDescriptorsByName(name, expression, resolveSession, scope)) { - addCompletionToResult(result, DescriptorLookupConverter.createLookupElement(resolutionContext, function), session); + for (FunctionDescriptor function : namesCache.getTopLevelFunctionDescriptorsByName(name, expression, session.resolveSession, scope)) { + addCompletionToResult(result, DescriptorLookupConverter.createLookupElement( + session.resolveSession, session.expressionBindingContext, function), session); } } } @@ -342,6 +341,7 @@ public class JetCompletionContributor extends CompletionContributor { if (descriptor instanceof DeclarationDescriptorWithVisibility) { if (session.inDescriptor != null) { + //noinspection ConstantConditions return Visibilities.isVisible((DeclarationDescriptorWithVisibility)descriptor, session.inDescriptor); } } @@ -368,6 +368,6 @@ public class JetCompletionContributor extends CompletionContributor { } }); - return DescriptorLookupConverter.collectLookupElements(session.expressionBindingContext, checkedDescriptors); + return DescriptorLookupConverter.collectLookupElements(session.resolveSession, session.expressionBindingContext, checkedDescriptors); } } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetLookupObject.java b/idea/src/org/jetbrains/jet/plugin/completion/JetLookupObject.java index bb426044c8e..59ceaa59d5a 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetLookupObject.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetLookupObject.java @@ -16,11 +16,12 @@ package org.jetbrains.jet.plugin.completion; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.resolve.DescriptorRenderer; /** @@ -30,18 +31,20 @@ import org.jetbrains.jet.resolve.DescriptorRenderer; * @author Nikolay Krasko */ public final class JetLookupObject { + private static final Logger LOG = Logger.getInstance("#" + JetLookupObject.class.getName()); + @Nullable private final DeclarationDescriptor descriptor; @Nullable - private BindingContext context; + private ResolveSession resolveSession; @Nullable private final PsiElement psiElement; - public JetLookupObject(@Nullable DeclarationDescriptor descriptor, @NotNull BindingContext context, @Nullable PsiElement psiElement) { + public JetLookupObject(@Nullable DeclarationDescriptor descriptor, @NotNull ResolveSession resolveSession, @Nullable PsiElement psiElement) { this.descriptor = descriptor; - this.context = context; + this.resolveSession = resolveSession; this.psiElement = psiElement; } @@ -78,12 +81,14 @@ public final class JetLookupObject { // Same descriptor - same lookup element if (descriptor != null && other.descriptor != null) { - if (context == other.context) { + if (resolveSession == other.resolveSession) { if (descriptor.equals(other.descriptor)) { return true; } } else { + LOG.warn("Descriptors from different resolve sessions"); + String descriptorText = DescriptorRenderer.TEXT.render(descriptor); @SuppressWarnings("ConstantConditions") String otherDescriptorText = DescriptorRenderer.TEXT.render(other.descriptor); diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java index 144c89ec9a0..64486a4491d 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java @@ -28,6 +28,8 @@ import org.jetbrains.jet.cli.jvm.compiler.TipsManager; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespaceHeader; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils; import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade; import org.jetbrains.jet.plugin.references.JetSimpleNameReference; @@ -71,11 +73,13 @@ public class JetPackagesContributor extends CompletionContributor { int prefixLength = parameters.getOffset() - simpleNameReference.getExpression().getTextOffset(); result = result.withPrefixMatcher(new PlainPrefixMatcher(name.substring(0, prefixLength))); - BindingContext bindingContext = WholeProjectAnalyzerFacade.getLazyResolveContext( - (JetFile) namespaceHeader.getContainingFile(), simpleNameReference.getExpression()); + ResolveSession resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile( + (JetFile) simpleNameReference.getExpression().getContainingFile()); + BindingContext bindingContext = ResolveSessionUtils.getExpressionBindingContext( + resolveSession, simpleNameReference.getExpression()); for (LookupElement variant : DescriptorLookupConverter.collectLookupElements( - bindingContext, TipsManager.getPackageReferenceVariants(simpleNameReference.getExpression(), bindingContext))) { + resolveSession, bindingContext, TipsManager.getPackageReferenceVariants(simpleNameReference.getExpression(), bindingContext))) { if (!variant.getLookupString().contains(DUMMY_IDENTIFIER)) { result.addElement(variant); } diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java index 6be592e32e9..8e999bf912d 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java @@ -25,6 +25,8 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils; import org.jetbrains.jet.plugin.completion.DescriptorLookupConverter; import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade; @@ -61,12 +63,11 @@ public class JetSimpleNameReference extends JetPsiReference { @NotNull @Override public Object[] getVariants() { - BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile( - (JetFile) myExpression.getContainingFile()) - .getBindingContext(); + ResolveSession resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) getExpression().getContainingFile()); + BindingContext bindingContext = ResolveSessionUtils.getExpressionBindingContext(resolveSession, getExpression()); return DescriptorLookupConverter.collectLookupElements( - bindingContext, TipsManager.getReferenceVariants(myExpression, bindingContext)); + resolveSession, bindingContext, TipsManager.getReferenceVariants(myExpression, bindingContext)); } @Override