Services for completion
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user