rename ResolveMode to ContextDependency

This commit is contained in:
Svetlana Isakova
2013-08-09 18:33:11 +04:00
parent d26806a5ed
commit fbd94a9507
18 changed files with 78 additions and 80 deletions
@@ -27,7 +27,7 @@ import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorUtil;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.context.ResolveMode; import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition; import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionResultsCacheImpl; import org.jetbrains.jet.lang.resolve.calls.context.ResolutionResultsCacheImpl;
import org.jetbrains.jet.lang.resolve.calls.context.SimpleResolutionContext; import org.jetbrains.jet.lang.resolve.calls.context.SimpleResolutionContext;
@@ -216,7 +216,7 @@ public class BodyResolver {
JetType type = typeInferrer.getType(scope, delegateExpression, NO_EXPECTED_TYPE, context.getOuterDataFlowInfo(), trace); JetType type = typeInferrer.getType(scope, delegateExpression, NO_EXPECTED_TYPE, context.getOuterDataFlowInfo(), trace);
if (type != null && supertype != null) { if (type != null && supertype != null) {
SimpleResolutionContext simpleResolutionContext = new SimpleResolutionContext( SimpleResolutionContext simpleResolutionContext = new SimpleResolutionContext(
trace, scope, supertype, context.getOuterDataFlowInfo(), ExpressionPosition.FREE, ResolveMode.NORMAL, trace, scope, supertype, context.getOuterDataFlowInfo(), ExpressionPosition.FREE, ContextDependency.INDEPENDENT,
ResolutionResultsCacheImpl.create()); ResolutionResultsCacheImpl.create());
DataFlowUtils.checkType(type, delegateExpression, simpleResolutionContext); DataFlowUtils.checkType(type, delegateExpression, simpleResolutionContext);
} }
@@ -28,11 +28,9 @@ import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.calls.context.CallResolutionContext; import org.jetbrains.jet.lang.resolve.calls.context.CallResolutionContext;
import org.jetbrains.jet.lang.resolve.calls.context.CheckValueArgumentsMode; import org.jetbrains.jet.lang.resolve.calls.context.CheckValueArgumentsMode;
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext; import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext;
import org.jetbrains.jet.lang.resolve.calls.context.ResolveMode; import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintsUtil;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallImpl; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallImpl;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument;
import org.jetbrains.jet.lang.resolve.constants.*;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
@@ -175,7 +173,8 @@ public class ArgumentTypeResolver {
if (recordedTypeInfo != null) { if (recordedTypeInfo != null) {
return recordedTypeInfo; return recordedTypeInfo;
} }
ResolutionContext newContext = context.replaceExpectedType(TypeUtils.UNKNOWN_EXPECTED_TYPE).replaceResolveMode(ResolveMode.NESTED_CALL); ResolutionContext newContext = context.replaceExpectedType(TypeUtils.UNKNOWN_EXPECTED_TYPE).replaceContextDependency(
ContextDependency.DEPENDENT);
JetTypeInfo result = expressionTypingServices.getTypeInfo(expression, newContext); JetTypeInfo result = expressionTypingServices.getTypeInfo(expression, newContext);
if (traceToCommitForCall != null) { if (traceToCommitForCall != null) {
@@ -24,7 +24,6 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace; import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.context.*; import org.jetbrains.jet.lang.resolve.calls.context.*;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
@@ -194,7 +193,7 @@ public class CallExpressionResolver {
if (!results.isNothing()) { if (!results.isNothing()) {
checkSuper(call.getExplicitReceiver(), results, context.trace, callExpression); checkSuper(call.getExplicitReceiver(), results, context.trace, callExpression);
result[0] = true; result[0] = true;
return OverloadResolutionResultsUtil.getResultingCall(results, context.resolveMode); return OverloadResolutionResultsUtil.getResultingCall(results, context.contextDependency);
} }
result[0] = false; result[0] = false;
return null; return null;
@@ -284,7 +283,7 @@ public class CallExpressionResolver {
) { ) {
JetTypeInfo typeInfo = getCallExpressionTypeInfoWithoutFinalTypeCheck( JetTypeInfo typeInfo = getCallExpressionTypeInfoWithoutFinalTypeCheck(
callExpression, receiver, callOperationNode, context); callExpression, receiver, callOperationNode, context);
if (context.resolveMode == ResolveMode.TOP_LEVEL_CALL) { if (context.contextDependency == ContextDependency.INDEPENDENT) {
DataFlowUtils.checkType(typeInfo.getType(), callExpression, context, typeInfo.getDataFlowInfo()); DataFlowUtils.checkType(typeInfo.getType(), callExpression, context, typeInfo.getDataFlowInfo());
} }
return typeInfo; return typeInfo;
@@ -407,7 +406,7 @@ public class CallExpressionResolver {
context.trace.record(BindingContext.EXPRESSION_TYPE, selectorExpression, selectorReturnType); context.trace.record(BindingContext.EXPRESSION_TYPE, selectorExpression, selectorReturnType);
} }
JetTypeInfo typeInfo = JetTypeInfo.create(selectorReturnType, selectorReturnTypeInfo.getDataFlowInfo()); JetTypeInfo typeInfo = JetTypeInfo.create(selectorReturnType, selectorReturnTypeInfo.getDataFlowInfo());
if (context.resolveMode == ResolveMode.TOP_LEVEL_CALL) { if (context.contextDependency == ContextDependency.INDEPENDENT) {
DataFlowUtils.checkType(typeInfo.getType(), expression, context, typeInfo.getDataFlowInfo()); DataFlowUtils.checkType(typeInfo.getType(), expression, context, typeInfo.getDataFlowInfo());
} }
return typeInfo; return typeInfo;
@@ -142,7 +142,7 @@ public class CallResolver {
@NotNull DataFlowInfo dataFlowInfo @NotNull DataFlowInfo dataFlowInfo
) { ) {
return resolveFunctionCall(BasicCallResolutionContext.create( return resolveFunctionCall(BasicCallResolutionContext.create(
trace, scope, call, expectedType, dataFlowInfo, ResolveMode.TOP_LEVEL_CALL, CheckValueArgumentsMode.ENABLED, trace, scope, call, expectedType, dataFlowInfo, ContextDependency.INDEPENDENT, CheckValueArgumentsMode.ENABLED,
ExpressionPosition.FREE, ResolutionResultsCacheImpl.create())); ExpressionPosition.FREE, ResolutionResultsCacheImpl.create()));
} }
@@ -319,7 +319,7 @@ public class CallResolver {
} }
traceToResolveCall.commit(); traceToResolveCall.commit();
if (prioritizedTasks.isEmpty() || context.resolveMode == ResolveMode.NESTED_CALL) { if (prioritizedTasks.isEmpty() || context.contextDependency == ContextDependency.DEPENDENT) {
//do nothing //do nothing
} else { } else {
results = completeTypeInferenceDependentOnExpectedType(context, results, tracing); results = completeTypeInferenceDependentOnExpectedType(context, results, tracing);
@@ -509,7 +509,7 @@ public class CallResolver {
ImmutableSet<OverloadResolutionResults.Code> someFailed = ImmutableSet.of(MANY_FAILED_CANDIDATES, ImmutableSet<OverloadResolutionResults.Code> someFailed = ImmutableSet.of(MANY_FAILED_CANDIDATES,
SINGLE_CANDIDATE_ARGUMENT_MISMATCH); SINGLE_CANDIDATE_ARGUMENT_MISMATCH);
if (someFailed.contains(results.getResultCode()) && !task.call.getFunctionLiteralArguments().isEmpty() if (someFailed.contains(results.getResultCode()) && !task.call.getFunctionLiteralArguments().isEmpty()
&& task.resolveMode == ResolveMode.TOP_LEVEL_CALL) { //For nested calls there are no such cases && task.contextDependency == ContextDependency.INDEPENDENT) { //For nested calls there are no such cases
// We have some candidates that failed for some reason // We have some candidates that failed for some reason
// And we have a suspect: the function literal argument // And we have a suspect: the function literal argument
// Now, we try to remove this argument and see if it helps // Now, we try to remove this argument and see if it helps
@@ -196,7 +196,7 @@ public class CallTransformer<D extends CallableDescriptor, F extends D> {
DelegatingBindingTrace variableCallTrace = context.candidateCall.getTrace(); DelegatingBindingTrace variableCallTrace = context.candidateCall.getTrace();
BasicCallResolutionContext basicCallResolutionContext = BasicCallResolutionContext.create( BasicCallResolutionContext basicCallResolutionContext = BasicCallResolutionContext.create(
variableCallTrace, context.scope, functionCall, context.expectedType, context.dataFlowInfo, variableCallTrace, context.scope, functionCall, context.expectedType, context.dataFlowInfo,
context.resolveMode, context.checkArguments, context.expressionPosition, context.resolutionResultsCache); context.contextDependency, context.checkArguments, context.expressionPosition, context.resolutionResultsCache);
// 'invoke' call resolve // 'invoke' call resolve
OverloadResolutionResults<FunctionDescriptor> results = callResolver.resolveCallWithGivenName(basicCallResolutionContext, task.reference, Name.identifier("invoke")); OverloadResolutionResults<FunctionDescriptor> results = callResolver.resolveCallWithGivenName(basicCallResolutionContext, task.reference, Name.identifier("invoke"));
@@ -363,7 +363,7 @@ public class CandidateResolver {
} }
CallCandidateResolutionContext<FunctionDescriptor> contextForArgument = storedContextForArgument CallCandidateResolutionContext<FunctionDescriptor> contextForArgument = storedContextForArgument
.replaceResolveMode(ResolveMode.TOP_LEVEL_CALL).replaceBindingTrace(context.trace).replaceExpectedType(expectedType); .replaceContextDependency(ContextDependency.INDEPENDENT).replaceBindingTrace(context.trace).replaceExpectedType(expectedType);
JetType type; JetType type;
if (contextForArgument.candidateCall.hasIncompleteTypeParameters()) { if (contextForArgument.candidateCall.hasIncompleteTypeParameters()) {
type = completeTypeInferenceDependentOnExpectedTypeForCall(contextForArgument, true); type = completeTypeInferenceDependentOnExpectedTypeForCall(contextForArgument, true);
@@ -33,13 +33,13 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull Call call, @NotNull Call call,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull CheckValueArgumentsMode checkArguments, @NotNull CheckValueArgumentsMode checkArguments,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache, @NotNull ResolutionResultsCache resolutionResultsCache,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
return new BasicCallResolutionContext(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, return new BasicCallResolutionContext(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments,
expressionPosition, resolutionResultsCache, dataFlowInfoForArguments); expressionPosition, resolutionResultsCache, dataFlowInfoForArguments);
} }
@@ -50,12 +50,12 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull Call call, @NotNull Call call,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull CheckValueArgumentsMode checkArguments, @NotNull CheckValueArgumentsMode checkArguments,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return new BasicCallResolutionContext(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache, null); return new BasicCallResolutionContext(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache, null);
} }
@NotNull @NotNull
@@ -63,7 +63,7 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull ResolutionContext context, @NotNull Call call, @NotNull CheckValueArgumentsMode checkArguments, @NotNull ResolutionContext context, @NotNull Call call, @NotNull CheckValueArgumentsMode checkArguments,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
return create(context.trace, context.scope, call, context.expectedType, context.dataFlowInfo, context.resolveMode, return create(context.trace, context.scope, call, context.expectedType, context.dataFlowInfo, context.contextDependency,
checkArguments, context.expressionPosition, context.resolutionResultsCache, dataFlowInfoForArguments); checkArguments, context.expressionPosition, context.resolutionResultsCache, dataFlowInfoForArguments);
} }
@@ -76,11 +76,11 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
private BasicCallResolutionContext( private BasicCallResolutionContext(
BindingTrace trace, JetScope scope, Call call, JetType expectedType, BindingTrace trace, JetScope scope, Call call, JetType expectedType,
DataFlowInfo dataFlowInfo, ResolveMode resolveMode, CheckValueArgumentsMode checkArguments, DataFlowInfo dataFlowInfo, ContextDependency contextDependency, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache, ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
MutableDataFlowInfoForArguments dataFlowInfoForArguments MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache, super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
dataFlowInfoForArguments); dataFlowInfoForArguments);
} }
@@ -91,10 +91,10 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return create(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, return create(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition,
resolutionResultsCache); resolutionResultsCache);
} }
@@ -40,12 +40,12 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
@NotNull Call call, @NotNull Call call,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull CheckValueArgumentsMode checkArguments, @NotNull CheckValueArgumentsMode checkArguments,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache, null); super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache, null);
this.candidateCall = candidateCall; this.candidateCall = candidateCall;
this.tracing = tracing; this.tracing = tracing;
} }
@@ -56,7 +56,7 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
candidateCall.setInitialDataFlowInfo(context.dataFlowInfo); candidateCall.setInitialDataFlowInfo(context.dataFlowInfo);
return new CallCandidateResolutionContext<D>( return new CallCandidateResolutionContext<D>(
candidateCall, tracing, trace, context.scope, call, context.expectedType, candidateCall, tracing, trace, context.scope, call, context.expectedType,
context.dataFlowInfo, context.resolveMode, context.checkArguments, context.dataFlowInfo, context.contextDependency, context.checkArguments,
context.expressionPosition, context.resolutionResultsCache); context.expressionPosition, context.resolutionResultsCache);
} }
@@ -69,18 +69,18 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
public static <D extends CallableDescriptor> CallCandidateResolutionContext<D> createForCallBeingAnalyzed( public static <D extends CallableDescriptor> CallCandidateResolutionContext<D> createForCallBeingAnalyzed(
@NotNull ResolvedCallImpl<D> candidateCall, @NotNull BasicCallResolutionContext context, @NotNull TracingStrategy tracing @NotNull ResolvedCallImpl<D> candidateCall, @NotNull BasicCallResolutionContext context, @NotNull TracingStrategy tracing
) { ) {
return createForCallBeingAnalyzed(candidateCall, context, context.call, context.resolveMode, return createForCallBeingAnalyzed(candidateCall, context, context.call, context.contextDependency,
context.checkArguments, tracing, context.resolutionResultsCache); context.checkArguments, tracing, context.resolutionResultsCache);
} }
public static <D extends CallableDescriptor> CallCandidateResolutionContext<D> createForCallBeingAnalyzed( public static <D extends CallableDescriptor> CallCandidateResolutionContext<D> createForCallBeingAnalyzed(
@NotNull ResolvedCallImpl<D> candidateCall, @NotNull ResolutionContext context, @NotNull Call call, @NotNull ResolvedCallImpl<D> candidateCall, @NotNull ResolutionContext context, @NotNull Call call,
@NotNull ResolveMode resolveMode, @NotNull CheckValueArgumentsMode checkArguments, @NotNull TracingStrategy tracing, @NotNull ContextDependency contextDependency, @NotNull CheckValueArgumentsMode checkArguments, @NotNull TracingStrategy tracing,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return new CallCandidateResolutionContext<D>( return new CallCandidateResolutionContext<D>(
candidateCall, tracing, context.trace, context.scope, call, context.expectedType, candidateCall, tracing, context.trace, context.scope, call, context.expectedType,
context.dataFlowInfo, resolveMode, checkArguments, context.expressionPosition, resolutionResultsCache); context.dataFlowInfo, contextDependency, checkArguments, context.expressionPosition, resolutionResultsCache);
} }
@Override @Override
@@ -90,11 +90,11 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return new CallCandidateResolutionContext<D>( return new CallCandidateResolutionContext<D>(
candidateCall, tracing, trace, scope, call, expectedType, dataFlowInfo, resolveMode, candidateCall, tracing, trace, scope, call, expectedType, dataFlowInfo, contextDependency,
checkArguments, expressionPosition, resolutionResultsCache); checkArguments, expressionPosition, resolutionResultsCache);
} }
@@ -37,13 +37,13 @@ public abstract class CallResolutionContext<Context extends CallResolutionContex
@NotNull Call call, @NotNull Call call,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull CheckValueArgumentsMode checkArguments, @NotNull CheckValueArgumentsMode checkArguments,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache, @NotNull ResolutionResultsCache resolutionResultsCache,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, resolveMode, resolutionResultsCache); super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache);
this.call = call; this.call = call;
this.checkArguments = checkArguments; this.checkArguments = checkArguments;
if (dataFlowInfoForArguments != null) { if (dataFlowInfoForArguments != null) {
@@ -16,7 +16,7 @@
package org.jetbrains.jet.lang.resolve.calls.context; package org.jetbrains.jet.lang.resolve.calls.context;
public enum ResolveMode { public enum ContextDependency {
TOP_LEVEL_CALL, INDEPENDENT,
NESTED_CALL DEPENDENT
} }
@@ -30,7 +30,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
public final JetType expectedType; public final JetType expectedType;
public final DataFlowInfo dataFlowInfo; public final DataFlowInfo dataFlowInfo;
public final ExpressionPosition expressionPosition; public final ExpressionPosition expressionPosition;
public final ResolveMode resolveMode; public final ContextDependency contextDependency;
public final ResolutionResultsCache resolutionResultsCache; public final ResolutionResultsCache resolutionResultsCache;
protected ResolutionContext( protected ResolutionContext(
@@ -39,7 +39,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
this.trace = trace; this.trace = trace;
@@ -47,7 +47,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
this.expectedType = expectedType; this.expectedType = expectedType;
this.dataFlowInfo = dataFlowInfo; this.dataFlowInfo = dataFlowInfo;
this.expressionPosition = expressionPosition; this.expressionPosition = expressionPosition;
this.resolveMode = resolveMode; this.contextDependency = contextDependency;
this.resolutionResultsCache = resolutionResultsCache; this.resolutionResultsCache = resolutionResultsCache;
} }
@@ -57,7 +57,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
); );
@@ -65,44 +65,44 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
public Context replaceBindingTrace(@NotNull BindingTrace trace) { public Context replaceBindingTrace(@NotNull BindingTrace trace) {
if (this.trace == trace) return self(); if (this.trace == trace) return self();
return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, resolveMode, resolutionResultsCache); return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache);
} }
@NotNull @NotNull
public Context replaceExpressionPosition(@NotNull ExpressionPosition expressionPosition) { public Context replaceExpressionPosition(@NotNull ExpressionPosition expressionPosition) {
if (expressionPosition == this.expressionPosition) return self(); if (expressionPosition == this.expressionPosition) return self();
return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, resolveMode, resolutionResultsCache); return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache);
} }
@NotNull @NotNull
public Context replaceDataFlowInfo(@NotNull DataFlowInfo newDataFlowInfo) { public Context replaceDataFlowInfo(@NotNull DataFlowInfo newDataFlowInfo) {
if (newDataFlowInfo == dataFlowInfo) return self(); if (newDataFlowInfo == dataFlowInfo) return self();
return create(trace, scope, newDataFlowInfo, expectedType, expressionPosition, resolveMode, resolutionResultsCache); return create(trace, scope, newDataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache);
} }
@NotNull @NotNull
public Context replaceExpectedType(@Nullable JetType newExpectedType) { public Context replaceExpectedType(@Nullable JetType newExpectedType) {
if (newExpectedType == null) return replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE); if (newExpectedType == null) return replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE);
if (expectedType == newExpectedType) return self(); if (expectedType == newExpectedType) return self();
return create(trace, scope, dataFlowInfo, newExpectedType, expressionPosition, resolveMode, resolutionResultsCache); return create(trace, scope, dataFlowInfo, newExpectedType, expressionPosition, contextDependency, resolutionResultsCache);
} }
@NotNull @NotNull
public Context replaceScope(@NotNull JetScope newScope) { public Context replaceScope(@NotNull JetScope newScope) {
if (newScope == scope) return self(); if (newScope == scope) return self();
return create(trace, newScope, dataFlowInfo, expectedType, expressionPosition, resolveMode, resolutionResultsCache); return create(trace, newScope, dataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache);
} }
@NotNull @NotNull
public Context replaceResolveMode(@NotNull ResolveMode newResolveMode) { public Context replaceContextDependency(@NotNull ContextDependency newContextDependency) {
if (newResolveMode == resolveMode) return self(); if (newContextDependency == contextDependency) return self();
return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, newResolveMode, resolutionResultsCache); return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, newContextDependency, resolutionResultsCache);
} }
@NotNull @NotNull
public Context replaceResolutionResultsCache(@NotNull ResolutionResultsCache newResolutionResultsCache) { public Context replaceResolutionResultsCache(@NotNull ResolutionResultsCache newResolutionResultsCache) {
if (newResolutionResultsCache == resolutionResultsCache) return self(); if (newResolutionResultsCache == resolutionResultsCache) return self();
return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, resolveMode, newResolutionResultsCache); return create(trace, scope, dataFlowInfo, expectedType, expressionPosition, contextDependency, newResolutionResultsCache);
} }
public Context replaceTraceAndCache(@NotNull TemporaryTraceAndCache traceAndCache) { public Context replaceTraceAndCache(@NotNull TemporaryTraceAndCache traceAndCache) {
@@ -13,10 +13,10 @@ public class SimpleResolutionContext extends ResolutionContext<SimpleResolutionC
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, resolveMode, resolutionResultsCache); super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache);
} }
@Override @Override
@@ -26,10 +26,10 @@ public class SimpleResolutionContext extends ResolutionContext<SimpleResolutionC
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return new SimpleResolutionContext(trace, scope, expectedType, dataFlowInfo, expressionPosition, resolveMode, resolutionResultsCache); return new SimpleResolutionContext(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache);
} }
@Override @Override
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil; import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil;
import org.jetbrains.jet.lang.resolve.calls.context.ResolveMode; import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -40,18 +40,18 @@ public class OverloadResolutionResultsUtil {
@Nullable @Nullable
public static <D extends CallableDescriptor> JetType getResultingType( public static <D extends CallableDescriptor> JetType getResultingType(
@NotNull OverloadResolutionResults<D> results, @NotNull OverloadResolutionResults<D> results,
@NotNull ResolveMode resolveMode @NotNull ContextDependency contextDependency
) { ) {
ResolvedCall<D> resultingCall = getResultingCall((OverloadResolutionResultsImpl<D>) results, resolveMode); ResolvedCall<D> resultingCall = getResultingCall((OverloadResolutionResultsImpl<D>) results, contextDependency);
return resultingCall != null ? resultingCall.getResultingDescriptor().getReturnType() : null; return resultingCall != null ? resultingCall.getResultingDescriptor().getReturnType() : null;
} }
@Nullable @Nullable
public static <D extends CallableDescriptor> ResolvedCallWithTrace<D> getResultingCall( public static <D extends CallableDescriptor> ResolvedCallWithTrace<D> getResultingCall(
@NotNull OverloadResolutionResultsImpl<D> results, @NotNull OverloadResolutionResultsImpl<D> results,
@NotNull ResolveMode resolveMode @NotNull ContextDependency contextDependency
) { ) {
if (results.isSingleResult() && resolveMode == ResolveMode.TOP_LEVEL_CALL) { if (results.isSingleResult() && contextDependency == ContextDependency.INDEPENDENT) {
if (!CallResolverUtil.hasInferredReturnType(results.getResultingCall())) { if (!CallResolverUtil.hasInferredReturnType(results.getResultingCall())) {
return null; return null;
} }
@@ -46,11 +46,11 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
public ResolutionTask( public ResolutionTask(
@NotNull Collection<ResolutionCandidate<D>> candidates, @NotNull JetReferenceExpression reference, @NotNull Collection<ResolutionCandidate<D>> candidates, @NotNull JetReferenceExpression reference,
@NotNull TracingStrategy tracing, BindingTrace trace, JetScope scope, Call call, JetType expectedType, @NotNull TracingStrategy tracing, BindingTrace trace, JetScope scope, Call call, JetType expectedType,
DataFlowInfo dataFlowInfo, ResolveMode resolveMode, CheckValueArgumentsMode checkArguments, DataFlowInfo dataFlowInfo, ContextDependency contextDependency, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache, ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache, super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
dataFlowInfoForArguments); dataFlowInfoForArguments);
this.candidates = candidates; this.candidates = candidates;
this.reference = reference; this.reference = reference;
@@ -65,7 +65,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
) { ) {
this(candidates, reference, tracing != null ? tracing : TracingStrategyImpl.create(reference, context.call), this(candidates, reference, tracing != null ? tracing : TracingStrategyImpl.create(reference, context.call),
context.trace, context.scope, context.call, context.trace, context.scope, context.call,
context.expectedType, context.dataFlowInfo, context.resolveMode, context.checkArguments, context.expectedType, context.dataFlowInfo, context.contextDependency, context.checkArguments,
context.expressionPosition, context.resolutionResultsCache, context.dataFlowInfoForArguments); context.expressionPosition, context.resolutionResultsCache, context.dataFlowInfoForArguments);
} }
@@ -105,11 +105,11 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
ResolutionTask<D, F> newTask = new ResolutionTask<D, F>( ResolutionTask<D, F> newTask = new ResolutionTask<D, F>(
candidates, reference, tracing, trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, candidates, reference, tracing, trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments,
expressionPosition, resolutionResultsCache, dataFlowInfoForArguments); expressionPosition, resolutionResultsCache, dataFlowInfoForArguments);
newTask.setCheckingStrategy(checkingStrategy); newTask.setCheckingStrategy(checkingStrategy);
return newTask; return newTask;
@@ -122,7 +122,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
public ResolutionTask<D, F> replaceCall(@NotNull Call newCall) { public ResolutionTask<D, F> replaceCall(@NotNull Call newCall) {
return new ResolutionTask<D, F>( return new ResolutionTask<D, F>(
candidates, reference, tracing, trace, scope, newCall, expectedType, dataFlowInfo, resolveMode, checkArguments, candidates, reference, tracing, trace, scope, newCall, expectedType, dataFlowInfo, contextDependency, checkArguments,
expressionPosition, resolutionResultsCache, dataFlowInfoForArguments); expressionPosition, resolutionResultsCache, dataFlowInfoForArguments);
} }
@@ -152,7 +152,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
@Override @Override
public JetTypeInfo visitBinaryWithTypeRHSExpression(JetBinaryExpressionWithTypeRHS expression, ExpressionTypingContext context) { public JetTypeInfo visitBinaryWithTypeRHSExpression(JetBinaryExpressionWithTypeRHS expression, ExpressionTypingContext context) {
ExpressionTypingContext contextWithNoExpectedType = ExpressionTypingContext contextWithNoExpectedType =
context.replaceExpectedType(NO_EXPECTED_TYPE).replaceResolveMode(ResolveMode.TOP_LEVEL_CALL); context.replaceExpectedType(NO_EXPECTED_TYPE).replaceContextDependency(ContextDependency.INDEPENDENT);
JetExpression left = expression.getLeft(); JetExpression left = expression.getLeft();
JetTypeReference right = expression.getRight(); JetTypeReference right = expression.getRight();
if (right == null) { if (right == null) {
@@ -914,7 +914,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
else if (OperatorConventions.COMPARISON_OPERATIONS.contains(operationType)) { else if (OperatorConventions.COMPARISON_OPERATIONS.contains(operationType)) {
//we don't complete 'compareTo' call, because we change its result type from 'Int' to 'Boolean' //we don't complete 'compareTo' call, because we change its result type from 'Int' to 'Boolean'
JetTypeInfo typeInfo = getTypeInfoForBinaryCall( JetTypeInfo typeInfo = getTypeInfoForBinaryCall(
context.scope, OperatorConventions.COMPARE_TO, context.replaceResolveMode(ResolveMode.TOP_LEVEL_CALL), expression); context.scope, OperatorConventions.COMPARE_TO, context.replaceContextDependency(ContextDependency.INDEPENDENT), expression);
dataFlowInfo = typeInfo.getDataFlowInfo(); dataFlowInfo = typeInfo.getDataFlowInfo();
JetType compareToReturnType = typeInfo.getType(); JetType compareToReturnType = typeInfo.getType();
if (compareToReturnType != null && !ErrorUtils.isErrorType(compareToReturnType)) { if (compareToReturnType != null && !ErrorUtils.isErrorType(compareToReturnType)) {
@@ -1064,7 +1064,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
CallMaker.makeCallWithExpressions(callElement, receiver, null, operationSign, Collections.singletonList(left)), CallMaker.makeCallWithExpressions(callElement, receiver, null, operationSign, Collections.singletonList(left)),
operationSign, operationSign,
OperatorConventions.CONTAINS); OperatorConventions.CONTAINS);
JetType containsType = OverloadResolutionResultsUtil.getResultingType(resolutionResult, context.resolveMode); JetType containsType = OverloadResolutionResultsUtil.getResultingType(resolutionResult, context.contextDependency);
ensureBooleanResult(operationSign, OperatorConventions.CONTAINS, containsType, context); ensureBooleanResult(operationSign, OperatorConventions.CONTAINS, containsType, context);
if (left != null) { if (left != null) {
@@ -1174,7 +1174,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
dataFlowInfo = facade.getTypeInfo(right, contextWithDataFlow).getDataFlowInfo(); dataFlowInfo = facade.getTypeInfo(right, contextWithDataFlow).getDataFlowInfo();
} }
return JetTypeInfo.create(OverloadResolutionResultsUtil.getResultingType(resolutionResults, context.resolveMode), dataFlowInfo); return JetTypeInfo.create(OverloadResolutionResultsUtil.getResultingType(resolutionResults, context.contextDependency), dataFlowInfo);
} }
@NotNull @NotNull
@@ -41,7 +41,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull ExpressionPosition expressionPosition @NotNull ExpressionPosition expressionPosition
) { ) {
return newContext(expressionTypingServices, new LabelResolver(), trace, scope, dataFlowInfo, expectedType, expressionPosition, return newContext(expressionTypingServices, new LabelResolver(), trace, scope, dataFlowInfo, expectedType, expressionPosition,
ResolveMode.TOP_LEVEL_CALL, ResolutionResultsCacheImpl.create()); ContextDependency.INDEPENDENT, ResolutionResultsCacheImpl.create());
} }
@NotNull @NotNull
@@ -51,7 +51,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
) { ) {
return newContext(expressionTypingServices, new LabelResolver(), resolutionContext.trace, resolutionContext.scope, return newContext(expressionTypingServices, new LabelResolver(), resolutionContext.trace, resolutionContext.scope,
resolutionContext.dataFlowInfo, resolutionContext.expectedType, resolutionContext.expressionPosition, resolutionContext.dataFlowInfo, resolutionContext.expectedType, resolutionContext.expressionPosition,
resolutionContext.resolveMode, resolutionContext.resolutionResultsCache); resolutionContext.contextDependency, resolutionContext.resolutionResultsCache);
} }
@NotNull @NotNull
@@ -63,11 +63,11 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return new ExpressionTypingContext( return new ExpressionTypingContext(
expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType, expressionPosition, resolveMode, resolutionResultsCache); expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache);
} }
public final ExpressionTypingServices expressionTypingServices; public final ExpressionTypingServices expressionTypingServices;
@@ -84,10 +84,10 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, resolveMode, resolutionResultsCache); super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache);
this.expressionTypingServices = expressionTypingServices; this.expressionTypingServices = expressionTypingServices;
this.labelResolver = labelResolver; this.labelResolver = labelResolver;
} }
@@ -99,11 +99,11 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolveMode resolveMode, @NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return new ExpressionTypingContext(expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType, return new ExpressionTypingContext(expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType,
expressionPosition, resolveMode, resolutionResultsCache); expressionPosition, contextDependency, resolutionResultsCache);
} }
@Override @Override
@@ -332,7 +332,7 @@ public class ExpressionTypingServices {
private ExpressionTypingContext createContext(ExpressionTypingContext oldContext, BindingTrace trace, WritableScope scope, DataFlowInfo dataFlowInfo, JetType expectedType) { private ExpressionTypingContext createContext(ExpressionTypingContext oldContext, BindingTrace trace, WritableScope scope, DataFlowInfo dataFlowInfo, JetType expectedType) {
return ExpressionTypingContext.newContext(this, oldContext.labelResolver, trace, scope, dataFlowInfo, expectedType, return ExpressionTypingContext.newContext(this, oldContext.labelResolver, trace, scope, dataFlowInfo, expectedType,
oldContext.expressionPosition, oldContext.resolveMode, oldContext.resolutionResultsCache); oldContext.expressionPosition, oldContext.contextDependency, oldContext.resolutionResultsCache);
} }
@Nullable @Nullable
@@ -244,7 +244,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
OverloadResolutionResults<FunctionDescriptor> assignmentOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall( OverloadResolutionResults<FunctionDescriptor> assignmentOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall(
scope, name, context.replaceTraceAndCache(temporaryForAssignmentOperation), expression, receiver); scope, name, context.replaceTraceAndCache(temporaryForAssignmentOperation), expression, receiver);
JetType assignmentOperationType = OverloadResolutionResultsUtil.getResultingType(assignmentOperationDescriptors, JetType assignmentOperationType = OverloadResolutionResultsUtil.getResultingType(assignmentOperationDescriptors,
context.resolveMode); context.contextDependency);
// Check for '+' // Check for '+'
Name counterpartName = OperatorConventions.BINARY_OPERATION_NAMES.get(OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.get(operationType)); Name counterpartName = OperatorConventions.BINARY_OPERATION_NAMES.get(OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.get(operationType));
@@ -252,7 +252,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
context, "trace to check binary operation like '+' for", expression); context, "trace to check binary operation like '+' for", expression);
OverloadResolutionResults<FunctionDescriptor> binaryOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall( OverloadResolutionResults<FunctionDescriptor> binaryOperationDescriptors = BasicExpressionTypingVisitor.getResolutionResultsForBinaryCall(
scope, counterpartName, context.replaceTraceAndCache(temporaryForBinaryOperation), expression, receiver); scope, counterpartName, context.replaceTraceAndCache(temporaryForBinaryOperation), expression, receiver);
JetType binaryOperationType = OverloadResolutionResultsUtil.getResultingType(binaryOperationDescriptors, context.resolveMode); JetType binaryOperationType = OverloadResolutionResultsUtil.getResultingType(binaryOperationDescriptors, context.contextDependency);
JetType type = assignmentOperationType != null ? assignmentOperationType : binaryOperationType; JetType type = assignmentOperationType != null ? assignmentOperationType : binaryOperationType;
if (assignmentOperationDescriptors.isSuccess() && binaryOperationDescriptors.isSuccess()) { if (assignmentOperationDescriptors.isSuccess() && binaryOperationDescriptors.isSuccess()) {