diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 3931cade022..07f03d994a6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -317,7 +317,7 @@ public class CallResolver { results = completeTypeInferenceDependentOnExpectedType(context, results, tracing); if (results.isSingleResult()) { //todo clean internal data for several resulting calls - results.getResultingCall().cleanInternalData(); + results.getResultingCall().markCallAsCompleted(); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 96ee6759fb6..1a192b71c0a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -370,12 +370,12 @@ public class CandidateResolver { JetType result = BindingContextUtils.updateRecordedType( type, expression, context.trace, isFairSafeCallExpression(expression, context.trace)); - contextForArgument.candidateCall.cleanInternalData(); + contextForArgument.candidateCall.markCallAsCompleted(); // clean data for "invoke" calls ResolvedCallWithTrace resolvedCall = context.resolutionResultsCache.getCallForArgument(keyExpression); assert resolvedCall != null : "Resolved call for '" + keyExpression + "' is not stored, but CallCandidateResolutionContext is."; - resolvedCall.cleanInternalData(); + resolvedCall.markCallAsCompleted(); DataFlowUtils.checkType(result, expression, contextForArgument); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java index 367a490106a..6444cbd543c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java @@ -88,7 +88,7 @@ public class ResolvedCallImpl implements ResolvedC private boolean hasUnknownTypeParameters = false; private ConstraintSystem constraintSystem = null; private boolean hasInferredReturnType; - private boolean cleaned = false; + private boolean completed = false; private ResolvedCallImpl( @NotNull ResolutionCandidate candidate, @@ -133,32 +133,13 @@ public class ResolvedCallImpl implements ResolvedC @Override @NotNull public DelegatingBindingTrace getTrace() { - checkCallIsUnfinished("Trace"); + assertNotCompleted("Trace"); return trace; } - @Override - public void cleanInternalData() { - if (!cleaned) { - hasInferredReturnType = CallResolverUtil.hasInferredReturnType(candidateDescriptor, constraintSystem); - } - trace = null; - constraintSystem = null; - tracing = null; - cleaned = true; - } - - public boolean hasInferredReturnType() { - return hasInferredReturnType; - } - - private void checkCallIsUnfinished(String elementName) { - if (cleaned) throw new IllegalStateException(elementName + " is erased after resolution completion."); - } - @NotNull public TracingStrategy getTracing() { - checkCallIsUnfinished("TracingStrategy"); + assertNotCompleted("TracingStrategy"); return tracing; } @@ -205,7 +186,7 @@ public class ResolvedCallImpl implements ResolvedC @Nullable public ConstraintSystem getConstraintSystem() { - checkCallIsUnfinished("ConstraintSystem"); + assertNotCompleted("ConstraintSystem"); return constraintSystem; } @@ -306,4 +287,24 @@ public class ResolvedCallImpl implements ResolvedC public ResolvedCallImpl getCallToCompleteTypeArgumentInference() { return this; } + + public boolean hasInferredReturnType() { + if (!completed) throw new IllegalStateException("Inferred return type is not known before resolution completion."); + return hasInferredReturnType; + } + + @Override + public void markCallAsCompleted() { + if (!completed) { + hasInferredReturnType = CallResolverUtil.hasInferredReturnType(candidateDescriptor, constraintSystem); + } + trace = null; + constraintSystem = null; + tracing = null; + completed = true; + } + + private void assertNotCompleted(String elementName) { + if (completed) throw new IllegalStateException(elementName + " is erased after resolution completion."); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallWithTrace.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallWithTrace.java index fa73d251db7..bb394ddddc3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallWithTrace.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallWithTrace.java @@ -46,5 +46,5 @@ public interface ResolvedCallWithTrace extends Res @NotNull ResolvedCallImpl getCallToCompleteTypeArgumentInference(); - void cleanInternalData(); + void markCallAsCompleted(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/VariableAsFunctionResolvedCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/VariableAsFunctionResolvedCall.java index a8cb7ec781d..023878fba5e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/VariableAsFunctionResolvedCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/VariableAsFunctionResolvedCall.java @@ -139,8 +139,8 @@ public class VariableAsFunctionResolvedCall implements ResolvedCallWithTrace