提交 0210a495 编写于 作者: A Andrey Breslav

Services for completion

上级 46208ad1
......@@ -15,6 +15,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.parsing.JetExpressionParsing;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
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.lexer.JetTokens;
import org.jetbrains.jet.resolve.DescriptorRenderer;
......@@ -89,25 +90,15 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
final JetType expressionType = bindingContext.getExpressionType(receiverExpression);
if (expressionType != null) {
List<LookupElement> result = Lists.newArrayList();
for (final DeclarationDescriptor descriptor : expressionType.getMemberScope().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();
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);
}
}
......@@ -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
public void accept(JetVisitor visitor) {
visitor.visitSimpleNameExpression(this);
......
......@@ -127,7 +127,7 @@ public class BindingTraceContext implements BindingContext, BindingTrace {
@Override
public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) {
safePut(resolutionScopes, expression, scope);
resolutionScopes.put(expression, scope);
}
@Override
......
......@@ -38,6 +38,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
public WritableScopeImpl(@NotNull JetScope scope, @NotNull DeclarationDescriptor owner, @NotNull ErrorHandler errorHandler) {
super(scope, errorHandler);
this.ownerDeclarationDescriptor = owner;
this.allDescriptors.addAll(scope.getAllDescriptors());
}
@NotNull
......
......@@ -146,4 +146,9 @@ public class WriteThroughScope extends WritableScopeWithImports {
public void setThisType(@NotNull JetType thisType) {
writableWorker.setThisType(thisType);
}
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return writableWorker.getAllDescriptors();
}
}
......@@ -641,6 +641,7 @@ public class JetTypeInferrer {
@Nullable
public final JetType getType(@NotNull JetExpression expression) {
assert result == null;
trace.recordResolutionScope(expression, scope);
if (trace.isProcessed(expression)) {
return trace.getBindingContext().getExpressionType(expression);
}
......@@ -667,7 +668,6 @@ public class JetTypeInferrer {
}
trace.markAsProcessed(expression);
trace.recordResolutionScope(expression, scope);
return result;
}
......@@ -1127,7 +1127,7 @@ public class JetTypeInferrer {
JetWhenExpression subWhen = whenEntry.getSubWhen();
JetExpression bodyExpression = subWhen == null ? whenEntry.getExpression() : subWhen;
if (bodyExpression != null) {
JetType type = getType(scopeToExtend, bodyExpression, false, newDataFlowInfo);
JetType type = getType(scopeToExtend, bodyExpression, true, newDataFlowInfo);
if (type != null) {
expressionTypes.add(type);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册