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.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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user