From 40dc548fec79e2f9dab14d7be527ac60ef1147b9 Mon Sep 17 00:00:00 2001 From: "Aleksei.Cherepanov" Date: Thu, 2 Sep 2021 12:30:21 +0300 Subject: [PATCH] [CHERRY PICKED FROM IJ] [JPS] Fix incremental build after changing Java constant InlineConstantTracker implemented for tracking changed java static final constants, that used in kotlin. #KT-46506 Fixed GitOrigin-RevId: 63830580acb09d31fe0deede9f82bc1a2847443d Original commit: https://github.com/JetBrains/intellij-community/commit/3736c00c2c8757241e6fd217faef733421eb9e80 --- .../kotlin/jps/build/KotlinBuilder.kt | 10 ++++-- .../jps/targets/KotlinJsModuleBuildTarget.kt | 6 ++-- .../jps/targets/KotlinJvmModuleBuildTarget.kt | 33 +++++++++++++++++-- .../jps/targets/KotlinModuleBuildTarget.kt | 8 +++-- .../javaUsedInKotlin/constantChanged/usage.kt | 2 +- 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index e0f15e5b1d1..8d5f51f2750 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -45,6 +45,7 @@ import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.build.report.ICReporterBase import org.jetbrains.kotlin.jps.KotlinJpsBundle +import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.jps.incremental.JpsIncrementalCache import org.jetbrains.kotlin.jps.incremental.JpsLookupStorageManager import org.jetbrains.kotlin.jps.model.kotlinKind @@ -230,6 +231,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { incrementalCaches, LookupTracker.DO_NOTHING, ExpectActualTracker.DoNothing, + InlineConstTracker.DoNothing, chunk, messageCollector ) ?: return @@ -398,12 +400,14 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val lookupTracker = getLookupTracker(project, representativeTarget) val exceptActualTracer = ExpectActualTrackerImpl() val incrementalCaches = kotlinChunk.loadCaches() + val inlineConstTracker = InlineConstTrackerImpl() val environment = createCompileEnvironment( context, representativeTarget, incrementalCaches, lookupTracker, exceptActualTracer, + inlineConstTracker, chunk, messageCollector ) ?: return ABORT @@ -472,7 +476,8 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { chunk, kotlinDirtyFilesHolder, generatedFiles, - incrementalCaches + incrementalCaches, + environment ) if (!representativeTarget.isIncrementalCompilationEnabled) { @@ -566,11 +571,12 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { incrementalCaches: Map, JpsIncrementalCache>, lookupTracker: LookupTracker, exceptActualTracer: ExpectActualTracker, + inlineConstTracker: InlineConstTracker, chunk: ModuleChunk, messageCollector: MessageCollectorAdapter ): JpsCompilerEnvironment? { val compilerServices = with(Services.Builder()) { - kotlinModuleBuilderTarget.makeServices(this, incrementalCaches, lookupTracker, exceptActualTracer) + kotlinModuleBuilderTarget.makeServices(this, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker) build() } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt index 5bd84a471e6..10fa782b535 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJsModuleBuildTarget.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.ChangesCollector import org.jetbrains.kotlin.incremental.IncrementalJsCache import org.jetbrains.kotlin.incremental.components.ExpectActualTracker +import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalDataProviderFromCache @@ -67,9 +68,10 @@ class KotlinJsModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleBu builder: Services.Builder, incrementalCaches: Map, JpsIncrementalCache>, lookupTracker: LookupTracker, - exceptActualTracer: ExpectActualTracker + exceptActualTracer: ExpectActualTracker, + inlineConstTracker: InlineConstTracker ) { - super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer) + super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker) with(builder) { register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl()) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt index 289abd9f0e6..c3c1a8a8fb0 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt @@ -11,6 +11,7 @@ import com.intellij.util.containers.FileCollectionFactory import com.intellij.util.io.URLUtil import org.jetbrains.jps.ModuleChunk import org.jetbrains.jps.builders.java.JavaBuilderUtil +import org.jetbrains.jps.builders.java.dependencyView.Callbacks import org.jetbrains.jps.builders.storage.BuildDataPaths import org.jetbrains.jps.incremental.* import org.jetbrains.jps.model.java.JpsJavaExtensionService @@ -28,6 +29,7 @@ import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.components.ExpectActualTracker +import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.jps.build.KotlinBuilder import org.jetbrains.kotlin.jps.build.KotlinCompileContext @@ -76,9 +78,10 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB builder: Services.Builder, incrementalCaches: Map, JpsIncrementalCache>, lookupTracker: LookupTracker, - exceptActualTracer: ExpectActualTracker + exceptActualTracer: ExpectActualTracker, + inlineConstTracker: InlineConstTracker ) { - super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer) + super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker) with(builder) { register( @@ -328,10 +331,12 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB chunk: ModuleChunk, dirtyFilesHolder: KotlinDirtySourceFilesHolder, outputItems: Map>, - incrementalCaches: Map, JpsIncrementalCache> + incrementalCaches: Map, JpsIncrementalCache>, + environment: JpsCompilerEnvironment ) { val previousMappings = localContext.projectDescriptor.dataManager.mappings val callback = JavaBuilderUtil.getDependenciesRegistrar(localContext) + val inlineConstTracker = environment.services[InlineConstTracker::class.java] as InlineConstTrackerImpl val targetDirtyFiles: Map> = chunk.targets.keysToMap { val files = HashSet() @@ -360,6 +365,28 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB sourceFiles.removeAll(targetDirtyFiles[target] ?: emptySet()) sourceFiles.addAll(output.sourceFiles) + // process inlineConstTracker + for (sourceFile: File in sourceFiles) { + val cRefs = inlineConstTracker.inlineConstMap[sourceFile.path]?.map { cRef -> + val descriptor = when (cRef.constType) { + "Byte" -> "B" + "Short" -> "S" + "Int" -> "I" + "Long" -> "J" + "Float" -> "F" + "Double" -> "D" + "Boolean" -> "Z" + "Char" -> "C" + "String" -> "Ljava/lang/String;" + else -> "" + } + Callbacks.createConstantReference(cRef.owner, cRef.name, descriptor) + } ?: continue + + val className = output.outputClass.className.internalName + callback.registerConstantReferences(className, cRefs) + } + callback.associate( FileUtil.toSystemIndependentName(output.outputFile.canonicalPath), sourceFiles.map { FileUtil.toSystemIndependentName(it.canonicalPath) }, diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt index fe440e98d21..475667eb718 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinModuleBuildTarget.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.ChangesCollector import org.jetbrains.kotlin.incremental.ExpectActualTrackerImpl import org.jetbrains.kotlin.incremental.components.ExpectActualTracker +import org.jetbrains.kotlin.incremental.components.InlineConstTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.jps.KotlinJpsBundle import org.jetbrains.kotlin.jps.build.* @@ -248,7 +249,8 @@ abstract class KotlinModuleBuildTarget intern chunk: ModuleChunk, dirtyFilesHolder: KotlinDirtySourceFilesHolder, outputItems: Map>, - incrementalCaches: Map, JpsIncrementalCache> + incrementalCaches: Map, JpsIncrementalCache>, + environment: JpsCompilerEnvironment ) { // by default do nothing } @@ -271,7 +273,8 @@ abstract class KotlinModuleBuildTarget intern builder: Services.Builder, incrementalCaches: Map, JpsIncrementalCache>, lookupTracker: LookupTracker, - exceptActualTracer: ExpectActualTracker + exceptActualTracer: ExpectActualTracker, + inlineConstTracker: InlineConstTracker ) { with(builder) { register(LookupTracker::class.java, lookupTracker) @@ -281,6 +284,7 @@ abstract class KotlinModuleBuildTarget intern if (jpsGlobalContext.cancelStatus.isCanceled) throw CompilationCanceledException() } }) + register(InlineConstTracker::class.java, inlineConstTracker) } } diff --git a/jps/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/usage.kt b/jps/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/usage.kt index 17fbe5c2808..94a44fe22c1 100644 --- a/jps/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/usage.kt +++ b/jps/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/usage.kt @@ -2,4 +2,4 @@ import JavaClass.Inner.InnerInner.CONST fun main() { val myKotlinConst = CONST -} \ No newline at end of file +}