diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index 9be0166a1cf..2e043d2fe09 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -319,7 +319,7 @@ abstract class CompileServiceImplBase( CompilerMode.JPS_COMPILER -> { @Suppress("UNCHECKED_CAST") servicesFacade as JpsServicesFacadeT - withIC(k2PlatformArgs, enabled = servicesFacade.hasIncrementalCaches()) { + withIncrementalCompilation(k2PlatformArgs, enabled = servicesFacade.hasIncrementalCaches()) { doCompile(sessionId, daemonReporter, tracer = null) { eventManger, profiler -> val services = createServices(servicesFacade, eventManger, profiler) compiler.exec(messageCollector, services, k2PlatformArgs) @@ -346,7 +346,7 @@ abstract class CompileServiceImplBase( val gradleIncrementalServicesFacade = servicesFacade when (targetPlatform) { - CompileService.TargetPlatform.JVM -> withIC(k2PlatformArgs) { + CompileService.TargetPlatform.JVM -> withIncrementalCompilation(k2PlatformArgs) { doCompile(sessionId, daemonReporter, tracer = null) { _, _ -> execIncrementalCompiler( k2PlatformArgs as K2JVMCompilerArguments, @@ -616,7 +616,7 @@ abstract class CompileServiceImplBase( 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.IncrementalJvmCompilerRunnerKt.makeIncrementally + // See org.jetbrains.kotlin.incremental.CompilerRunnerUtilsKt.makeJvmIncrementally val usePreciseJavaTracking = if (useK2) false else incrementalCompilationOptions.usePreciseJavaTracking val compiler = IncrementalJvmCompilerRunner( diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/CompilerRunnerUtils.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/CompilerRunnerUtils.kt new file mode 100644 index 00000000000..9c39916f9ac --- /dev/null +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/CompilerRunnerUtils.kt @@ -0,0 +1,95 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:JvmName("CompilerRunnerUtils") + +package org.jetbrains.kotlin.incremental + +import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS +import org.jetbrains.kotlin.build.report.BuildReporter +import org.jetbrains.kotlin.build.report.DoNothingICReporter +import org.jetbrains.kotlin.build.report.ICReporter +import org.jetbrains.kotlin.build.report.metrics.DoNothingBuildMetricsReporter +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.config.IncrementalCompilation +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.incremental.multiproject.EmptyModulesApiHistory +import java.io.File + +var K2JVMCompilerArguments.destinationAsFile: File + get() = File(destination) + set(value) { + destination = value.absolutePath + } + +var K2JVMCompilerArguments.classpathAsList: List + get() = classpath.orEmpty().split(File.pathSeparator).map(::File) + set(value) { + classpath = value.joinToString(separator = File.pathSeparator, transform = { it.absolutePath }) + } + +@Suppress("unused") // used in Maven compile runner +fun makeJvmIncrementally( + cachesDir: File, + sourceRoots: Iterable, + args: K2JVMCompilerArguments, + messageCollector: MessageCollector = MessageCollector.NONE, + reporter: ICReporter = DoNothingICReporter +) { + val kotlinExtensions = DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS + val allExtensions = kotlinExtensions + "java" + val rootsWalk = sourceRoots.asSequence().flatMap { it.walk() } + val files = rootsWalk.filter(File::isFile) + val sourceFiles = files.filter { it.extension.lowercase() in allExtensions }.toList() + val buildHistoryFile = File(cachesDir, "build-history.bin") + args.javaSourceRoots = sourceRoots.map { it.absolutePath }.toTypedArray() + val buildReporter = BuildReporter(icReporter = reporter, buildMetricsReporter = DoNothingBuildMetricsReporter) + + withIncrementalCompilation(args) { + val useK2 = args.useK2 || LanguageVersion.fromVersionString(args.languageVersion)?.usesK2 == true + val compiler = + if (useK2 && args.useFirIC && args.useFirLT /* TODO by @Ilya.Chernikov: move LT check into runner */) + IncrementalFirJvmCompilerRunner( + cachesDir, + buildReporter, + buildHistoryFile, + outputDirs = null, + EmptyModulesApiHistory, + kotlinExtensions, + ClasspathChanges.ClasspathSnapshotDisabled + ) + else + IncrementalJvmCompilerRunner( + cachesDir, + buildReporter, + // Use precise setting in case of non-Gradle build + usePreciseJavaTracking = !useK2, // TODO by @Ilya.Chernikov: add fir-based java classes tracker when available and set this to true + buildHistoryFile = buildHistoryFile, + outputDirs = null, + modulesApiHistory = EmptyModulesApiHistory, + kotlinSourceFilesExtensions = kotlinExtensions, + classpathChanges = ClasspathChanges.ClasspathSnapshotDisabled + ) + //TODO by @Ilya.Chernikov set properly + compiler.compile(sourceFiles, args, messageCollector, changedFiles = null) + } +} + +@Suppress("DEPRECATION") +inline fun withIncrementalCompilation(args: CommonCompilerArguments, enabled: Boolean = true, fn: () -> R): R { + val isEnabledBackup = IncrementalCompilation.isEnabledForJvm() + IncrementalCompilation.setIsEnabledForJvm(enabled) + + try { + if (args.incrementalCompilation == null) { + args.incrementalCompilation = enabled + } + return fn() + } finally { + IncrementalCompilation.setIsEnabledForJvm(isEnabledBackup) + } +} \ No newline at end of file diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index 9545de3cee6..4333a712426 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -22,7 +22,6 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiFile import com.intellij.psi.PsiFileFactory import com.intellij.psi.PsiJavaFile -import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS import org.jetbrains.kotlin.build.GeneratedFile import org.jetbrains.kotlin.build.GeneratedJvmClass @@ -30,7 +29,6 @@ import org.jetbrains.kotlin.build.report.* import org.jetbrains.kotlin.build.report.metrics.* import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.ExitCode -import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.messages.FilteringMessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector @@ -49,7 +47,6 @@ import org.jetbrains.kotlin.incremental.classpathDiff.* import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathChangesComputer.computeClasspathChanges import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.incremental.multiproject.EmptyModulesApiHistory import org.jetbrains.kotlin.incremental.multiproject.ModulesApiHistory import org.jetbrains.kotlin.incremental.util.BufferingMessageCollector import org.jetbrains.kotlin.incremental.util.Either @@ -62,68 +59,6 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import java.io.File -@TestOnly -fun makeIncrementally( - cachesDir: File, - sourceRoots: Iterable, - args: K2JVMCompilerArguments, - messageCollector: MessageCollector = MessageCollector.NONE, - reporter: ICReporter = DoNothingICReporter -) { - val kotlinExtensions = DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS - val allExtensions = kotlinExtensions + "java" - val rootsWalk = sourceRoots.asSequence().flatMap { it.walk() } - val files = rootsWalk.filter(File::isFile) - val sourceFiles = files.filter { it.extension.lowercase() in allExtensions }.toList() - val buildHistoryFile = File(cachesDir, "build-history.bin") - args.javaSourceRoots = sourceRoots.map { it.absolutePath }.toTypedArray() - val buildReporter = BuildReporter(icReporter = reporter, buildMetricsReporter = DoNothingBuildMetricsReporter) - - withIC(args) { - val useK2 = args.useK2 || LanguageVersion.fromVersionString(args.languageVersion)?.usesK2 == true - val compiler = - if (useK2 && args.useFirIC && args.useFirLT /* TODO: move LT check into runner */) - IncrementalFirJvmCompilerRunner( - cachesDir, - buildReporter, - buildHistoryFile, - outputDirs = null, - EmptyModulesApiHistory, - kotlinExtensions, - ClasspathSnapshotDisabled - ) - else - IncrementalJvmCompilerRunner( - cachesDir, - buildReporter, - // Use precise setting in case of non-Gradle build - usePreciseJavaTracking = !useK2, // TODO: add fir-based java classes tracker when available and set this to true (KT-57147) - buildHistoryFile = buildHistoryFile, - outputDirs = null, - modulesApiHistory = EmptyModulesApiHistory, - kotlinSourceFilesExtensions = kotlinExtensions, - classpathChanges = ClasspathSnapshotDisabled - ) - //TODO set properly - compiler.compile(sourceFiles, args, messageCollector, changedFiles = null) - } -} - -@Suppress("DEPRECATION") -inline fun withIC(args: CommonCompilerArguments, enabled: Boolean = true, fn: () -> R): R { - val isEnabledBackup = IncrementalCompilation.isEnabledForJvm() - IncrementalCompilation.setIsEnabledForJvm(enabled) - - try { - if (args.incrementalCompilation == null) { - args.incrementalCompilation = enabled - } - return fn() - } finally { - IncrementalCompilation.setIsEnabledForJvm(isEnabledBackup) - } -} - open class IncrementalJvmCompilerRunner( workingDir: File, reporter: BuildReporter, @@ -542,15 +477,3 @@ open class IncrementalJvmCompilerRunner( } } } - -var K2JVMCompilerArguments.destinationAsFile: File - get() = File(destination) - set(value) { - destination = value.path - } - -var K2JVMCompilerArguments.classpathAsList: List - get() = classpath.orEmpty().split(File.pathSeparator).map(::File) - set(value) { - classpath = value.joinToString(separator = File.pathSeparator, transform = { it.path }) - } diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalCompilerRunnerTestBase.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalCompilerRunnerTestBase.kt index 282434449ea..f03e3e699b3 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalCompilerRunnerTestBase.kt +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalCompilerRunnerTestBase.kt @@ -36,9 +36,10 @@ abstract class AbstractIncrementalCompilerRunnerTestBase, args: Args) = make(cacheDir, outDir, sourceRoots, args) - private fun incrementalMake(cacheDir: File, outDir: File, sourceRoots: List, args: Args) = make(cacheDir, outDir, sourceRoots, args) + private fun incrementalMake(cacheDir: File, outDir: File, sourceRoots: List, args: Args) = + make(cacheDir, outDir, sourceRoots, args) protected open fun rebuildAndCompareOutput( sourceRoots: List, diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalJvmCompilerRunnerTest.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalJvmCompilerRunnerTest.kt index b93cda46c1f..d060a7f446b 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalJvmCompilerRunnerTest.kt +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/AbstractIncrementalJvmCompilerRunnerTest.kt @@ -30,7 +30,7 @@ abstract class AbstractIncrementalJvmCompilerRunnerTest : AbstractIncrementalCom override fun make(cacheDir: File, outDir: File, sourceRoots: Iterable, args: K2JVMCompilerArguments): TestCompilationResult { val reporter = TestICReporter() val messageCollector = TestMessageCollector() - makeIncrementally(cacheDir, sourceRoots, args, reporter = reporter, messageCollector = messageCollector) + makeJvmIncrementally(cacheDir, sourceRoots, args, reporter = reporter, messageCollector = messageCollector) val kotlinCompileResult = TestCompilationResult(reporter, messageCollector) if (kotlinCompileResult.exitCode != ExitCode.OK) return kotlinCompileResult @@ -55,9 +55,10 @@ abstract class AbstractIncrementalJvmCompilerRunnerTest : AbstractIncrementalCom } mkdirs() } - val args = arrayOf("-cp", javaClasspath, - "-d", javaDestinationDir.canonicalPath, - *javaSources.map { it.canonicalPath }.toTypedArray() + val args = arrayOf( + "-cp", javaClasspath, + "-d", javaDestinationDir.canonicalPath, + *javaSources.map { it.canonicalPath }.toTypedArray() ) val err = ByteArrayOutputStream() diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/utils/TestICReporter.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/utils/TestICReporter.kt index 75bbd3fae59..8dfb72a5eb8 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/utils/TestICReporter.kt +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/utils/TestICReporter.kt @@ -30,8 +30,7 @@ class TestICReporter : ICReporterBase() { var exitCode: ExitCode = ExitCode.OK private set - override fun report(message: () -> String, severity: ReportSeverity) { - } + override fun report(message: () -> String, severity: ReportSeverity) {} override fun reportCompileIteration(incremental: Boolean, sourceFiles: Collection, exitCode: ExitCode) { compiledSourcesMutable.addAll(sourceFiles) diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/utils/TestLookupTracker.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/utils/TestLookupTracker.kt new file mode 100644 index 00000000000..5c05472d0cd --- /dev/null +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/utils/TestLookupTracker.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.incremental.utils + +import com.intellij.util.containers.Interner +import org.jetbrains.kotlin.incremental.LookupSymbol +import org.jetbrains.kotlin.incremental.components.LookupInfo +import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.incremental.components.Position +import org.jetbrains.kotlin.incremental.components.ScopeKind + +class TestLookupTracker(val savedLookups: MutableSet = mutableSetOf()) : LookupTracker { + val lookups = arrayListOf() + private val interner = Interner.createStringInterner() + + override val requiresPosition: Boolean + get() = true + + override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) { + val internedFilePath = interner.intern(filePath) + val internedScopeFqName = interner.intern(scopeFqName) + val internedName = interner.intern(name) + + lookups.add(LookupInfo(internedFilePath, position, internedScopeFqName, scopeKind, internedName)) + } + + override fun clear() { + lookups.clear() + } +} diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt index 55915968254..97a22d724d9 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments import org.jetbrains.kotlin.incremental.LookupSymbol import org.jetbrains.kotlin.incremental.testingUtils.* +import org.jetbrains.kotlin.incremental.utils.TestLookupTracker import org.jetbrains.kotlin.jps.build.dependeciestxt.ModulesTxt import org.jetbrains.kotlin.jps.build.dependeciestxt.ModulesTxtBuilder import org.jetbrains.kotlin.jps.build.fixtures.EnableICFixture diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt index 99db1563c11..22778a4ecd8 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt @@ -8,10 +8,8 @@ package org.jetbrains.kotlin.jps.build import com.intellij.testFramework.RunAll import com.intellij.testFramework.UsefulTestCase import com.intellij.util.ThrowableRunnable -import com.intellij.util.containers.Interner import org.jetbrains.kotlin.TestWithWorkingDir import org.jetbrains.kotlin.build.JvmSourceRoot -import org.jetbrains.kotlin.cli.common.CompilerSystemProperties import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments @@ -20,14 +18,13 @@ import org.jetbrains.kotlin.compilerRunner.* import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.components.LookupInfo import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.incremental.components.Position -import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.incremental.isKotlinFile import org.jetbrains.kotlin.incremental.js.* import org.jetbrains.kotlin.incremental.makeModuleFile import org.jetbrains.kotlin.incremental.testingUtils.TouchPolicy import org.jetbrains.kotlin.incremental.testingUtils.copyTestSources import org.jetbrains.kotlin.incremental.testingUtils.getModificationsToPerform +import org.jetbrains.kotlin.incremental.utils.TestLookupTracker import org.jetbrains.kotlin.incremental.utils.TestMessageCollector import org.jetbrains.kotlin.jps.build.fixtures.EnableICFixture import org.jetbrains.kotlin.jps.incremental.createTestingCompilerEnvironment @@ -349,25 +346,3 @@ abstract class AbstractLookupTrackerTest : TestWithWorkingDir() { KotlinTestUtils.assertEqualsToFile("Lookups do not match after $step", expectedFile, actual) } } - -class TestLookupTracker : LookupTracker { - val lookups = arrayListOf() - private val interner = Interner.createStringInterner() - - override val requiresPosition: Boolean - get() = true - - override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) { - val internedFilePath = interner.intern(filePath) - val internedScopeFqName = interner.intern(scopeFqName) - val internedName = interner.intern(name) - - lookups.add(LookupInfo(internedFilePath, position, internedScopeFqName, scopeKind, internedName)) - } - - override fun clear() { - lookups.clear() - } -} - - diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java index 80d6abdb5f6..3ec672b1406 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java @@ -34,7 +34,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; import org.jetbrains.kotlin.cli.common.messages.MessageCollector; import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler; import org.jetbrains.kotlin.config.JvmTarget; -import org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunnerKt; +import org.jetbrains.kotlin.incremental.CompilerRunnerUtils; import org.jetbrains.kotlin.maven.incremental.FileCopier; import org.jetbrains.kotlin.maven.incremental.MavenICReporter; import org.jetbrains.kotlin.maven.kapt.AnnotationProcessingManager; @@ -270,7 +270,7 @@ public class K2JVMCompileMojo extends KotlinCompileMojoBase