diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 084e5b4b5f2..20483fde804 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -148,6 +148,9 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { @Argument(value = "-Xuse-javac", description = "Use javac for Java source and class files analysis") var useJavac: Boolean by FreezableVar(false) + @Argument(value = "-Xcompile-java", description = "Reuse javac analysis and compile Java source files") + public boolean compileJava; + @Argument( value = "-Xjavac-arguments", valueDescription = "", diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt index d156f75b44d..41651e2fc7c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -242,7 +242,7 @@ class K2JVMCompiler : CLICompiler() { arguments: K2JVMCompilerArguments): Boolean { if (arguments.useJavac) { environment.configuration.put(JVMConfigurationKeys.USE_JAVAC, true) - return environment.registerJavac(arguments = arguments.javacArguments) + return environment.registerJavac(compileJava = arguments.compileJava, arguments = arguments.javacArguments) } return true diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 39919a36444..8e23379b2ac 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -275,9 +275,10 @@ class KotlinCoreEnvironment private constructor( fun registerJavac( javaFiles: List = allJavaFiles, kotlinFiles: List = sourceFiles, + compileJava: Boolean = false, arguments: Array? = null ): Boolean { - return JavacWrapperRegistrar.registerJavac(projectEnvironment.project, configuration, javaFiles, kotlinFiles, arguments) + return JavacWrapperRegistrar.registerJavac(projectEnvironment.project, configuration, javaFiles, kotlinFiles, compileJava, arguments) } private val applicationEnvironment: CoreApplicationEnvironment diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/javac/JavacWrapperRegistrar.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/javac/JavacWrapperRegistrar.kt index f88d1147e01..b720bac3395 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/javac/JavacWrapperRegistrar.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/javac/JavacWrapperRegistrar.kt @@ -36,6 +36,7 @@ object JavacWrapperRegistrar { configuration: CompilerConfiguration, javaFiles: List, kotlinFiles: List, + compileJava: Boolean, arguments: Array? ): Boolean { val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) @@ -54,7 +55,7 @@ object JavacWrapperRegistrar { val jvmClasspathRoots = configuration.jvmClasspathRoots val outputDirectory = configuration.get(JVMConfigurationKeys.OUTPUT_DIRECTORY) - val javacWrapper = JavacWrapper(javaFiles, kotlinFiles, arguments, jvmClasspathRoots, outputDirectory, context) + val javacWrapper = JavacWrapper(javaFiles, kotlinFiles, arguments, jvmClasspathRoots, compileJava, outputDirectory, context) project.registerService(JavacWrapper::class.java, javacWrapper) diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/JavacWrapper.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/JavacWrapper.kt index 683c5d7529d..9693e5fbd8d 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/JavacWrapper.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/JavacWrapper.kt @@ -67,6 +67,7 @@ class JavacWrapper( kotlinFiles: Collection, arguments: Array?, jvmClasspathRoots: List, + private val compileJava: Boolean, private val outputDirectory: File?, private val context: Context ) : Closeable { @@ -154,6 +155,7 @@ class JavacWrapper( private val symbolBasedPackagesCache = hashMapOf() fun compile(outDir: File? = null): Boolean = with(javac) { + if (!compileJava) return true if (errorCount() > 0) return false val javaFilesNumber = fileObjects.length() diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 78b95b49014..0067a965964 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -22,6 +22,12 @@ where advanced options include: -Xskip-runtime-version-check Allow Kotlin runtime libraries of incompatible versions in the classpath -Xuse-javac Use javac for Java source and class files analysis -Xuse-old-class-files-reading Use old class files reading implementation (may slow down the build and should be used in case of problems with the new implementation) + -Xcompile-java Reuse javac analysis and compile Java source files + -Xjavac-arguments= Java compiler arguments + -Xload-jsr305-annotations Load JSR-305 nullability annotations + -Xno-inline Disable method inlining + -Xrepeat= Repeat compilation (for performance analysis) + -Xskip-metadata-version-check Load classes with bad metadata version anyway (incl. pre-release classes) -Xallow-kotlin-package Allow compiling code in package 'kotlin' -Xcoroutines={enable|warn|error} Enable coroutines or report warnings or errors on declarations and use sites of 'suspend' modifier diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileJavaAgainstKotlinTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileJavaAgainstKotlinTest.kt index d9cbaedd08f..f3d119527fa 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileJavaAgainstKotlinTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileJavaAgainstKotlinTest.kt @@ -98,7 +98,9 @@ abstract class AbstractCompileJavaAgainstKotlinTest : TestCaseWithTmpdir() { environment.configuration.put(JVMConfigurationKeys.USE_JAVAC, true) environment.configuration.put(JVMConfigurationKeys.OUTPUT_DIRECTORY, outDir) environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE) - environment.registerJavac(javaFiles, kotlinFiles = listOf(KotlinTestUtils.loadJetFile(environment.project, ktFiles.first()))) + environment.registerJavac(javaFiles = javaFiles, + kotlinFiles = listOf(KotlinTestUtils.loadJetFile(environment.project, ktFiles.first())), + compileJava = true) if (!ktFiles.isEmpty()) { LoadDescriptorUtil.compileKotlinToDirAndGetModule(ktFiles, outDir, environment) } diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstJavaTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstJavaTest.kt index 8d6f83de024..9d09883c6dc 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstJavaTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstJavaTest.kt @@ -79,7 +79,9 @@ abstract class AbstractCompileKotlinAgainstJavaTest : TestCaseWithTmpdir() { val environment = createEnvironmentWithMockJdkAndIdeaAnnotations(disposable) environment.configuration.put(JVMConfigurationKeys.USE_JAVAC, true) environment.configuration.put(JVMConfigurationKeys.OUTPUT_DIRECTORY, outDir) - environment.registerJavac(javaFiles, kotlinFiles = listOf(KotlinTestUtils.loadJetFile(environment.project, ktFiles.first()))) + environment.registerJavac(javaFiles = javaFiles, + kotlinFiles = listOf(KotlinTestUtils.loadJetFile(environment.project, ktFiles.first())), + compileJava = true) if (!ktFiles.isEmpty()) { LoadDescriptorUtil.compileKotlinToDirAndGetModule(ktFiles, outDir, environment) }