diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalModuleInfo.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalModuleInfo.kt index 7941a5396a1..d88a6f523db 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalModuleInfo.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalModuleInfo.kt @@ -21,7 +21,6 @@ data class IncrementalModuleEntry( } class IncrementalModuleInfo( - val projectRoot: File, val rootProjectBuildDir: File, val dirToModule: Map, val nameToModules: Map>, diff --git a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt index 35da79dbe1b..bb30ea3129d 100644 --- a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt +++ b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt @@ -69,7 +69,11 @@ class IncrementalCompilationOptions( */ val outputFiles: List, val multiModuleICSettings: MultiModuleICSettings? = null, - val modulesInfo: IncrementalModuleInfo, + val modulesInfo: IncrementalModuleInfo? = null, + /** + * Root project directory, used to resolve relative paths + */ + val rootProjectDir: File, kotlinScriptExtensions: Array? = null, val withAbiSnapshot: Boolean = false, val preciseCompilationResultsBackup: Boolean = false, diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index b785558760e..273edd8de74 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -556,7 +556,12 @@ abstract class CompileServiceImplBase( } val workingDir = incrementalCompilationOptions.workingDir - val modulesApiHistory = ModulesApiHistoryJs(incrementalCompilationOptions.modulesInfo) + val modulesApiHistory = incrementalCompilationOptions.multiModuleICSettings?.run { + val modulesInfo = incrementalCompilationOptions.modulesInfo + ?: error("The build is configured to use the history-file based IC approach, but doesn't provide the modulesInfo") + + ModulesApiHistoryJs(incrementalCompilationOptions.rootProjectDir, modulesInfo) + } ?: EmptyModulesApiHistory val compiler = IncrementalJsCompilerRunner( workingDir = workingDir, @@ -606,17 +611,20 @@ abstract class CompileServiceImplBase( val workingDir = incrementalCompilationOptions.workingDir + val projectRoot = incrementalCompilationOptions.rootProjectDir + val modulesApiHistory = incrementalCompilationOptions.multiModuleICSettings?.run { - reporter.info { "Use module detection: ${useModuleDetection}" } + reporter.info { "Use module detection: $useModuleDetection" } + val modulesInfo = incrementalCompilationOptions.modulesInfo + ?: error("The build is configured to use the history-file based IC approach, but doesn't provide the modulesInfo") if (!useModuleDetection) { - ModulesApiHistoryJvm(incrementalCompilationOptions.modulesInfo) + ModulesApiHistoryJvm(projectRoot, modulesInfo) } else { - ModulesApiHistoryAndroid(incrementalCompilationOptions.modulesInfo) + ModulesApiHistoryAndroid(projectRoot, modulesInfo) } } ?: EmptyModulesApiHistory - val projectRoot = incrementalCompilationOptions.modulesInfo.projectRoot val useK2 = k2jvmArgs.useK2 || LanguageVersion.fromVersionString(k2jvmArgs.languageVersion)?.usesK2 == true // TODO: This should be reverted after implementing of fir-based java tracker (KT-57147). // See org.jetbrains.kotlin.incremental.CompilerRunnerUtilsKt.makeJvmIncrementally diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/report/getICReporter.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/report/getICReporter.kt index 200b92e8146..d062e45b97e 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/report/getICReporter.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/report/getICReporter.kt @@ -30,7 +30,7 @@ fun getBuildReporter( compilationResults: CompilationResults, compilationOptions: IncrementalCompilationOptions ): RemoteBuildReporter { - val root = compilationOptions.modulesInfo.projectRoot + val root = compilationOptions.rootProjectDir val reporters = ArrayList() if (ReportCategory.IC_MESSAGE.code in compilationOptions.reportCategories) { diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistory.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistory.kt index 289886a22b8..f7154c7513d 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistory.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistory.kt @@ -25,14 +25,14 @@ object EmptyModulesApiHistory : ModulesApiHistory { override fun abiSnapshot(jar: File): Either> = Either.Error("Not supported") } -abstract class ModulesApiHistoryBase(protected val modulesInfo: IncrementalModuleInfo) : ModulesApiHistory { +abstract class ModulesApiHistoryBase(rootProjectDir: File, protected val modulesInfo: IncrementalModuleInfo) : ModulesApiHistory { // All project build dirs should have this dir as their parent. For a default project setup, this will // be the same as root project path. Some projects map output outside of the root project dir, typically // with //build, and in that case, this path will be . // This is using set in order to de-dup paths, and avoid duplicate checks when possible. protected val possibleParentsToBuildDirs: Set = setOf( Paths.get(modulesInfo.rootProjectBuildDir.parentFile.absolutePath), - Paths.get(modulesInfo.projectRoot.absolutePath) + Paths.get(rootProjectDir.absolutePath) ) private val dirToHistoryFileCache = HashMap>() @@ -107,7 +107,7 @@ abstract class ModulesApiHistoryBase(protected val modulesInfo: IncrementalModul protected abstract fun getBuildHistoryFilesForJar(jar: File): Either> } -class ModulesApiHistoryJvm(modulesInfo: IncrementalModuleInfo) : ModulesApiHistoryBase(modulesInfo) { +class ModulesApiHistoryJvm(rootProjectDir: File, modulesInfo: IncrementalModuleInfo) : ModulesApiHistoryBase(rootProjectDir, modulesInfo) { override fun getBuildHistoryFilesForJar(jar: File): Either> { val moduleInfoFromJar = modulesInfo.jarToModule[jar] if (moduleInfoFromJar != null) { @@ -144,7 +144,7 @@ class ModulesApiHistoryJvm(modulesInfo: IncrementalModuleInfo) : ModulesApiHisto } } -class ModulesApiHistoryJs(modulesInfo: IncrementalModuleInfo) : ModulesApiHistoryBase(modulesInfo) { +class ModulesApiHistoryJs(rootProjectDir: File, modulesInfo: IncrementalModuleInfo) : ModulesApiHistoryBase(rootProjectDir, modulesInfo) { override fun getBuildHistoryFilesForJar(jar: File): Either> { val moduleEntry = modulesInfo.jarToModule[jar] @@ -160,8 +160,8 @@ class ModulesApiHistoryJs(modulesInfo: IncrementalModuleInfo) : ModulesApiHistor } } -class ModulesApiHistoryAndroid(modulesInfo: IncrementalModuleInfo) : ModulesApiHistoryBase(modulesInfo) { - private val delegate = ModulesApiHistoryJvm(modulesInfo) +class ModulesApiHistoryAndroid(rootProjectDir: File, modulesInfo: IncrementalModuleInfo) : ModulesApiHistoryBase(rootProjectDir, modulesInfo) { + private val delegate = ModulesApiHistoryJvm(rootProjectDir, modulesInfo) override fun historyFilesForChangedFiles(changedFiles: Set): Either> { val historyFromDelegate = delegate.historyFilesForChangedFiles(changedFiles) diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementaMultiModulelCompilerRunnerTest.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementaMultiModulelCompilerRunnerTest.kt index 8a3c2443802..e2098e35263 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementaMultiModulelCompilerRunnerTest.kt +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementaMultiModulelCompilerRunnerTest.kt @@ -33,7 +33,7 @@ abstract class AbstractIncrementalMultiModuleCompilerRunnerTest() protected val incrementalModuleInfo: IncrementalModuleInfo by lazy { - IncrementalModuleInfo(workingDir, workingDir, dirToModule, nameToModules, jarToClassListFile, jarToModule, jarToAbiSnapshot) + IncrementalModuleInfo(workingDir, dirToModule, nameToModules, jarToClassListFile, jarToModule, jarToAbiSnapshot) } protected abstract val modulesApiHistory: ApiHistory diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalMultiModuleJsKlibCompilerRunnerTest.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalMultiModuleJsKlibCompilerRunnerTest.kt index 0ed11708f53..cd35264bde0 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalMultiModuleJsKlibCompilerRunnerTest.kt +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalMultiModuleJsKlibCompilerRunnerTest.kt @@ -55,7 +55,7 @@ abstract class AbstractIncrementalMultiModuleJsKlibCompilerRunnerTest : } override val modulesApiHistory: ModulesApiHistoryJs by lazy { - ModulesApiHistoryJs(incrementalModuleInfo) + ModulesApiHistoryJs(workingDir, incrementalModuleInfo) } override val scopeExpansionMode: CompileScopeExpansionMode get() = CompileScopeExpansionMode.NEVER diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistoryAndroidTest.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistoryAndroidTest.kt index a17cefbb2be..5ac479489e7 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistoryAndroidTest.kt +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/multiproject/ModulesApiHistoryAndroidTest.kt @@ -59,7 +59,6 @@ class ModulesApiHistoryAndroidTest { } val info = IncrementalModuleInfo( - projectRoot = projectRoot, rootProjectBuildDir = projectRoot.resolve("build"), dirToModule = mapOf(appKotlinDestination to appEntry, libKotlinDestination to libEntry), nameToModules = mapOf("app" to setOf(appEntry), "lib" to setOf(libEntry)), @@ -68,7 +67,7 @@ class ModulesApiHistoryAndroidTest { jarToAbiSnapshot = mapOf() ) - androidHistory = ModulesApiHistoryAndroid(info) + androidHistory = ModulesApiHistoryAndroid(projectRoot, info) } @Test diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 12d7f7647d9..ba70399afd1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -397,7 +397,6 @@ internal open class GradleCompilerRunner( } return IncrementalModuleInfo( - projectRoot = gradle.rootProject.projectDir, rootProjectBuildDir = gradle.rootProject.buildDir, dirToModule = dirToModule, nameToModules = nameToModules, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt index 72c24acec63..c52751ea9b1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt @@ -330,6 +330,7 @@ internal class GradleKotlinCompilerWork @Inject constructor( outputFiles = outputFiles, multiModuleICSettings = icEnv.multiModuleICSettings, modulesInfo = incrementalModuleInfo!!, + rootProjectDir = icEnv.rootProjectDir, kotlinScriptExtensions = kotlinScriptExtensions, withAbiSnapshot = icEnv.withAbiSnapshot, preciseCompilationResultsBackup = icEnv.preciseCompilationResultsBackup, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt index 96fcc42c182..3ccf2e3842e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt @@ -15,6 +15,7 @@ internal class IncrementalCompilationEnvironment( val changedFiles: ChangedFiles, val classpathChanges: ClasspathChanges, val workingDir: File, + val rootProjectDir: File, val usePreciseJavaTracking: Boolean = false, val disableMultiModuleIC: Boolean = false, val multiModuleICSettings: MultiModuleICSettings, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt index 540b69d5b84..b08e10a041d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt @@ -328,6 +328,7 @@ abstract class Kotlin2JsCompile @Inject constructor( getChangedFiles(inputChanges, incrementalProps), ClasspathChanges.NotAvailableForJSCompiler, taskBuildCacheableOutputDirectory.get().asFile, + projectRootDir, multiModuleICSettings = multiModuleICSettings, preciseCompilationResultsBackup = preciseCompilationResultsBackup.get(), keepIncrementalCompilationCachesInMemory = keepIncrementalCompilationCachesInMemory.get(), diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt index 247993bb32d..f1b869dc4e4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt @@ -302,6 +302,8 @@ abstract class KotlinCompile @Inject constructor( } } + private val projectRootDir = project.rootDir + override fun callCompilerAsync( args: K2JVMCompilerArguments, inputChanges: InputChanges, @@ -323,6 +325,7 @@ abstract class KotlinCompile @Inject constructor( changedFiles = getChangedFiles(inputChanges, incrementalProps), classpathChanges = getClasspathChanges(inputChanges), workingDir = taskBuildCacheableOutputDirectory.get().asFile, + rootProjectDir = projectRootDir, usePreciseJavaTracking = usePreciseJavaTracking, disableMultiModuleIC = disableMultiModuleIC, multiModuleICSettings = multiModuleICSettings,