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,8 +90,26 @@ 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) {
return collectLookupElements(expressionType.getMemberScope());
}
}
else {
JetFile file = (JetFile) getContainingFile();
BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
JetScope resolutionScope = bindingContext.getResolutionScope(JetSimpleNameExpression.this);
if (resolutionScope != null) {
return collectLookupElements(resolutionScope);
}
}
return EMPTY_ARRAY;
}
};
}
private Object[] collectLookupElements(JetScope scope) {
List<LookupElement> result = Lists.newArrayList(); List<LookupElement> result = Lists.newArrayList();
for (final DeclarationDescriptor descriptor : expressionType.getMemberScope().getAllDescriptors()) { for (final DeclarationDescriptor descriptor : scope.getAllDescriptors()) {
result.add( result.add(
new LookupElement() { new LookupElement() {
@NotNull @NotNull
@@ -109,12 +128,6 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
} }
return result.toArray(); return result.toArray();
} }
}
return EMPTY_ARRAY;
}
};
}
@Override @Override
public void accept(JetVisitor visitor) { public void accept(JetVisitor visitor) {
@@ -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);
} }