diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java index 0949e1e9c54..972a51fb21d 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java @@ -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 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 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); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java index e55fd4765f6..d43d65b0b90 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java @@ -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 diff --git a/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java b/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java index 38a2c8d1524..7c813ebe042 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java @@ -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 diff --git a/idea/src/org/jetbrains/jet/lang/resolve/WriteThroughScope.java b/idea/src/org/jetbrains/jet/lang/resolve/WriteThroughScope.java index 091c0bb80fa..1de7f92f734 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/WriteThroughScope.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/WriteThroughScope.java @@ -146,4 +146,9 @@ public class WriteThroughScope extends WritableScopeWithImports { public void setThisType(@NotNull JetType thisType) { writableWorker.setThisType(thisType); } + + @Override + public Collection getAllDescriptors() { + return writableWorker.getAllDescriptors(); + } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index ef7ed4e7a36..8b7dc70e6c2 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -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); }