Use resolve session for checking comparability of descriptors
This commit is contained in:
@@ -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<DeclarationDescriptor> descriptors) {
|
||||
public static LookupElement[] collectLookupElements(
|
||||
@NotNull ResolveSession resolveSession,
|
||||
@NotNull BindingContext bindingContext,
|
||||
@NotNull Iterable<DeclarationDescriptor> descriptors) {
|
||||
List<LookupElement> 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()]);
|
||||
|
||||
@@ -60,7 +60,7 @@ public class JetClassCompletionContributor extends CompletionContributor {
|
||||
|
||||
final Collection<DeclarationDescriptor> 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<ClassDescriptor> 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;
|
||||
|
||||
@@ -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<String> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user