diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 86557104066..32f3c202730 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -22,6 +22,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import kotlin.Function0; import kotlin.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -521,6 +522,55 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return DataFlowUtils.checkType(result, expression, c, c.dataFlowInfo); } + @Override + public JetTypeInfo visitObjectLiteralExpression(@NotNull final JetObjectLiteralExpression expression, final ExpressionTypingContext context) { + DelegatingBindingTrace delegatingBindingTrace = context.trace.get(TRACE_DELTAS_CACHE, expression.getObjectDeclaration()); + if (delegatingBindingTrace != null) { + delegatingBindingTrace.addAllMyDataTo(context.trace); + JetType type = context.trace.get(EXPRESSION_TYPE, expression); + return DataFlowUtils.checkType(type, expression, context, context.dataFlowInfo); + } + final JetType[] result = new JetType[1]; + final TemporaryBindingTrace temporaryTrace = TemporaryBindingTrace.create(context.trace, "trace to resolve object literal expression", expression); + ObservableBindingTrace.RecordHandler handler = new ObservableBindingTrace.RecordHandler() { + + @Override + public void handleRecord(WritableSlice slice, PsiElement declaration, final ClassDescriptor descriptor) { + if (slice == CLASS && declaration == expression.getObjectDeclaration()) { + JetType defaultType = DeferredType.createRecursionIntolerant(components.globalContext.getStorageManager(), + context.trace, + new Function0() { + @Override + public JetType invoke() { + return descriptor.getDefaultType(); + } + }); + result[0] = defaultType; + if (!context.trace.get(PROCESSED, expression)) { + temporaryTrace.record(EXPRESSION_TYPE, expression, defaultType); + temporaryTrace.record(PROCESSED, expression); + } + } + } + }; + ObservableBindingTrace traceAdapter = new ObservableBindingTrace(temporaryTrace); + traceAdapter.addHandler(CLASS, handler); + components.localClassifierAnalyzer.processClassOrObject(components.globalContext, + null, // don't need to add classifier of object literal to any scope + context.replaceBindingTrace(traceAdapter).replaceContextDependency(INDEPENDENT), + context.scope.getContainingDeclaration(), + expression.getObjectDeclaration(), + components.additionalCheckerProvider, + components.dynamicTypesSettings); + + DelegatingBindingTrace cloneDelta = new DelegatingBindingTrace( + new BindingTraceContext().getBindingContext(), "cached delta trace for object literal expression resolve", expression); + temporaryTrace.addAllMyDataTo(cloneDelta); + context.trace.record(TRACE_DELTAS_CACHE, expression.getObjectDeclaration(), cloneDelta); + temporaryTrace.commit(); + return DataFlowUtils.checkType(result[0], expression, context, context.dataFlowInfo); + } + @Nullable private JetType getCallableReferenceType( @NotNull JetCallableReferenceExpression expression, @@ -689,7 +739,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { ) { Call call = CallMaker.makeCall(reference, receiver, null, reference, ThrowingList.instance()); TemporaryTraceAndCache temporaryTrace = TemporaryTraceAndCache.create(context, "trace to resolve callable reference as function", - reference); + reference); BasicCallResolutionContext callResolutionContext = BasicCallResolutionContext.create( context.replaceTraceAndCache(temporaryTrace).replaceExpectedType(NO_EXPECTED_TYPE), call, CheckValueArgumentsMode.DISABLED); @@ -1283,7 +1333,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { dataFlowInfo = resolutionResults.getResultingCall().getDataFlowInfoForArguments().getResultInfo(); } - return JetTypeInfo.create(OverloadResolutionResultsUtil.getResultingType(resolutionResults, context.contextDependency), dataFlowInfo); + return JetTypeInfo.create(OverloadResolutionResultsUtil.getResultingType(resolutionResults, context.contextDependency), + dataFlowInfo); } @Override diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ClosureExpressionsTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ClosureExpressionsTypingVisitor.java index 9ac687dd994..f5c0ab466e7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ClosureExpressionsTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ClosureExpressionsTypingVisitor.java @@ -20,7 +20,6 @@ import com.google.common.collect.Lists; import com.intellij.psi.PsiElement; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; -import kotlin.Function0; import kotlin.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,7 +33,6 @@ import org.jetbrains.kotlin.resolve.*; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.checker.JetTypeChecker; -import org.jetbrains.kotlin.util.slicedMap.WritableSlice; import java.util.Collection; import java.util.Collections; @@ -42,7 +40,6 @@ import java.util.List; import static org.jetbrains.kotlin.diagnostics.Errors.*; import static org.jetbrains.kotlin.resolve.BindingContext.*; -import static org.jetbrains.kotlin.resolve.calls.context.ContextDependency.INDEPENDENT; import static org.jetbrains.kotlin.resolve.source.SourcePackage.toSourceElement; import static org.jetbrains.kotlin.types.TypeUtils.*; import static org.jetbrains.kotlin.types.expressions.CoercionStrategy.COERCION_TO_UNIT; @@ -53,55 +50,6 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor { super(facade); } - @Override - public JetTypeInfo visitObjectLiteralExpression(@NotNull final JetObjectLiteralExpression expression, final ExpressionTypingContext context) { - DelegatingBindingTrace delegatingBindingTrace = context.trace.get(TRACE_DELTAS_CACHE, expression.getObjectDeclaration()); - if (delegatingBindingTrace != null) { - delegatingBindingTrace.addAllMyDataTo(context.trace); - JetType type = context.trace.get(EXPRESSION_TYPE, expression); - return DataFlowUtils.checkType(type, expression, context, context.dataFlowInfo); - } - final JetType[] result = new JetType[1]; - final TemporaryBindingTrace temporaryTrace = TemporaryBindingTrace.create(context.trace, "trace to resolve object literal expression", expression); - ObservableBindingTrace.RecordHandler handler = new ObservableBindingTrace.RecordHandler() { - - @Override - public void handleRecord(WritableSlice slice, PsiElement declaration, final ClassDescriptor descriptor) { - if (slice == CLASS && declaration == expression.getObjectDeclaration()) { - JetType defaultType = DeferredType.createRecursionIntolerant(components.globalContext.getStorageManager(), - context.trace, - new Function0() { - @Override - public JetType invoke() { - return descriptor.getDefaultType(); - } - }); - result[0] = defaultType; - if (!context.trace.get(PROCESSED, expression)) { - temporaryTrace.record(EXPRESSION_TYPE, expression, defaultType); - temporaryTrace.record(PROCESSED, expression); - } - } - } - }; - ObservableBindingTrace traceAdapter = new ObservableBindingTrace(temporaryTrace); - traceAdapter.addHandler(CLASS, handler); - components.localClassifierAnalyzer.processClassOrObject(components.globalContext, - null, // don't need to add classifier of object literal to any scope - context.replaceBindingTrace(traceAdapter).replaceContextDependency(INDEPENDENT), - context.scope.getContainingDeclaration(), - expression.getObjectDeclaration(), - components.additionalCheckerProvider, - components.dynamicTypesSettings); - - DelegatingBindingTrace cloneDelta = new DelegatingBindingTrace( - new BindingTraceContext().getBindingContext(), "cached delta trace for object literal expression resolve", expression); - temporaryTrace.addAllMyDataTo(cloneDelta); - context.trace.record(TRACE_DELTAS_CACHE, expression.getObjectDeclaration(), cloneDelta); - temporaryTrace.commit(); - return DataFlowUtils.checkType(result[0], expression, context, context.dataFlowInfo); - } - @Override public JetTypeInfo visitFunctionLiteralExpression(@NotNull JetFunctionLiteralExpression expression, ExpressionTypingContext context) { if (!expression.getFunctionLiteral().hasBody()) return null; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java index ef321eed206..d355da23597 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java @@ -171,18 +171,13 @@ public class ExpressionTypingVisitorDispatcher extends JetVisitor