diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index b6edaa2c0e4..aaf7f9bbe58 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -147,7 +147,7 @@ object FirKotlinToJvmBytecodeCompiler { findMainClass(outputs.single().first.fir) } - return writeOutputs( + return writeOutputsIfNeeded( project, projectConfiguration, chunk, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index 1c3f9ceb833..13cc04d22ea 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -123,7 +123,7 @@ object KotlinToJVMBytecodeCompiler { outputs += runCodegen(input, input.state, codegenFactory, result.bindingContext, diagnosticsReporter, environment.configuration) } - return writeOutputs(environment.project, projectConfiguration, chunk, outputs, mainClassFqName) + return writeOutputsIfNeeded(environment.project, projectConfiguration, chunk, outputs, mainClassFqName) } fun compileBunchOfSources(environment: KotlinCoreEnvironment): Boolean { diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/cliCompilerUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/cliCompilerUtils.kt index d590a4dce36..76ff72b6a75 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/cliCompilerUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/cliCompilerUtils.kt @@ -122,13 +122,17 @@ fun writeOutput( outputFiles.writeAll(outputDir, messageCollector, reportOutputFiles) } -fun writeOutputs( +fun writeOutputsIfNeeded( project: Project?, projectConfiguration: CompilerConfiguration, chunk: List, outputs: List, mainClassFqName: FqName? ): Boolean { + if (projectConfiguration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY).hasErrors()) { + return false + } + try { for (state in outputs) { ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt index 753c9ef2883..704c57b1b99 100644 --- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt +++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt @@ -306,11 +306,14 @@ open class JvmIrCodegenFactory( override fun invokeCodegen(input: CodegenFactory.CodegenInput) { val (state, context, module, notifyCodegenStart) = input as JvmIrCodegenInput - if ((state.diagnosticReporter as? BaseDiagnosticsCollector)?.hasErrors == true) return + fun hasErrors() = (state.diagnosticReporter as? BaseDiagnosticsCollector)?.hasErrors == true + + if (hasErrors()) return notifyCodegenStart() jvmCodegenPhases.invokeToplevel(PhaseConfig(jvmCodegenPhases), context, module) + if (hasErrors()) return // TODO: split classes into groups connected by inline calls; call this after every group // and clear `JvmBackendContext.classCodegens` state.afterIndependentPart() diff --git a/compiler/testData/cli/jvm/conflictingJvmDeclarations.args b/compiler/testData/cli/jvm/conflictingJvmDeclarations.args index 1179d27ff26..fa532d6ae25 100644 --- a/compiler/testData/cli/jvm/conflictingJvmDeclarations.args +++ b/compiler/testData/cli/jvm/conflictingJvmDeclarations.args @@ -1,4 +1,3 @@ $TESTDATA_DIR$/conflictingJvmDeclarations.kt --Xuse-k2 -d $TEMP_DIR$ \ No newline at end of file diff --git a/compiler/testData/cli/jvm/conflictingJvmDeclarations.out b/compiler/testData/cli/jvm/conflictingJvmDeclarations.out index 04477b8c572..a50d64fa1cc 100644 --- a/compiler/testData/cli/jvm/conflictingJvmDeclarations.out +++ b/compiler/testData/cli/jvm/conflictingJvmDeclarations.out @@ -1,12 +1,9 @@ -warning: ATTENTION! - This build uses experimental K2 compiler: - -Xuse-k2 -compiler/testData/cli/jvm/conflictingJvmDeclarations.kt:2:5: error: platform declaration clash: The following declarations have the same JVM signature (getX()I): +compiler/testData/cli/jvm/conflictingJvmDeclarations.kt:3:9: error: platform declaration clash: The following declarations have the same JVM signature (getX()I): fun ``(): Int defined in Foo fun getX(): Int defined in Foo fun getY(): Int defined in Foo - val x: Int - ^ + get() = 42 + ^ compiler/testData/cli/jvm/conflictingJvmDeclarations.kt:8:5: error: platform declaration clash: The following declarations have the same JVM signature (getX()I): fun ``(): Int defined in Foo fun getX(): Int defined in Foo diff --git a/compiler/testData/cli/jvm/conflictingJvmDeclarations.test b/compiler/testData/cli/jvm/conflictingJvmDeclarations.test new file mode 100644 index 00000000000..ecef6b832dc --- /dev/null +++ b/compiler/testData/cli/jvm/conflictingJvmDeclarations.test @@ -0,0 +1,2 @@ +// ABSENT: Foo.class +// ABSENT: META-INF/main.kotlin_module \ No newline at end of file diff --git a/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.args b/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.args new file mode 100644 index 00000000000..1179d27ff26 --- /dev/null +++ b/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/conflictingJvmDeclarations.kt +-Xuse-k2 +-d +$TEMP_DIR$ \ No newline at end of file diff --git a/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.out b/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.out new file mode 100644 index 00000000000..04477b8c572 --- /dev/null +++ b/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.out @@ -0,0 +1,16 @@ +warning: ATTENTION! + This build uses experimental K2 compiler: + -Xuse-k2 +compiler/testData/cli/jvm/conflictingJvmDeclarations.kt:2:5: error: platform declaration clash: The following declarations have the same JVM signature (getX()I): + fun ``(): Int defined in Foo + fun getX(): Int defined in Foo + fun getY(): Int defined in Foo + val x: Int + ^ +compiler/testData/cli/jvm/conflictingJvmDeclarations.kt:8:5: error: platform declaration clash: The following declarations have the same JVM signature (getX()I): + fun ``(): Int defined in Foo + fun getX(): Int defined in Foo + fun getY(): Int defined in Foo + @JvmName("getX") + ^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.test b/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.test new file mode 100644 index 00000000000..ecef6b832dc --- /dev/null +++ b/compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.test @@ -0,0 +1,2 @@ +// ABSENT: Foo.class +// ABSENT: META-INF/main.kotlin_module \ No newline at end of file diff --git a/compiler/testData/integration/smoke/destinationDirNoPermission/test.notWindows.compile.expected b/compiler/testData/integration/smoke/destinationDirNoPermission/test.notWindows.compile.expected index 5181c9b0edc..8f834e437f3 100644 --- a/compiler/testData/integration/smoke/destinationDirNoPermission/test.notWindows.compile.expected +++ b/compiler/testData/integration/smoke/destinationDirNoPermission/test.notWindows.compile.expected @@ -1,5 +1,4 @@ ERR: error: error while writing [Temp]/noPermissionDir/Test.class (Permission denied) -error: error while writing [Temp]/noPermissionDir/META-INF/main.kotlin_module (Permission denied) Return code: 1 diff --git a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java index 2036ad626e8..e2df40d4c41 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -242,6 +242,11 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/conflictingJvmDeclarations.args"); } + @TestMetadata("conflictingJvmDeclarationsK2.args") + public void testConflictingJvmDeclarationsK2() throws Exception { + runTest("compiler/testData/cli/jvm/conflictingJvmDeclarationsK2.args"); + } + @TestMetadata("conflictingOverloads.args") public void testConflictingOverloads() throws Exception { runTest("compiler/testData/cli/jvm/conflictingOverloads.args");