Services for completion

This commit is contained in:
Andrey Breslav
2011-06-15 19:29:51 +04:00
parent 46208ad14f
commit 0210a495c3
5 changed files with 41 additions and 22 deletions
@@ -15,6 +15,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.parsing.JetExpressionParsing; import org.jetbrains.jet.lang.parsing.JetExpressionParsing;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.JetScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.resolve.DescriptorRenderer; import org.jetbrains.jet.resolve.DescriptorRenderer;
@@ -89,25 +90,15 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file); BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
final JetType expressionType = bindingContext.getExpressionType(receiverExpression); final JetType expressionType = bindingContext.getExpressionType(receiverExpression);
if (expressionType != null) { if (expressionType != null) {
List<LookupElement> result = Lists.newArrayList(); return collectLookupElements(expressionType.getMemberScope());
for (final DeclarationDescriptor descriptor : expressionType.getMemberScope().getAllDescriptors()) { }
result.add( }
new LookupElement() { else {
@NotNull JetFile file = (JetFile) getContainingFile();
@Override BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
public String getLookupString() { JetScope resolutionScope = bindingContext.getResolutionScope(JetSimpleNameExpression.this);
return descriptor.getName(); if (resolutionScope != null) {
} return collectLookupElements(resolutionScope);
@Override
public void renderElement(LookupElementPresentation presentation) {
presentation.setItemText(descriptor.getName());
presentation.setTypeText(DescriptorRenderer.TEXT.render(descriptor));
}
}
);
}
return result.toArray();
} }
} }
@@ -116,6 +107,28 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
}; };
} }
private Object[] collectLookupElements(JetScope scope) {
List<LookupElement> result = Lists.newArrayList();
for (final DeclarationDescriptor descriptor : scope.getAllDescriptors()) {
result.add(
new LookupElement() {
@NotNull
@Override
public String getLookupString() {
return descriptor.getName();
}
@Override
public void renderElement(LookupElementPresentation presentation) {
presentation.setItemText(descriptor.getName());
presentation.setTypeText(DescriptorRenderer.TEXT.render(descriptor));
}
}
);
}
return result.toArray();
}
@Override @Override
public void accept(JetVisitor visitor) { public void accept(JetVisitor visitor) {
visitor.visitSimpleNameExpression(this); visitor.visitSimpleNameExpression(this);
@@ -127,7 +127,7 @@ public class BindingTraceContext implements BindingContext, BindingTrace {
@Override @Override
public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) { public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) {
safePut(resolutionScopes, expression, scope); resolutionScopes.put(expression, scope);
} }
@Override @Override
@@ -38,6 +38,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
public WritableScopeImpl(@NotNull JetScope scope, @NotNull DeclarationDescriptor owner, @NotNull ErrorHandler errorHandler) { public WritableScopeImpl(@NotNull JetScope scope, @NotNull DeclarationDescriptor owner, @NotNull ErrorHandler errorHandler) {
super(scope, errorHandler); super(scope, errorHandler);
this.ownerDeclarationDescriptor = owner; this.ownerDeclarationDescriptor = owner;
this.allDescriptors.addAll(scope.getAllDescriptors());
} }
@NotNull @NotNull
@@ -146,4 +146,9 @@ public class WriteThroughScope extends WritableScopeWithImports {
public void setThisType(@NotNull JetType thisType) { public void setThisType(@NotNull JetType thisType) {
writableWorker.setThisType(thisType); writableWorker.setThisType(thisType);
} }
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return writableWorker.getAllDescriptors();
}
} }
@@ -641,6 +641,7 @@ public class JetTypeInferrer {
@Nullable @Nullable
public final JetType getType(@NotNull JetExpression expression) { public final JetType getType(@NotNull JetExpression expression) {
assert result == null; assert result == null;
trace.recordResolutionScope(expression, scope);
if (trace.isProcessed(expression)) { if (trace.isProcessed(expression)) {
return trace.getBindingContext().getExpressionType(expression); return trace.getBindingContext().getExpressionType(expression);
} }
@@ -667,7 +668,6 @@ public class JetTypeInferrer {
} }
trace.markAsProcessed(expression); trace.markAsProcessed(expression);
trace.recordResolutionScope(expression, scope);
return result; return result;
} }
@@ -1127,7 +1127,7 @@ public class JetTypeInferrer {
JetWhenExpression subWhen = whenEntry.getSubWhen(); JetWhenExpression subWhen = whenEntry.getSubWhen();
JetExpression bodyExpression = subWhen == null ? whenEntry.getExpression() : subWhen; JetExpression bodyExpression = subWhen == null ? whenEntry.getExpression() : subWhen;
if (bodyExpression != null) { if (bodyExpression != null) {
JetType type = getType(scopeToExtend, bodyExpression, false, newDataFlowInfo); JetType type = getType(scopeToExtend, bodyExpression, true, newDataFlowInfo);
if (type != null) { if (type != null) {
expressionTypes.add(type); expressionTypes.add(type);
} }