From cbbac2f2ef98333fea7dbc8a424bd9b476c3111f Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Thu, 14 Mar 2013 18:26:53 +0400 Subject: [PATCH] cache resolution data by callKey instead of expression --- .../jet/lang/resolve/calls/CallResolver.java | 22 +++++++-------- .../lang/resolve/calls/CallResolverUtil.java | 18 ++++++++++++ .../calls/context/ResolutionResultsCache.java | 28 ++++++++----------- 3 files changed, 40 insertions(+), 28 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 c55c290ee99..cbab21a2dc7 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 @@ -265,15 +265,14 @@ public class CallResolver { @NotNull CallTransformer callTransformer, @NotNull JetReferenceExpression reference ) { - PsiElement element = context.call.getCallElement(); OverloadResolutionResultsImpl results = null; TracingStrategy tracing = prioritizedTasks.isEmpty() ? TracingStrategy.EMPTY : prioritizedTasks.iterator().next().tracing; TemporaryBindingTrace traceToResolveCall = TemporaryBindingTrace.create(context.trace, "trace to resolve call", context.call); - if (element instanceof JetExpression) { - CallKey key = CallKey.create(context.call.getCallType(), (JetExpression) element); - OverloadResolutionResultsImpl cachedResults = context.resolutionResultsCache.getResolutionResults(key, memberType); + CallKey callKey = CallResolverUtil.createCallKey(context); + if (callKey != null) { + OverloadResolutionResultsImpl cachedResults = context.resolutionResultsCache.getResolutionResults(callKey, memberType); if (cachedResults != null) { - DelegatingBindingTrace deltasTraceForResolve = context.resolutionResultsCache.getResolutionTrace((JetExpression) element); + DelegatingBindingTrace deltasTraceForResolve = context.resolutionResultsCache.getResolutionTrace(callKey); assert deltasTraceForResolve != null; deltasTraceForResolve.addAllMyDataTo(traceToResolveCall); results = cachedResults; @@ -356,21 +355,20 @@ public class CallResolver { @NotNull DelegatingBindingTrace traceToResolveCall, @NotNull TracingStrategy tracing ) { - PsiElement callElement = context.call.getCallElement(); - if (!(callElement instanceof JetExpression)) return; - DelegatingBindingTrace deltasTraceToCacheResolve = new DelegatingBindingTrace( new BindingTraceContext().getBindingContext(), "delta trace for caching resolve of", context.call); traceToResolveCall.addAllMyDataTo(deltasTraceToCacheResolve); - JetExpression callExpression = (JetExpression) callElement; - context.resolutionResultsCache.recordResolutionResults(CallKey.create(context.call.getCallType(), callExpression), memberType, results); - context.resolutionResultsCache.recordResolutionTrace(callExpression, deltasTraceToCacheResolve); + CallKey callKey = CallResolverUtil.createCallKey(context); + if (callKey == null) return; + + context.resolutionResultsCache.recordResolutionResults(callKey, memberType, results); + context.resolutionResultsCache.recordResolutionTrace(callKey, deltasTraceToCacheResolve); if (results.isSingleResult() && memberType == ResolutionResultsCache.FUNCTION_MEMBER_TYPE) { CallCandidateResolutionContext callCandidateResolutionContext = CallCandidateResolutionContext.createForCallBeingAnalyzed( results.getResultingCall().getCallToCompleteTypeArgumentInference(), context, tracing); - context.resolutionResultsCache.recordDeferredComputationForCall(callExpression, callCandidateResolutionContext, memberType); + context.resolutionResultsCache.recordDeferredComputationForCall(callKey, callCandidateResolutionContext, memberType); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java index b57897654ae..c100dc7374e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java @@ -17,12 +17,18 @@ package org.jetbrains.jet.lang.resolve.calls; import com.google.common.collect.Lists; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.psi.Call; +import org.jetbrains.jet.lang.psi.CallKey; +import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.TraceUtil; +import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext; import org.jetbrains.jet.lang.resolve.calls.context.CallResolutionContext; import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintSystem; import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintsUtil; @@ -36,6 +42,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import static org.jetbrains.jet.lang.resolve.calls.CallTransformer.CallForImplicitInvoke; + public class CallResolverUtil { public static final JetType DONT_CARE = ErrorUtils.createErrorTypeWithCustomDebugName("DONT_CARE"); @@ -125,4 +133,14 @@ public class CallResolverUtil { } return false; } + + @Nullable + public static CallKey createCallKey(@NotNull BasicCallResolutionContext context) { + if (context.call.getCallType() == Call.CallType.INVOKE) { + return null; + } + PsiElement callElement = context.call.getCallElement(); + if (!(callElement instanceof JetExpression)) return null; + return CallKey.create(context.call.getCallType(), (JetExpression) callElement); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/context/ResolutionResultsCache.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/context/ResolutionResultsCache.java index 50eb7cddc5f..47d3f06b61b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/context/ResolutionResultsCache.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/context/ResolutionResultsCache.java @@ -22,11 +22,9 @@ import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.psi.CallKey; -import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace; -import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl; import org.jetbrains.jet.util.slicedmap.Slices; import org.jetbrains.jet.util.slicedmap.WritableSlice; @@ -34,16 +32,14 @@ import org.jetbrains.jet.util.slicedmap.WritableSlice; public class ResolutionResultsCache { public static class MemberType {} - private static class FunctionMemberType extends MemberType {} - private static class PropertyMemberType extends MemberType {} - public static final FunctionMemberType FUNCTION_MEMBER_TYPE = new FunctionMemberType(); - public static final PropertyMemberType PROPERTY_MEMBER_TYPE = new PropertyMemberType(); + public static final MemberType FUNCTION_MEMBER_TYPE = new MemberType(); + public static final MemberType PROPERTY_MEMBER_TYPE = new MemberType(); private static final WritableSlice> RESOLUTION_RESULTS_FOR_FUNCTION = Slices.createSimpleSlice(); private static final WritableSlice> RESOLUTION_RESULTS_FOR_PROPERTY = Slices.createSimpleSlice(); - private static final WritableSlice TRACE_DELTAS_CACHE = Slices.createSimpleSlice(); - private static final WritableSlice> DEFERRED_COMPUTATION_FOR_CALL = Slices.createSimpleSlice(); + private static final WritableSlice TRACE_DELTAS_CACHE = Slices.createSimpleSlice(); + private static final WritableSlice> DEFERRED_COMPUTATION_FOR_CALL = Slices.createSimpleSlice(); private final BindingTrace trace = new BindingTraceContext(); @@ -62,27 +58,27 @@ public class ResolutionResultsCache { return trace.get(getSliceByMemberType(memberType), callKey); } - public void recordResolutionTrace(@NotNull JetExpression expression, @NotNull DelegatingBindingTrace delegatingTrace) { - trace.record(TRACE_DELTAS_CACHE, expression, delegatingTrace); + public void recordResolutionTrace(@NotNull CallKey callKey, @NotNull DelegatingBindingTrace delegatingTrace) { + trace.record(TRACE_DELTAS_CACHE, callKey, delegatingTrace); } @Nullable - public DelegatingBindingTrace getResolutionTrace(@NotNull JetExpression expression) { - return trace.get(TRACE_DELTAS_CACHE, expression); + public DelegatingBindingTrace getResolutionTrace(@NotNull CallKey callKey) { + return trace.get(TRACE_DELTAS_CACHE, callKey); } public void recordDeferredComputationForCall( - @NotNull JetExpression expression, + @NotNull CallKey callKey, @NotNull CallCandidateResolutionContext deferredComputation, @NotNull MemberType memberType ) { if (memberType == PROPERTY_MEMBER_TYPE) return; - trace.record(DEFERRED_COMPUTATION_FOR_CALL, expression, (CallCandidateResolutionContext) deferredComputation); + trace.record(DEFERRED_COMPUTATION_FOR_CALL, callKey, (CallCandidateResolutionContext) deferredComputation); } @Nullable - public CallCandidateResolutionContext getDeferredComputation(@NotNull JetExpression expression) { - return trace.get(DEFERRED_COMPUTATION_FOR_CALL, expression); + public CallCandidateResolutionContext getDeferredComputation(@NotNull CallKey callKey) { + return trace.get(DEFERRED_COMPUTATION_FOR_CALL, callKey); } @NotNull