From 8fabb6945eeb45321f332f6e085e3ec3bf33b7d7 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 1 Jun 2017 20:06:57 +0300 Subject: [PATCH] Allow slice rewrite in trace when in IDE --- .../JvmSerializationBindings.java | 2 +- .../kotlin/resolve/BindingTraceContext.java | 10 +++++-- .../kotlin/resolve/CodeAnalyzerInitializer.kt | 6 ++-- .../kotlin/resolve/DelegatingBindingTrace.kt | 28 +++++++++++++------ .../kotlin/resolve/TemporaryBindingTrace.java | 2 +- .../kotlin/resolve/calls/CallResolver.java | 2 +- .../kotlin/util/slicedMap/SlicedMapImpl.java | 11 ++++---- .../util/slicedMap/TrackingSlicedMap.java | 1 + .../idea/caches/resolve/KotlinResolveCache.kt | 2 +- .../idea/project/ResolveElementCache.kt | 4 +-- 10 files changed, 42 insertions(+), 26 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializationBindings.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializationBindings.java index b438fc7078f..6a195f292a2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializationBindings.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializationBindings.java @@ -59,7 +59,7 @@ public final class JvmSerializationBindings { BasicWritableSlice.initSliceDebugNames(JvmSerializationBindings.class); } - private final MutableSlicedMap map = SlicedMapImpl.create(); + private final MutableSlicedMap map = new SlicedMapImpl(false); public void put(@NotNull SerializationMappingSlice slice, @NotNull K key, @NotNull V value) { map.put(slice, key, value); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingTraceContext.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingTraceContext.java index a4653acda65..57bb8b3859c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingTraceContext.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingTraceContext.java @@ -79,12 +79,16 @@ public class BindingTraceContext implements BindingTrace { }; public BindingTraceContext() { - this(BindingTraceFilter.Companion.getACCEPT_ALL()); + this(false); } - public BindingTraceContext(BindingTraceFilter filter) { + public BindingTraceContext(boolean allowSliceRewrite) { + this(BindingTraceFilter.Companion.getACCEPT_ALL(), allowSliceRewrite); + } + + public BindingTraceContext(BindingTraceFilter filter, boolean allowSliceRewrite) { //noinspection ConstantConditions - this(TRACK_REWRITES ? new TrackingSlicedMap(TRACK_WITH_STACK_TRACES) : SlicedMapImpl.create(), filter); + this(TRACK_REWRITES && !allowSliceRewrite ? new TrackingSlicedMap(TRACK_WITH_STACK_TRACES) : new SlicedMapImpl(allowSliceRewrite), filter); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CodeAnalyzerInitializer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CodeAnalyzerInitializer.kt index 3be6f8bbcb8..87d2fc31215 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CodeAnalyzerInitializer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CodeAnalyzerInitializer.kt @@ -16,10 +16,10 @@ package org.jetbrains.kotlin.resolve -import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer -import com.intellij.openapi.project.Project import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer interface CodeAnalyzerInitializer { fun initialize(trace: BindingTrace, module: ModuleDescriptor, codeAnalyzer: KotlinCodeAnalyzer) @@ -36,5 +36,5 @@ class DummyCodeAnalyzerInitializer: CodeAnalyzerInitializer { // Do nothing } - override fun createTrace(): BindingTrace = BindingTraceContext() + override fun createTrace(): BindingTrace = BindingTraceContext(true) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt index 85e0bd042ba..a477b689273 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt @@ -26,11 +26,19 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo import org.jetbrains.kotlin.util.slicedMap.* -open class DelegatingBindingTrace(private val parentContext: BindingContext, - private val name: String, - withParentDiagnostics: Boolean = true, - private val filter: BindingTraceFilter = BindingTraceFilter.ACCEPT_ALL) : BindingTrace { - private val map = if (BindingTraceContext.TRACK_REWRITES) TrackingSlicedMap(BindingTraceContext.TRACK_WITH_STACK_TRACES) else SlicedMapImpl.create() +open class DelegatingBindingTrace( + private val parentContext: BindingContext, + private val name: String, + withParentDiagnostics: Boolean = true, + private val filter: BindingTraceFilter = BindingTraceFilter.ACCEPT_ALL, + allowSliceRewrite: Boolean = false +) : BindingTrace { + + private val map = if (BindingTraceContext.TRACK_REWRITES && !allowSliceRewrite) + TrackingSlicedMap(BindingTraceContext.TRACK_WITH_STACK_TRACES) + else + SlicedMapImpl(allowSliceRewrite) + private val mutableDiagnostics: MutableDiagnosticsWithSuppression? private inner class MyBindingContext : BindingContext { @@ -72,10 +80,12 @@ open class DelegatingBindingTrace(private val parentContext: BindingContext, constructor(parentContext: BindingContext, debugName: String, resolutionSubjectForMessage: Any?, - filter: BindingTraceFilter = BindingTraceFilter.ACCEPT_ALL) - : this(parentContext, - AnalyzingUtils.formDebugNameForBindingTrace(debugName, resolutionSubjectForMessage), - filter = filter) + filter: BindingTraceFilter = BindingTraceFilter.ACCEPT_ALL, + allowSliceRewrite: Boolean = false + ) : this(parentContext, + AnalyzingUtils.formDebugNameForBindingTrace(debugName, resolutionSubjectForMessage), + filter = filter, + allowSliceRewrite = allowSliceRewrite) override fun getBindingContext(): BindingContext = bindingContext diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TemporaryBindingTrace.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TemporaryBindingTrace.java index 23df6ed01e8..1c2d37ccc1e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TemporaryBindingTrace.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TemporaryBindingTrace.java @@ -39,7 +39,7 @@ public class TemporaryBindingTrace extends DelegatingBindingTrace { protected final BindingTrace trace; protected TemporaryBindingTrace(@NotNull BindingTrace trace, String debugName, BindingTraceFilter filter) { - super(trace.getBindingContext(), debugName, true, filter); + super(trace.getBindingContext(), debugName, true, filter, false); this.trace = trace; } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index 5a6c3085931..535ac53eea6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -587,7 +587,7 @@ public class CallResolver { if (CallResolverUtilKt.isInvokeCallOnVariable(call)) return; DelegatingBindingTrace deltasTraceToCacheResolve = new DelegatingBindingTrace( - BindingContext.EMPTY, "delta trace for caching resolve of", context.call, BindingTraceFilter.Companion.getACCEPT_ALL()); + BindingContext.EMPTY, "delta trace for caching resolve of", context.call, BindingTraceFilter.Companion.getACCEPT_ALL(), false); traceToResolveCall.addOwnDataTo(deltasTraceToCacheResolve); context.resolutionResultsCache.record(call, results, context, tracing, deltasTraceToCacheResolve); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java index 07e8069e997..34359784b17 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java @@ -31,13 +31,14 @@ import java.util.Map; public class SlicedMapImpl implements MutableSlicedMap { - public static SlicedMapImpl create() { - return new SlicedMapImpl(); - } - + private final boolean alwaysAllowRewrite; private final Map map = new THashMap<>(0); private Multimap, Object> collectiveSliceKeys = null; + public SlicedMapImpl(boolean alwaysAllowRewrite) { + this.alwaysAllowRewrite = alwaysAllowRewrite; + } + @Override public void put(WritableSlice slice, K key, V value) { if (!slice.check(key, value)) { @@ -52,7 +53,7 @@ public class SlicedMapImpl implements MutableSlicedMap { Key sliceKey = slice.getKey(); RewritePolicy rewritePolicy = slice.getRewritePolicy(); - if (rewritePolicy.rewriteProcessingNeeded(key)) { + if (!alwaysAllowRewrite && rewritePolicy.rewriteProcessingNeeded(key)) { V oldValue = holder.get(sliceKey); if (oldValue != null) { //noinspection unchecked diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java index 3c98bfe8117..bc2165c0110 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java @@ -29,6 +29,7 @@ public class TrackingSlicedMap extends SlicedMapImpl { private final boolean trackWithStackTraces; public TrackingSlicedMap(boolean trackWithStackTraces) { + super(false); this.trackWithStackTraces = trackWithStackTraces; } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt index 42c1f96adb3..66b2b4bffcf 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt @@ -159,7 +159,7 @@ private object KotlinResolveDataProvider { } val resolveSession = componentProvider.get() - val trace = DelegatingBindingTrace(resolveSession.bindingContext, "Trace for resolution of " + analyzableElement) + val trace = DelegatingBindingTrace(resolveSession.bindingContext, "Trace for resolution of " + analyzableElement, allowSliceRewrite = true) val targetPlatform = TargetPlatformDetector.getPlatform(analyzableElement.containingKtFile) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index cccf774bd18..12cc61daf87 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -344,7 +344,7 @@ class ResolveElementCache( } } - val controlFlowTrace = DelegatingBindingTrace(trace.bindingContext, "Element control flow resolve", resolveElement) + val controlFlowTrace = DelegatingBindingTrace(trace.bindingContext, "Element control flow resolve", resolveElement, allowSliceRewrite = true) ControlFlowInformationProvider(resolveElement, controlFlowTrace, resolveElement.languageVersionSettings).checkDeclaration() controlFlowTrace.addOwnDataTo(trace, null, false) @@ -595,7 +595,7 @@ class ResolveElementCache( // All additional resolve should be done to separate trace private fun createDelegatingTrace(resolveElement: KtElement, filter: BindingTraceFilter): BindingTrace { return resolveSession.storageManager.createSafeTrace( - DelegatingBindingTrace(resolveSession.bindingContext, "trace to resolve element", resolveElement, filter)) + DelegatingBindingTrace(resolveSession.bindingContext, "trace to resolve element", resolveElement, filter, allowSliceRewrite = true)) } private class BodyResolveContextForLazy(