From 0f565598230fd020bc2d7a54821353594830a803 Mon Sep 17 00:00:00 2001 From: svtk Date: Wed, 30 Oct 2013 19:24:09 +0400 Subject: [PATCH] Clean internal data in resolved call after it's built. Not to store heavy and unnecessary any longer traces in resolved call. --- .../jet/lang/resolve/calls/CallResolver.java | 4 ++++ .../lang/resolve/calls/CandidateResolver.java | 8 +++----- .../resolve/calls/model/ResolvedCallImpl.java | 20 +++++++++++++++++-- .../calls/model/ResolvedCallWithTrace.java | 2 ++ .../model/VariableAsFunctionResolvedCall.java | 6 ++++++ 5 files changed, 33 insertions(+), 7 deletions(-) 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 e73a5e43895..15033992632 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 @@ -313,6 +313,10 @@ public class CallResolver { if (!prioritizedTasks.isEmpty() && context.contextDependency == ContextDependency.INDEPENDENT) { results = completeTypeInferenceDependentOnExpectedType(context, results, tracing); + if (results.isSingleResult()) { + //todo clean internal data for several resulting calls + results.getResultingCall().cleanInternalData(); + } } context.callResolverExtension.run(results, context); 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 13330e3b107..86c8783e424 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 @@ -25,16 +25,12 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.calls.autocasts.*; import org.jetbrains.jet.lang.resolve.calls.context.*; import org.jetbrains.jet.lang.resolve.calls.inference.*; -import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments; -import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; -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.*; import org.jetbrains.jet.lang.resolve.calls.results.ResolutionDebugInfo; import org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus; import org.jetbrains.jet.lang.resolve.calls.tasks.ResolutionTask; @@ -373,6 +369,8 @@ public class CandidateResolver { } JetType result = BindingContextUtils.updateRecordedType( type, expression, context.trace, isFairSafeCallExpression(expression, context.trace)); + + contextForArgument.candidateCall.cleanInternalData(); 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 c64ddafae6d..ba284fb463b 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 @@ -81,11 +81,12 @@ public class ResolvedCallImpl implements ResolvedC private final Set unmappedArguments = Sets.newLinkedHashSet(); private boolean someArgumentHasNoType = false; - private final DelegatingBindingTrace trace; - private final TracingStrategy tracing; + private DelegatingBindingTrace trace; + private TracingStrategy tracing; private ResolutionStatus status = UNKNOWN_STATUS; private boolean hasUnknownTypeParameters = false; private ConstraintSystem constraintSystem = null; + private boolean cleaned = false; private ResolvedCallImpl( @NotNull ResolutionCandidate candidate, @@ -130,11 +131,25 @@ public class ResolvedCallImpl implements ResolvedC @Override @NotNull public DelegatingBindingTrace getTrace() { + checkCallIsUnfinished("Trace"); return trace; } + @Override + public void cleanInternalData() { + trace = null; + constraintSystem = null; + tracing = null; + cleaned = true; + } + + private void checkCallIsUnfinished(String elementName) { + if (cleaned) throw new IllegalStateException(elementName + " is erased after resolution completion."); + } + @NotNull public TracingStrategy getTracing() { + checkCallIsUnfinished("TracingStrategy"); return tracing; } @@ -181,6 +196,7 @@ public class ResolvedCallImpl implements ResolvedC @Nullable public ConstraintSystem getConstraintSystem() { + checkCallIsUnfinished("ConstraintSystem"); return constraintSystem; } 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 3639226ccd7..fa73d251db7 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 @@ -45,4 +45,6 @@ public interface ResolvedCallWithTrace extends Res */ @NotNull ResolvedCallImpl getCallToCompleteTypeArgumentInference(); + + void cleanInternalData(); } 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 75856d8f0ba..a8cb7ec781d 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 @@ -137,4 +137,10 @@ public class VariableAsFunctionResolvedCall implements ResolvedCallWithTrace