[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
This commit is contained in:
Aleksei.Cherepanov
2021-09-02 12:30:21 +03:00
committed by Nikita Bobko
parent f445cfcb78
commit 40dc548fec
5 changed files with 49 additions and 10 deletions
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.build.report.ICReporterBase import org.jetbrains.kotlin.build.report.ICReporterBase
import org.jetbrains.kotlin.jps.KotlinJpsBundle 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.JpsIncrementalCache
import org.jetbrains.kotlin.jps.incremental.JpsLookupStorageManager import org.jetbrains.kotlin.jps.incremental.JpsLookupStorageManager
import org.jetbrains.kotlin.jps.model.kotlinKind import org.jetbrains.kotlin.jps.model.kotlinKind
@@ -230,6 +231,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
incrementalCaches, incrementalCaches,
LookupTracker.DO_NOTHING, LookupTracker.DO_NOTHING,
ExpectActualTracker.DoNothing, ExpectActualTracker.DoNothing,
InlineConstTracker.DoNothing,
chunk, chunk,
messageCollector messageCollector
) ?: return ) ?: return
@@ -398,12 +400,14 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val lookupTracker = getLookupTracker(project, representativeTarget) val lookupTracker = getLookupTracker(project, representativeTarget)
val exceptActualTracer = ExpectActualTrackerImpl() val exceptActualTracer = ExpectActualTrackerImpl()
val incrementalCaches = kotlinChunk.loadCaches() val incrementalCaches = kotlinChunk.loadCaches()
val inlineConstTracker = InlineConstTrackerImpl()
val environment = createCompileEnvironment( val environment = createCompileEnvironment(
context, context,
representativeTarget, representativeTarget,
incrementalCaches, incrementalCaches,
lookupTracker, lookupTracker,
exceptActualTracer, exceptActualTracer,
inlineConstTracker,
chunk, chunk,
messageCollector messageCollector
) ?: return ABORT ) ?: return ABORT
@@ -472,7 +476,8 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
chunk, chunk,
kotlinDirtyFilesHolder, kotlinDirtyFilesHolder,
generatedFiles, generatedFiles,
incrementalCaches incrementalCaches,
environment
) )
if (!representativeTarget.isIncrementalCompilationEnabled) { if (!representativeTarget.isIncrementalCompilationEnabled) {
@@ -566,11 +571,12 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>, incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker, exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker,
chunk: ModuleChunk, chunk: ModuleChunk,
messageCollector: MessageCollectorAdapter messageCollector: MessageCollectorAdapter
): JpsCompilerEnvironment? { ): JpsCompilerEnvironment? {
val compilerServices = with(Services.Builder()) { val compilerServices = with(Services.Builder()) {
kotlinModuleBuilderTarget.makeServices(this, incrementalCaches, lookupTracker, exceptActualTracer) kotlinModuleBuilderTarget.makeServices(this, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker)
build() build()
} }
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.incremental.ChangesCollector import org.jetbrains.kotlin.incremental.ChangesCollector
import org.jetbrains.kotlin.incremental.IncrementalJsCache import org.jetbrains.kotlin.incremental.IncrementalJsCache
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker 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.components.LookupTracker
import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
import org.jetbrains.kotlin.incremental.js.IncrementalDataProviderFromCache import org.jetbrains.kotlin.incremental.js.IncrementalDataProviderFromCache
@@ -67,9 +68,10 @@ class KotlinJsModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleBu
builder: Services.Builder, builder: Services.Builder,
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>, incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker
) { ) {
super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer) super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker)
with(builder) { with(builder) {
register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl()) register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl())
@@ -11,6 +11,7 @@ import com.intellij.util.containers.FileCollectionFactory
import com.intellij.util.io.URLUtil import com.intellij.util.io.URLUtil
import org.jetbrains.jps.ModuleChunk import org.jetbrains.jps.ModuleChunk
import org.jetbrains.jps.builders.java.JavaBuilderUtil 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.builders.storage.BuildDataPaths
import org.jetbrains.jps.incremental.* import org.jetbrains.jps.incremental.*
import org.jetbrains.jps.model.java.JpsJavaExtensionService 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.config.Services
import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker 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.components.LookupTracker
import org.jetbrains.kotlin.jps.build.KotlinBuilder import org.jetbrains.kotlin.jps.build.KotlinBuilder
import org.jetbrains.kotlin.jps.build.KotlinCompileContext import org.jetbrains.kotlin.jps.build.KotlinCompileContext
@@ -76,9 +78,10 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
builder: Services.Builder, builder: Services.Builder,
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>, incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker
) { ) {
super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer) super.makeServices(builder, incrementalCaches, lookupTracker, exceptActualTracer, inlineConstTracker)
with(builder) { with(builder) {
register( register(
@@ -328,10 +331,12 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
chunk: ModuleChunk, chunk: ModuleChunk,
dirtyFilesHolder: KotlinDirtySourceFilesHolder, dirtyFilesHolder: KotlinDirtySourceFilesHolder,
outputItems: Map<ModuleBuildTarget, Iterable<GeneratedFile>>, outputItems: Map<ModuleBuildTarget, Iterable<GeneratedFile>>,
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache> incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
environment: JpsCompilerEnvironment
) { ) {
val previousMappings = localContext.projectDescriptor.dataManager.mappings val previousMappings = localContext.projectDescriptor.dataManager.mappings
val callback = JavaBuilderUtil.getDependenciesRegistrar(localContext) val callback = JavaBuilderUtil.getDependenciesRegistrar(localContext)
val inlineConstTracker = environment.services[InlineConstTracker::class.java] as InlineConstTrackerImpl
val targetDirtyFiles: Map<ModuleBuildTarget, Set<File>> = chunk.targets.keysToMap { val targetDirtyFiles: Map<ModuleBuildTarget, Set<File>> = chunk.targets.keysToMap {
val files = HashSet<File>() val files = HashSet<File>()
@@ -360,6 +365,28 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB
sourceFiles.removeAll(targetDirtyFiles[target] ?: emptySet()) sourceFiles.removeAll(targetDirtyFiles[target] ?: emptySet())
sourceFiles.addAll(output.sourceFiles) 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( callback.associate(
FileUtil.toSystemIndependentName(output.outputFile.canonicalPath), FileUtil.toSystemIndependentName(output.outputFile.canonicalPath),
sourceFiles.map { FileUtil.toSystemIndependentName(it.canonicalPath) }, sourceFiles.map { FileUtil.toSystemIndependentName(it.canonicalPath) },
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.incremental.ChangesCollector import org.jetbrains.kotlin.incremental.ChangesCollector
import org.jetbrains.kotlin.incremental.ExpectActualTrackerImpl import org.jetbrains.kotlin.incremental.ExpectActualTrackerImpl
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker 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.components.LookupTracker
import org.jetbrains.kotlin.jps.KotlinJpsBundle import org.jetbrains.kotlin.jps.KotlinJpsBundle
import org.jetbrains.kotlin.jps.build.* import org.jetbrains.kotlin.jps.build.*
@@ -248,7 +249,8 @@ abstract class KotlinModuleBuildTarget<BuildMetaInfoType : BuildMetaInfo> intern
chunk: ModuleChunk, chunk: ModuleChunk,
dirtyFilesHolder: KotlinDirtySourceFilesHolder, dirtyFilesHolder: KotlinDirtySourceFilesHolder,
outputItems: Map<ModuleBuildTarget, Iterable<GeneratedFile>>, outputItems: Map<ModuleBuildTarget, Iterable<GeneratedFile>>,
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache> incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
environment: JpsCompilerEnvironment
) { ) {
// by default do nothing // by default do nothing
} }
@@ -271,7 +273,8 @@ abstract class KotlinModuleBuildTarget<BuildMetaInfoType : BuildMetaInfo> intern
builder: Services.Builder, builder: Services.Builder,
incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>, incrementalCaches: Map<KotlinModuleBuildTarget<*>, JpsIncrementalCache>,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
exceptActualTracer: ExpectActualTracker exceptActualTracer: ExpectActualTracker,
inlineConstTracker: InlineConstTracker
) { ) {
with(builder) { with(builder) {
register(LookupTracker::class.java, lookupTracker) register(LookupTracker::class.java, lookupTracker)
@@ -281,6 +284,7 @@ abstract class KotlinModuleBuildTarget<BuildMetaInfoType : BuildMetaInfo> intern
if (jpsGlobalContext.cancelStatus.isCanceled) throw CompilationCanceledException() if (jpsGlobalContext.cancelStatus.isCanceled) throw CompilationCanceledException()
} }
}) })
register(InlineConstTracker::class.java, inlineConstTracker)
} }
} }
@@ -2,4 +2,4 @@ import JavaClass.Inner.InnerInner.CONST
fun main() { fun main() {
val myKotlinConst = CONST val myKotlinConst = CONST
} }