diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/CompilerRunnerUtil.java b/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/CompilerRunnerUtil.java index ab4343f24ee..56996120bba 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/CompilerRunnerUtil.java +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/CompilerRunnerUtil.java @@ -74,10 +74,9 @@ public class CompilerRunnerUtil { @NotNull String compilerClassName, @NotNull String[] arguments, @NotNull JpsCompilerEnvironment environment, - @NotNull MessageCollector messageCollector, @NotNull PrintStream out ) throws Exception { - File libPath = getLibPath(environment.getKotlinPaths(), messageCollector); + File libPath = getLibPath(environment.getKotlinPaths(), environment.getMessageCollector()); if (libPath == null) return null; ClassLoader classLoader = getOrCreateClassLoader(environment, libPath); diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsCompilerEnvironment.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsCompilerEnvironment.kt index dd35f5e1ad0..6e9ce4b2bd0 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsCompilerEnvironment.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsCompilerEnvironment.kt @@ -27,8 +27,10 @@ import org.jetbrains.kotlin.utils.PathUtil class JpsCompilerEnvironment( val kotlinPaths: KotlinPaths, services: Services, - val classesToLoadByParent: ClassCondition -) : CompilerEnvironment(services) { + val classesToLoadByParent: ClassCondition, + messageCollector: MessageCollector, + override val outputItemsCollector: OutputItemsCollectorImpl +) : CompilerEnvironment(services, messageCollector, outputItemsCollector) { fun success(): Boolean { return kotlinPaths.homePath.exists() } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt index ad0760629b2..2cfb0394f2d 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt @@ -44,24 +44,20 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner() { commonArguments: CommonCompilerArguments, k2jvmArguments: K2JVMCompilerArguments, compilerSettings: CompilerSettings, - messageCollector: MessageCollector, environment: JpsCompilerEnvironment, - moduleFile: File, - collector: OutputItemsCollector + moduleFile: File ) { val arguments = mergeBeans(commonArguments, k2jvmArguments) setupK2JvmArguments(moduleFile, arguments) - runCompiler(K2JVM_COMPILER, arguments, compilerSettings.additionalArguments, messageCollector, collector, environment) + runCompiler(K2JVM_COMPILER, arguments, compilerSettings.additionalArguments, environment) } fun runK2JsCompiler( commonArguments: CommonCompilerArguments, k2jsArguments: K2JSCompilerArguments, compilerSettings: CompilerSettings, - messageCollector: MessageCollector, environment: JpsCompilerEnvironment, - collector: OutputItemsCollector, sourceFiles: Collection, libraryFiles: List, outputFile: File @@ -69,27 +65,25 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner() { val arguments = mergeBeans(commonArguments, k2jsArguments) setupK2JsArguments(outputFile, sourceFiles, libraryFiles, arguments) - runCompiler(K2JS_COMPILER, arguments, compilerSettings.additionalArguments, messageCollector, collector, environment) + runCompiler(K2JS_COMPILER, arguments, compilerSettings.additionalArguments, environment) } - override fun doRunCompiler(compilerClassName: String, argsArray: Array, environment: JpsCompilerEnvironment, messageCollector: MessageCollector, collector: OutputItemsCollector): ExitCode { - messageCollector.report(CompilerMessageSeverity.INFO, "Using kotlin-home = " + environment.kotlinPaths.homePath, CompilerMessageLocation.NO_LOCATION) + override fun doRunCompiler(compilerClassName: String, argsArray: Array, environment: JpsCompilerEnvironment): ExitCode { + environment.messageCollector.report(CompilerMessageSeverity.INFO, "Using kotlin-home = " + environment.kotlinPaths.homePath, CompilerMessageLocation.NO_LOCATION) return if (isDaemonEnabled()) { - val daemonExitCode = compileWithDaemon(compilerClassName, argsArray, environment, messageCollector, collector) - daemonExitCode ?: fallbackCompileStrategy(argsArray, collector, compilerClassName, environment, messageCollector) + val daemonExitCode = compileWithDaemon(compilerClassName, argsArray, environment) + daemonExitCode ?: fallbackCompileStrategy(argsArray, compilerClassName, environment) } else { - fallbackCompileStrategy(argsArray, collector, compilerClassName, environment, messageCollector) + fallbackCompileStrategy(argsArray, compilerClassName, environment) } } private fun fallbackCompileStrategy( argsArray: Array, - collector: OutputItemsCollector, compilerClassName: String, - environment: JpsCompilerEnvironment, - messageCollector: MessageCollector + environment: JpsCompilerEnvironment ): ExitCode { // otherwise fallback to in-process log.info("Compile in-process") @@ -103,12 +97,12 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner() { if (System.getProperty(GlobalOptions.COMPILE_PARALLEL_OPTION, "false").toBoolean()) System.setProperty(KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY, "true") - val rc = CompilerRunnerUtil.invokeExecMethod(compilerClassName, argsArray, environment, messageCollector, out) + val rc = CompilerRunnerUtil.invokeExecMethod(compilerClassName, argsArray, environment, out) // exec() returns an ExitCode object, class of which is loaded with a different class loader, // so we take it's contents through reflection val exitCode = ExitCode.valueOf(getReturnCodeFromObject(rc)) - processCompilerOutput(messageCollector, collector, stream, exitCode) + processCompilerOutput(environment, stream, exitCode) return exitCode } @@ -140,14 +134,14 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner() { } @Synchronized - override fun getDaemonConnection(environment: JpsCompilerEnvironment, messageCollector: MessageCollector): DaemonConnection { + override fun getDaemonConnection(environment: JpsCompilerEnvironment): DaemonConnection { if (jpsDaemonConnection == null) { - val libPath = CompilerRunnerUtil.getLibPath(environment.kotlinPaths, messageCollector) + val libPath = CompilerRunnerUtil.getLibPath(environment.kotlinPaths, environment.messageCollector) val compilerPath = File(libPath, "kotlin-compiler.jar") val flagFile = File.createTempFile("kotlin-compiler-jps-session-", "-is-running").apply { deleteOnExit() } - newDaemonConnection(compilerPath, messageCollector, flagFile) + newDaemonConnection(compilerPath, flagFile, environment) } return jpsDaemonConnection!! } 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 1b7a2106aac..239a0b8f472 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 @@ -205,7 +205,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val project = projectDescriptor.project val lookupTracker = getLookupTracker(project) val incrementalCaches = getIncrementalCaches(chunk, context) - val environment = createCompileEnvironment(incrementalCaches, lookupTracker, context) + val environment = createCompileEnvironment(incrementalCaches, lookupTracker, context, messageCollector) if (!environment.success()) { environment.reportErrorsTo(messageCollector) return ABORT @@ -238,7 +238,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { LOG.info("Compiled successfully") } - val generatedFiles = getGeneratedFiles(chunk, outputItemCollector) + val generatedFiles = getGeneratedFiles(chunk, environment.outputItemsCollector) registerOutputItems(outputConsumer, generatedFiles) saveVersions(context, chunk) @@ -368,11 +368,11 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { dirtyFilesHolder: DirtyFilesHolder, environment: JpsCompilerEnvironment, filesToCompile: MultiMap, incrementalCaches: Map>, messageCollector: MessageCollectorAdapter, project: JpsProject - ): OutputItemsCollectorImpl? { + ): OutputItemsCollector? { if (JpsUtils.isJsKotlinModule(chunk.representativeTarget())) { LOG.debug("Compiling to JS ${filesToCompile.values().size} files in ${filesToCompile.keySet().joinToString { it.presentableName }}") - return compileToJs(chunk, commonArguments, environment, messageCollector, project) + return compileToJs(chunk, commonArguments, environment, project) } if (IncrementalCompilation.isEnabled()) { @@ -402,13 +402,14 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { ) } - return compileToJvm(allCompiledFiles, chunk, commonArguments, context, dirtyFilesHolder, environment, filesToCompile, messageCollector) + return compileToJvm(allCompiledFiles, chunk, commonArguments, context, dirtyFilesHolder, environment, filesToCompile) } private fun createCompileEnvironment( incrementalCaches: Map, lookupTracker: LookupTracker, - context: CompileContext + context: CompileContext, + messageCollector: MessageCollectorAdapter ): JpsCompilerEnvironment { val compilerServices = with(Services.Builder()) { register(IncrementalCompilationComponents::class.java, @@ -433,7 +434,9 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { || className == "org.jetbrains.kotlin.progress.CompilationCanceledStatus" || className == "org.jetbrains.kotlin.progress.CompilationCanceledException" || className == "org.jetbrains.kotlin.modules.TargetId" - } + }, + messageCollector, + OutputItemsCollectorImpl() ) } @@ -585,16 +588,13 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { private fun compileToJs(chunk: ModuleChunk, commonArguments: CommonCompilerArguments, environment: JpsCompilerEnvironment, - messageCollector: MessageCollectorAdapter, project: JpsProject - ): OutputItemsCollectorImpl? { - val outputItemCollector = OutputItemsCollectorImpl() - + ): OutputItemsCollector? { val representativeTarget = chunk.representativeTarget() if (chunk.modules.size > 1) { // We do not support circular dependencies, but if they are present, we do our best should not break the build, // so we simply yield a warning and report NOTHING_DONE - messageCollector.report( + environment.messageCollector.report( WARNING, "Circular dependencies are not supported. The following JS modules depend on each other: " + chunk.modules.map { it.name }.joinToString(", ") + ". " @@ -619,8 +619,8 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val k2JsArguments = JpsKotlinCompilerSettings.getK2JsCompilerArguments(representativeModule) val compilerRunner = JpsKotlinCompilerRunner() - compilerRunner.runK2JsCompiler(commonArguments, k2JsArguments, compilerSettings, messageCollector, environment, outputItemCollector, sourceFiles, libraryFiles, outputFile) - return outputItemCollector + compilerRunner.runK2JsCompiler(commonArguments, k2JsArguments, compilerSettings, environment, sourceFiles, libraryFiles, outputFile) + return environment.outputItemsCollector } private fun copyJsLibraryFilesIfNeeded(chunk: ModuleChunk, project: JpsProject) { @@ -642,12 +642,10 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { context: CompileContext, dirtyFilesHolder: DirtyFilesHolder, environment: JpsCompilerEnvironment, - filesToCompile: MultiMap, messageCollector: MessageCollectorAdapter - ): OutputItemsCollectorImpl? { - val outputItemCollector = OutputItemsCollectorImpl() - + filesToCompile: MultiMap + ): OutputItemsCollector? { if (chunk.modules.size > 1) { - messageCollector.report( + environment.messageCollector.report( WARNING, "Circular dependencies are only partially supported. The following modules depend on each other: " + chunk.modules.map { it.name }.joinToString(", ") + ". " @@ -686,10 +684,10 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { + " in " + filesToCompile.keySet().joinToString { it.presentableName }) val compilerRunner = JpsKotlinCompilerRunner() - compilerRunner.runK2JvmCompiler(commonArguments, k2JvmArguments, compilerSettings, messageCollector, environment, moduleFile, outputItemCollector) + compilerRunner.runK2JvmCompiler(commonArguments, k2JvmArguments, compilerSettings, environment, moduleFile) moduleFile.delete() - return outputItemCollector + return environment.outputItemsCollector } class MessageCollectorAdapter(private val context: CompileContext) : MessageCollector {