diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt index 31360fb8f27..ebca8bd952f 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -357,7 +357,7 @@ private inline fun prepareSessions( } } - val nonScriptSessions =when { + val nonScriptSessions = when { metadataCompilationMode || !isMppEnabled -> { listOf( createSingleSession( 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 59cc0dc3167..abf541f83da 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 @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.generateCodeFromIr import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory @@ -56,6 +57,7 @@ import org.jetbrains.kotlin.resolve.multiplatform.hmppModuleName import org.jetbrains.kotlin.resolve.multiplatform.isCommonSource import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.runUnless +import org.jetbrains.kotlin.utils.fileUtils.descendantRelativeTo import java.io.File object FirKotlinToJvmBytecodeCompiler { @@ -194,6 +196,8 @@ object FirKotlinToJvmBytecodeCompiler { AnalyzerWithCompilerReport.reportSyntaxErrors(ktFile, messageCollector).isHasErrors or errorsFound } + val scriptsInCommonSourcesErrors = reportCommonScriptsError(ktFiles) + val sourceScope = projectEnvironment.getSearchScopeByPsiFiles(ktFiles) + projectEnvironment.getSearchScopeForProjectJavaSources() var librariesScope = projectEnvironment.getSearchScopeForProjectLibraries() @@ -224,7 +228,22 @@ object FirKotlinToJvmBytecodeCompiler { } outputs.runPlatformCheckers(diagnosticsReporter) - return runUnless(syntaxErrors || diagnosticsReporter.hasErrors) { FirResult(outputs) } + return runUnless(syntaxErrors || scriptsInCommonSourcesErrors || diagnosticsReporter.hasErrors) { FirResult(outputs) } + } + + private fun FrontendContext.reportCommonScriptsError(ktFiles: List): Boolean { + val lastHmppModule = configuration.get(CommonConfigurationKeys.HMPP_MODULE_STRUCTURE)?.modules?.lastOrNull() + val commonScripts = ktFiles.filter { it.isScript() && (it.isCommonSource == true || it.hmppModuleName != lastHmppModule?.name) } + if (commonScripts.isNotEmpty()) { + val cwd = File(".").absoluteFile + fun renderFile(ktFile: KtFile) = File(ktFile.virtualFilePath).descendantRelativeTo(cwd).path + messageCollector.report( + CompilerMessageSeverity.ERROR, + "Script files in common source roots are not supported. Misplaced files:\n ${commonScripts.joinToString("\n ", transform = ::renderFile)}" + ) + return true + } + return false } private fun CompilationContext.runBackend( diff --git a/compiler/testData/cli/jvm/hmpp/scriptInCommonFragment.args b/compiler/testData/cli/jvm/hmpp/scriptInCommonFragment.args new file mode 100644 index 00000000000..09058ee41f4 --- /dev/null +++ b/compiler/testData/cli/jvm/hmpp/scriptInCommonFragment.args @@ -0,0 +1,21 @@ +-Xuse-fir-lt=false +-Xallow-any-scripts-in-source-roots +$TESTDATA_DIR$/src/a.kt +$TESTDATA_DIR$/src/b.kt +$TESTDATA_DIR$/src/c.kt +$TESTDATA_DIR$/src/s.kts +$TESTDATA_DIR$/src/s1.kts +$TESTDATA_DIR$/src/s2.kts +-d +$TEMP_DIR$ +-language-version +2.0 +-XXLanguage\:+MultiPlatformProjects +-Xfragments=a +-Xfragments=b +-Xfragments=c +-Xfragment-sources=a\:$TESTDATA_DIR$/src/a.kt,a\:$TESTDATA_DIR$/src/s1.kts +-Xfragment-sources=b\:$TESTDATA_DIR$/src/b.kt,b\:$TESTDATA_DIR$/src/s2.kts +-Xfragment-sources=c\:$TESTDATA_DIR$/src/c.kt,c\:$TESTDATA_DIR$/src/s.kts +-Xfragment-refines=b\:a +-Xfragment-refines=c\:b diff --git a/compiler/testData/cli/jvm/hmpp/scriptInCommonFragment.out b/compiler/testData/cli/jvm/hmpp/scriptInCommonFragment.out new file mode 100644 index 00000000000..c33486f957e --- /dev/null +++ b/compiler/testData/cli/jvm/hmpp/scriptInCommonFragment.out @@ -0,0 +1,13 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage:+MultiPlatformProjects + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +error: script files in common source roots are not supported. Misplaced files: + compiler/testData/cli/jvm/hmpp/src/s1.kts + compiler/testData/cli/jvm/hmpp/src/s2.kts +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/hmpp/src/s.kts b/compiler/testData/cli/jvm/hmpp/src/s.kts new file mode 100644 index 00000000000..073060e43ed --- /dev/null +++ b/compiler/testData/cli/jvm/hmpp/src/s.kts @@ -0,0 +1,2 @@ + +val x = 42 diff --git a/compiler/testData/cli/jvm/hmpp/src/s1.kts b/compiler/testData/cli/jvm/hmpp/src/s1.kts new file mode 100644 index 00000000000..073060e43ed --- /dev/null +++ b/compiler/testData/cli/jvm/hmpp/src/s1.kts @@ -0,0 +1,2 @@ + +val x = 42 diff --git a/compiler/testData/cli/jvm/hmpp/src/s2.kts b/compiler/testData/cli/jvm/hmpp/src/s2.kts new file mode 100644 index 00000000000..073060e43ed --- /dev/null +++ b/compiler/testData/cli/jvm/hmpp/src/s2.kts @@ -0,0 +1,2 @@ + +val x = 42 diff --git a/compiler/testData/cli/jvm/hmpp/successfulCompilationWithScript.args b/compiler/testData/cli/jvm/hmpp/successfulCompilationWithScript.args new file mode 100644 index 00000000000..ea16b8daa2c --- /dev/null +++ b/compiler/testData/cli/jvm/hmpp/successfulCompilationWithScript.args @@ -0,0 +1,20 @@ +-Xuse-fir-lt=false +-Xallow-any-scripts-in-source-roots +$TESTDATA_DIR$/src/a.kt +$TESTDATA_DIR$/src/b.kt +$TESTDATA_DIR$/src/c.kt +$TESTDATA_DIR$/src/s.kts +-d +$TEMP_DIR$ +-language-version +2.0 +-XXLanguage\:+MultiPlatformProjects +-Xexpect-actual-classes +-Xfragments=a +-Xfragments=b +-Xfragments=c +-Xfragment-sources=a\:$TESTDATA_DIR$/src/a.kt +-Xfragment-sources=b\:$TESTDATA_DIR$/src/b.kt +-Xfragment-sources=c\:$TESTDATA_DIR$/src/c.kt,c\:$TESTDATA_DIR$/src/s.kts +-Xfragment-refines=b\:a +-Xfragment-refines=c\:b diff --git a/compiler/testData/cli/jvm/hmpp/successfulCompilationWithScript.out b/compiler/testData/cli/jvm/hmpp/successfulCompilationWithScript.out new file mode 100644 index 00000000000..ad99c0407ca --- /dev/null +++ b/compiler/testData/cli/jvm/hmpp/successfulCompilationWithScript.out @@ -0,0 +1,10 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage:+MultiPlatformProjects + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +OK diff --git a/compiler/testData/cli/jvm/multiplatformCompilationWithCommonScript.args b/compiler/testData/cli/jvm/multiplatformCompilationWithCommonScript.args new file mode 100644 index 00000000000..0af5cd44ba9 --- /dev/null +++ b/compiler/testData/cli/jvm/multiplatformCompilationWithCommonScript.args @@ -0,0 +1,14 @@ +-Xuse-fir-lt=false +-Xallow-any-scripts-in-source-roots +$TESTDATA_DIR$/firMultiplatformCompilationWithoutErrors/common.kt +$TESTDATA_DIR$/firMultiplatformCompilationWithoutErrors/jvm.kt +$TESTDATA_DIR$/scripts/s.kts +$TESTDATA_DIR$/scripts/s1.kts +-Xcommon-sources=$TESTDATA_DIR$/firMultiplatformCompilationWithoutErrors/common.kt,$TESTDATA_DIR$/scripts/s1.kts +-language-version +2.0 +-cp +. +-d +$TEMP_DIR$ +-XXLanguage\:+MultiPlatformProjects diff --git a/compiler/testData/cli/jvm/multiplatformCompilationWithCommonScript.out b/compiler/testData/cli/jvm/multiplatformCompilationWithCommonScript.out new file mode 100644 index 00000000000..d41327a9676 --- /dev/null +++ b/compiler/testData/cli/jvm/multiplatformCompilationWithCommonScript.out @@ -0,0 +1,12 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage:+MultiPlatformProjects + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +error: script files in common source roots are not supported. Misplaced files: + compiler/testData/cli/jvm/scripts/s1.kts +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/multiplatformCompilationWithScript.args b/compiler/testData/cli/jvm/multiplatformCompilationWithScript.args new file mode 100644 index 00000000000..9e742af6128 --- /dev/null +++ b/compiler/testData/cli/jvm/multiplatformCompilationWithScript.args @@ -0,0 +1,15 @@ +-Xuse-fir-lt=false +-Xallow-any-scripts-in-source-roots +$TESTDATA_DIR$/firMultiplatformCompilationWithoutErrors/common.kt +$TESTDATA_DIR$/firMultiplatformCompilationWithoutErrors/jvm.kt +$TESTDATA_DIR$/scripts/s.kts +-Xcommon-sources +$TESTDATA_DIR$/firMultiplatformCompilationWithoutErrors/common.kt +-language-version +2.0 +-cp +. +-d +$TEMP_DIR$ +-XXLanguage\:+MultiPlatformProjects +-Xexpect-actual-classes diff --git a/compiler/testData/cli/jvm/multiplatformCompilationWithScript.out b/compiler/testData/cli/jvm/multiplatformCompilationWithScript.out new file mode 100644 index 00000000000..dea632eaa6a --- /dev/null +++ b/compiler/testData/cli/jvm/multiplatformCompilationWithScript.out @@ -0,0 +1,11 @@ +warning: advanced option value is passed in an obsolete form. Please use the '=' character to specify the value: -Xcommon-sources=... +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage:+MultiPlatformProjects + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +OK diff --git a/compiler/testData/cli/jvm/scripts/s.kts b/compiler/testData/cli/jvm/scripts/s.kts new file mode 100644 index 00000000000..073060e43ed --- /dev/null +++ b/compiler/testData/cli/jvm/scripts/s.kts @@ -0,0 +1,2 @@ + +val x = 42 diff --git a/compiler/testData/cli/jvm/scripts/s1.kts b/compiler/testData/cli/jvm/scripts/s1.kts new file mode 100644 index 00000000000..073060e43ed --- /dev/null +++ b/compiler/testData/cli/jvm/scripts/s1.kts @@ -0,0 +1,2 @@ + +val x = 42 diff --git a/compiler/testData/codegen/box/script/syntheticJavaPropertyInScript.kt b/compiler/testData/codegen/box/script/syntheticJavaPropertyInScript.kt index cad1db43d04..11b55f3aba3 100644 --- a/compiler/testData/codegen/box/script/syntheticJavaPropertyInScript.kt +++ b/compiler/testData/codegen/box/script/syntheticJavaPropertyInScript.kt @@ -1,6 +1,6 @@ // TARGET_BACKEND: JVM_IR // IGNORE_LIGHT_ANALYSIS -// JVM_ABI_K1_K2_DIFF: +// JVM_ABI_K1_K2_DIFF: KT-62465, KT-63960 // LANGUAGE: +ReferencesToSyntheticJavaProperties // LANGUAGE: -SkipStandaloneScriptsInSourceRoots // WITH_STDLIB diff --git a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java index aa9e83968c2..70c5424c474 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -162,6 +162,11 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/hmpp/sameSourceInDifferentFragments.args"); } + @TestMetadata("scriptInCommonFragment.args") + public void testScriptInCommonFragment() { + runTest("compiler/testData/cli/jvm/hmpp/scriptInCommonFragment.args"); + } + @TestMetadata("sourceNotInAnyFragment.args") public void testSourceNotInAnyFragment() { runTest("compiler/testData/cli/jvm/hmpp/sourceNotInAnyFragment.args"); @@ -176,6 +181,11 @@ public class CliTestGenerated extends AbstractCliTest { public void testSuccessfulCompilation2() { runTest("compiler/testData/cli/jvm/hmpp/successfulCompilation2.args"); } + + @TestMetadata("successfulCompilationWithScript.args") + public void testSuccessfulCompilationWithScript() { + runTest("compiler/testData/cli/jvm/hmpp/successfulCompilationWithScript.args"); + } } @TestMetadata("compiler/testData/cli/jvm") @@ -1000,6 +1010,16 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/modulesWithDependencyCycle.args"); } + @TestMetadata("multiplatformCompilationWithCommonScript.args") + public void testMultiplatformCompilationWithCommonScript() { + runTest("compiler/testData/cli/jvm/multiplatformCompilationWithCommonScript.args"); + } + + @TestMetadata("multiplatformCompilationWithScript.args") + public void testMultiplatformCompilationWithScript() { + runTest("compiler/testData/cli/jvm/multiplatformCompilationWithScript.args"); + } + @TestMetadata("multipleTextRangesInDiagnosticsOrder.args") public void testMultipleTextRangesInDiagnosticsOrder() { runTest("compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.args");