From 0f003802fec0127dc571cba76809af4cf3760205 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 27 Jul 2018 14:15:12 +0200 Subject: [PATCH] Introduce -Xcommon-sources and pass it correctly from build tool plugins #KT-25196 In Progress --- .../jetbrains/kotlin/incremental/buildUtil.kt | 2 ++ .../kotlin/modules/KotlinModuleXmlBuilder.kt | 26 ++++++++------ .../arguments/CommonCompilerArguments.kt | 8 +++++ .../cli/common/modules/ModuleBuilder.kt | 12 +++++-- .../cli/common/modules/ModuleXmlParser.java | 5 +++ .../kotlin/cli/common/config/ContentRoots.kt | 16 +++++---- .../jetbrains/kotlin/cli/js/K2JSCompiler.java | 8 ++++- .../jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt | 3 +- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 21 ++++++++---- .../compiler/KotlinToJVMBytecodeCompiler.kt | 32 +++++++++-------- .../kotlin/cli/metadata/K2MetadataCompiler.kt | 2 +- .../kotlin/daemon/CompileServiceImpl.kt | 5 +-- .../resolve/multiplatform/isCommonSource.kt | 16 +++++++++ .../IncrementalJvmCompilerRunner.kt | 17 ++++++---- compiler/testData/cli/js/jsExtraHelp.out | 2 ++ compiler/testData/cli/jvm/extraHelp.out | 2 ++ .../kotlin/test/KotlinTestUtils.java | 9 ++--- .../AbstractMultiPlatformIntegrationTest.kt | 34 +++++-------------- .../org/jetbrains/kotlin/modules/Module.kt | 2 ++ .../jps/build/AbstractLookupTrackerTest.kt | 16 ++++----- .../kotlin/jvm/compiler/ClasspathOrderTest.kt | 21 ++++++------ .../modules/KotlinModuleXmlGeneratorTest.java | 5 +++ .../platforms/KotlinJvmModuleBuildTarget.kt | 2 ++ .../GradleKotlinCompilerRunner.kt | 29 +++++++++------- .../internal/kapt/KaptWithKotlincTask.kt | 5 +-- .../plugin/KotlinMultiplatformPlugin.kt | 4 ++- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 25 +++++++++----- .../kotlin/maven/ExecuteKotlinScriptMojo.java | 2 +- 28 files changed, 205 insertions(+), 126 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/multiplatform/isCommonSource.kt diff --git a/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt b/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt index 44c427be531..64fce730140 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt @@ -41,6 +41,7 @@ fun makeModuleFile( isTest: Boolean, outputDir: File, sourcesToCompile: Iterable, + commonSources: Iterable, javaSourceRoots: Iterable, classpath: Iterable, friendDirs: Iterable @@ -55,6 +56,7 @@ fun makeModuleFile( sourcesToCompile.map { it.absoluteFile }, javaSourceRoots, classpath, + commonSources.map { it.absoluteFile }, null, "java-production", isTest, diff --git a/build-common/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilder.kt b/build-common/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilder.kt index beaff6a893c..36e18e16430 100644 --- a/build-common/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilder.kt +++ b/build-common/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilder.kt @@ -34,16 +34,18 @@ class KotlinModuleXmlBuilder { } fun addModule( - moduleName: String, - outputDir: String, - sourceFiles: Iterable, - javaSourceRoots: Iterable, - classpathRoots: Iterable, - modularJdkRoot: File?, - targetTypeId: String, - isTests: Boolean, - directoriesToFilterOut: Set, - friendDirs: Iterable): KotlinModuleXmlBuilder { + moduleName: String, + outputDir: String, + sourceFiles: Iterable, + javaSourceRoots: Iterable, + classpathRoots: Iterable, + commonSourceFiles: Iterable, + modularJdkRoot: File?, + targetTypeId: String, + isTests: Boolean, + directoriesToFilterOut: Set, + friendDirs: Iterable + ): KotlinModuleXmlBuilder { assert(!done) { "Already done" } p.println("") @@ -62,6 +64,10 @@ class KotlinModuleXmlBuilder { p.println("<", SOURCES, " ", PATH, "=\"", getEscapedPath(sourceFile), "\"/>") } + for (commonSourceFile in commonSourceFiles) { + p.println("<", COMMON_SOURCES, " ", PATH, "=\"", getEscapedPath(commonSourceFile), "\"/>") + } + processJavaSourceRoots(javaSourceRoots) processClasspath(classpathRoots, directoriesToFilterOut) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt index 95a81d8cee4..b63b7ffddef 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt @@ -180,6 +180,14 @@ abstract class CommonCompilerArguments : CommonToolArguments() { ) var metadataVersion: String? by FreezableVar(null) + @Argument( + value = "-Xcommon-sources", + valueDescription = "", + description = "Sources of the common module that need to be compiled together with this module in the multi-platform mode.\n" + + "Should be a subset of sources passed as free arguments" + ) + var commonSources: Array? by FreezableVar(null) + open fun configureAnalysisFlags(collector: MessageCollector): MutableMap, Any> { return HashMap, Any>().apply { put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleBuilder.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleBuilder.kt index dca2eb6f234..d2b506cfa26 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleBuilder.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleBuilder.kt @@ -21,11 +21,12 @@ import org.jetbrains.kotlin.modules.Module import java.util.* class ModuleBuilder( - private val name: String, - private val outputDir: String, - private val type: String + private val name: String, + private val outputDir: String, + private val type: String ) : Module { private val sourceFiles = ArrayList() + private val commonSourceFiles = ArrayList() private val classpathRoots = ArrayList() private val javaSourceRoots = ArrayList() private val friendDirs = ArrayList() @@ -35,6 +36,10 @@ class ModuleBuilder( sourceFiles.add(path) } + fun addCommonSourceFiles(path: String) { + commonSourceFiles.add(path) + } + fun addClasspathEntry(path: String) { classpathRoots.add(path) } @@ -51,6 +56,7 @@ class ModuleBuilder( override fun getFriendPaths(): List = friendDirs override fun getJavaSourceRoots(): List = javaSourceRoots override fun getSourceFiles(): List = sourceFiles + override fun getCommonSourceFiles(): List = commonSourceFiles override fun getClasspathRoots(): List = classpathRoots override fun getModuleName(): String = name override fun getModuleType(): String = type diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleXmlParser.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleXmlParser.java index c34ee31c1d5..4cf2357257c 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleXmlParser.java +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/modules/ModuleXmlParser.java @@ -47,6 +47,7 @@ public class ModuleXmlParser { public static final String OUTPUT_DIR = "outputDir"; public static final String FRIEND_DIR = "friendDir"; public static final String SOURCES = "sources"; + public static final String COMMON_SOURCES = "commonSources"; public static final String JAVA_SOURCE_ROOTS = "javaSourceRoots"; public static final String JAVA_SOURCE_PACKAGE_PREFIX = "packagePrefix"; public static final String PATH = "path"; @@ -159,6 +160,10 @@ public class ModuleXmlParser { String path = getAttribute(attributes, PATH, qName); moduleBuilder.addSourceFiles(path); } + else if (COMMON_SOURCES.equalsIgnoreCase(qName)) { + String path = getAttribute(attributes, PATH, qName); + moduleBuilder.addCommonSourceFiles(path); + } else if (FRIEND_DIR.equalsIgnoreCase(qName)) { String path = getAttribute(attributes, PATH, qName); moduleBuilder.addFriendDir(path); diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/config/ContentRoots.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/config/ContentRoots.kt index df2bfcc2787..03525751f70 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/config/ContentRoots.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/config/ContentRoots.kt @@ -10,14 +10,18 @@ import org.jetbrains.kotlin.config.CompilerConfiguration interface ContentRoot -data class KotlinSourceRoot(val path: String): ContentRoot +/** + * @param isCommon whether this source root contains sources of a common module in a multi-platform project + */ +data class KotlinSourceRoot(val path: String, val isCommon: Boolean): ContentRoot -fun CompilerConfiguration.addKotlinSourceRoot(source: String) { - add(CLIConfigurationKeys.CONTENT_ROOTS, KotlinSourceRoot(source)) +@JvmOverloads +fun CompilerConfiguration.addKotlinSourceRoot(path: String, isCommon: Boolean = false) { + add(CLIConfigurationKeys.CONTENT_ROOTS, KotlinSourceRoot(path, isCommon)) } fun CompilerConfiguration.addKotlinSourceRoots(sources: List): Unit = - sources.forEach(this::addKotlinSourceRoot) + sources.forEach { addKotlinSourceRoot(it) } -val CompilerConfiguration.kotlinSourceRoots: List - get() = get(CLIConfigurationKeys.CONTENT_ROOTS)?.filterIsInstance()?.map { it.path }.orEmpty() +val CompilerConfiguration.kotlinSourceRoots: List + get() = get(CLIConfigurationKeys.CONTENT_ROOTS)?.filterIsInstance().orEmpty() diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java index 1e02f9fa6df..02b001940e9 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java @@ -26,6 +26,7 @@ import com.intellij.util.ExceptionUtil; import com.intellij.util.SmartList; import kotlin.collections.ArraysKt; import kotlin.collections.CollectionsKt; +import kotlin.collections.SetsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.analyzer.AnalysisResult; @@ -175,7 +176,12 @@ public class K2JSCompiler extends CLICompiler { configuration.put(JSConfigurationKeys.LIBRARIES, configureLibraries(arguments, paths, messageCollector)); - ContentRootsKt.addKotlinSourceRoots(configuration, arguments.getFreeArgs()); + String[] commonSourcesArray = arguments.getCommonSources(); + Set commonSources = commonSourcesArray == null ? Collections.emptySet() : SetsKt.setOf(commonSourcesArray); + for (String arg : arguments.getFreeArgs()) { + ContentRootsKt.addKotlinSourceRoot(configuration, arg, commonSources.contains(arg)); + } + KotlinCoreEnvironment environmentForJS = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES); 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 59c433df984..f6fae341598 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -77,13 +77,14 @@ class K2JVMCompiler : CLICompiler() { val pluginLoadResult = loadPlugins(arguments, configuration) if (pluginLoadResult != ExitCode.OK) return pluginLoadResult + val commonSources = arguments.commonSources?.toSet().orEmpty() if (!arguments.script && arguments.buildFile == null) { for (arg in arguments.freeArgs) { val file = File(arg) if (file.extension == JavaFileType.DEFAULT_EXTENSION) { configuration.addJavaSourceRoot(file) } else { - configuration.addKotlinSourceRoot(arg) + configuration.addKotlinSourceRoot(arg, isCommon = arg in commonSources) if (file.isDirectory) { configuration.addJavaSourceRoot(file) } 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 f0ea4832870..96017de9c8b 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 @@ -69,6 +69,7 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY import org.jetbrains.kotlin.cli.common.config.ContentRoot +import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR @@ -110,6 +111,7 @@ import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtens import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver import org.jetbrains.kotlin.resolve.lazy.declarations.CliDeclarationProviderFactoryService import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService +import org.jetbrains.kotlin.resolve.multiplatform.isCommonSource import org.jetbrains.kotlin.script.ScriptDefinitionProvider import org.jetbrains.kotlin.script.ScriptDependenciesProvider import org.jetbrains.kotlin.script.ScriptReportSink @@ -400,16 +402,18 @@ class KotlinCoreEnvironment private constructor( private fun findJarRoot(file: File): VirtualFile? = applicationEnvironment.jarFileSystem.findFileByPath("$file${URLUtil.JAR_SEPARATOR}") - private fun getSourceRootsCheckingForDuplicates(): Collection { - val uniqueSourceRoots = linkedSetOf() + private fun getSourceRootsCheckingForDuplicates(): List { + val uniqueSourceRoots = hashSetOf() + val result = mutableListOf() - configuration.kotlinSourceRoots.forEach { path -> - if (!uniqueSourceRoots.add(path)) { - report(STRONG_WARNING, "Duplicate source root: $path") + for (root in configuration.kotlinSourceRoots) { + if (!uniqueSourceRoots.add(root.path)) { + report(STRONG_WARNING, "Duplicate source root: ${root.path}") } + result.add(root) } - return uniqueSourceRoots + return result } fun getSourceFiles(): List = sourceFiles @@ -425,7 +429,7 @@ class KotlinCoreEnvironment private constructor( val virtualFileCreator = PreprocessedFileCreator(project) - for (sourceRootPath in sourceRoots) { + for ((sourceRootPath, isCommon) in sourceRoots) { val vFile = localFileSystem.findFileByPath(sourceRootPath) if (vFile == null) { val message = "Source file or directory not found: $sourceRootPath" @@ -452,6 +456,9 @@ class KotlinCoreEnvironment private constructor( val psiFile = psiManager.findFile(virtualFile) if (psiFile is KtFile) { result.add(psiFile) + if (isCommon) { + psiFile.isCommonSource = true + } } } } 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 547058cd2e1..c0b457b3846 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 @@ -34,7 +34,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.checkKotlinPackageUsage -import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots +import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.OUTPUT import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.WARNING @@ -65,18 +65,6 @@ import java.lang.reflect.InvocationTargetException import java.net.URLClassLoader object KotlinToJVMBytecodeCompiler { - - private fun getAbsoluteFiles(buildFile: File, module: Module): List { - return module.getSourceFiles().map { sourceFile -> - val source = File(sourceFile) - if (!source.isAbsolute) { - File(buildFile.absoluteFile.parentFile, sourceFile) - } else { - source - } - } - } - private fun writeOutput( configuration: CompilerConfiguration, outputFiles: OutputFileCollection, @@ -142,7 +130,7 @@ object KotlinToJVMBytecodeCompiler { for (module in chunk) { ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() - val moduleSourceFiles = getAbsoluteFiles(buildFile, module).map { file -> localFileSystem.findFileByPath(file.path) } + val moduleSourceFiles = getAbsolutePaths(buildFile, module.getSourceFiles()).map(localFileSystem::findFileByPath) val ktFiles = environment.getSourceFiles().filter { file -> file.virtualFile in moduleSourceFiles } if (!checkKotlinPackageUsage(environment, ktFiles)) return false @@ -184,7 +172,11 @@ object KotlinToJVMBytecodeCompiler { internal fun configureSourceRoots(configuration: CompilerConfiguration, chunk: List, buildFile: File) { for (module in chunk) { - configuration.addKotlinSourceRoots(getAbsoluteFiles(buildFile, module).map(File::getPath)) + val commonSources = getAbsolutePaths(buildFile, module.getCommonSourceFiles()).toSet() + + for (path in getAbsolutePaths(buildFile, module.getSourceFiles())) { + configuration.addKotlinSourceRoot(path, isCommon = path in commonSources) + } } for (module in chunk) { @@ -224,6 +216,16 @@ object KotlinToJVMBytecodeCompiler { configuration.addAll(JVMConfigurationKeys.MODULES, chunk) } + private fun getAbsolutePaths(buildFile: File, sourceFilePaths: List): List = + sourceFilePaths.map { path -> + val sourceFile = File(path) + if (!sourceFile.isAbsolute) { + File(buildFile.absoluteFile.parentFile, path).absolutePath + } else { + sourceFile.absolutePath + } + } + private fun findMainClass(generationState: GenerationState, files: List): FqName? { val mainFunctionDetector = MainFunctionDetector(generationState.bindingContext) return files.asSequence() diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt index 09c806252e7..8f597d3ff3e 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt @@ -60,7 +60,7 @@ class K2MetadataCompiler : CLICompiler() { if (pluginLoadResult != ExitCode.OK) return pluginLoadResult for (arg in arguments.freeArgs) { - configuration.addKotlinSourceRoot(arg) + configuration.addKotlinSourceRoot(arg, isCommon = true) } if (arguments.classpath != null) { configuration.addJvmClasspathRoots(arguments.classpath!!.split(File.pathSeparatorChar).map(::File)) diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index 6dae46fe948..67f6385e751 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -38,7 +38,6 @@ import org.jetbrains.kotlin.cli.js.K2JSCompiler import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler -import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.daemon.common.* import org.jetbrains.kotlin.daemon.report.CompileServicesFacadeMessageCollector @@ -50,10 +49,10 @@ import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer -import org.jetbrains.kotlin.incremental.parsing.classesFqNames import org.jetbrains.kotlin.incremental.multiproject.ModulesApiHistoryAndroid import org.jetbrains.kotlin.incremental.multiproject.ModulesApiHistoryJs import org.jetbrains.kotlin.incremental.multiproject.ModulesApiHistoryJvm +import org.jetbrains.kotlin.incremental.parsing.classesFqNames import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.modules.Module import org.jetbrains.kotlin.progress.CompilationCanceledStatus @@ -516,6 +515,8 @@ class CompileServiceImpl( it.getJavaSourceRoots().map { JvmSourceRoot(File(it.path), it.packagePrefix) } } + k2jvmArgs.commonSources = parsedModule.modules.flatMap { it.getCommonSourceFiles() }.toTypedArray().takeUnless { it.isEmpty() } + val allKotlinFiles = parsedModule.modules.flatMap { it.getSourceFiles().map(::File) } k2jvmArgs.friendPaths = parsedModule.modules.flatMap(Module::getFriendPaths).toTypedArray() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/multiplatform/isCommonSource.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/multiplatform/isCommonSource.kt new file mode 100644 index 00000000000..37db9090184 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/multiplatform/isCommonSource.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.resolve.multiplatform + +import com.intellij.openapi.util.Key +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.UserDataProperty + +/** + * Returns true if this file is a part of the common module in a multi-platform project. + * This setting only makes sense in the compiler, not in the IDE where sources from common modules are analyzed as common + */ +var KtFile.isCommonSource: Boolean? by UserDataProperty(Key.create("IS_COMMON_SOURCE")) 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 8b432bf078c..ea0863eff97 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 @@ -340,13 +340,16 @@ class IncrementalJvmCompilerRunner( val compiler = K2JVMCompiler() val outputDir = args.destinationAsFile val classpath = args.classpathAsList - val moduleFile = makeModuleFile(args.moduleName!!, - isTest = false, - outputDir = outputDir, - sourcesToCompile = sourcesToCompile, - javaSourceRoots = javaSourceRoots, - classpath = classpath, - friendDirs = listOf()) + val moduleFile = makeModuleFile( + args.moduleName!!, + isTest = false, + outputDir = outputDir, + sourcesToCompile = sourcesToCompile, + commonSources = args.commonSources?.map(::File).orEmpty(), + javaSourceRoots = javaSourceRoots, + classpath = classpath, + friendDirs = listOf() + ) val destination = args.destination args.destination = null args.buildFile = moduleFile.absolutePath diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index ec4dfae0c87..afcbfc67518 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -4,6 +4,8 @@ where advanced options include: -Xfriend-modules-disabled Disable internal declaration export -Xtyped-arrays Translate primitive arrays to JS typed arrays -Xallow-kotlin-package Allow compiling code in package 'kotlin' and allow not requiring kotlin.stdlib in module-info + -Xcommon-sources= Sources of the common module that need to be compiled together with this module in the multi-platform mode. + Should be a subset of sources passed as free arguments -Xcoroutines={enable|warn|error} Enable coroutines or report warnings or errors on declarations and use sites of 'suspend' modifier -Xdump-perf= Dump detailed performance statistics to the specified file diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 756c169fd1e..9b15823842e 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -60,6 +60,8 @@ where advanced options include: -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) -Xuse-type-table Use type table in metadata serialization -Xallow-kotlin-package Allow compiling code in package 'kotlin' and allow not requiring kotlin.stdlib in module-info + -Xcommon-sources= Sources of the common module that need to be compiled together with this module in the multi-platform mode. + Should be a subset of sources passed as free arguments -Xcoroutines={enable|warn|error} Enable coroutines or report warnings or errors on declarations and use sites of 'suspend' modifier -Xdump-perf= Dump detailed performance statistics to the specified file diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java index 11cc948ceae..3e782d7c205 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.checkers.CompilerTestLanguageVersionSettings; import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; import org.jetbrains.kotlin.cli.common.config.ContentRootsKt; +import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot; import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation; import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity; import org.jetbrains.kotlin.cli.common.messages.MessageCollector; @@ -610,11 +611,11 @@ public class KotlinTestUtils { } public static void resolveAllKotlinFiles(KotlinCoreEnvironment environment) throws IOException { - List paths = ContentRootsKt.getKotlinSourceRoots(environment.getConfiguration()); - if (paths.isEmpty()) return; + List roots = ContentRootsKt.getKotlinSourceRoots(environment.getConfiguration()); + if (roots.isEmpty()) return; List ktFiles = new ArrayList<>(); - for (String path : paths) { - File file = new File(path); + for (KotlinSourceRoot root : roots) { + File file = new File(root.getPath()); if (file.isFile()) { ktFiles.add(loadJetFile(environment.getProject(), file)); } diff --git a/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt index 742d4b9c338..0ad417e7cc2 100644 --- a/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt @@ -55,24 +55,24 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { val result = buildString { appendln("-- Common --") - appendln(K2MetadataCompiler().compile(listOf(commonSrc), "-d", commonDest, *optionalStdlibCommon)) + appendln(K2MetadataCompiler().compile(commonSrc, null, "-d", commonDest, *optionalStdlibCommon)) if (jvmSrc != null) { appendln() appendln("-- JVM --") - appendln(K2JVMCompiler().compileBothWays(commonSrc, jvmSrc, "-d", jvmDest!!)) + appendln(K2JVMCompiler().compile(jvmSrc, commonSrc, "-d", jvmDest!!)) } if (jsSrc != null) { appendln() appendln("-- JS --") - appendln(K2JSCompiler().compileBothWays(commonSrc, jsSrc, "-output", jsDest!!)) + appendln(K2JSCompiler().compile(jsSrc, commonSrc, "-output", jsDest!!)) } if (common2Src != null) { appendln() appendln("-- Common (2) --") - appendln(K2MetadataCompiler().compile(listOf(common2Src), "-d", common2Dest!!, "-cp", commonDest, *optionalStdlibCommon)) + appendln(K2MetadataCompiler().compile(common2Src, null, "-d", common2Dest!!, "-cp", commonDest, *optionalStdlibCommon)) } if (jvm2Src != null) { @@ -80,7 +80,7 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { appendln("-- JVM (2) --") appendln( K2JVMCompiler().compile( - listOf(jvm2Src), "-d", jvm2Dest!!, + jvm2Src, common2Src, "-d", jvm2Dest!!, "-cp", listOfNotNull(commonDest, common2Dest, jvmDest).joinToString(File.pathSeparator) ) ) @@ -100,28 +100,12 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { }?.toFile() ?: error("kotlin-stdlib-common is not found in $stdlibCommonLibsDir") } - private fun CLICompiler<*>.compileBothWays(commonSource: File, platformSource: File, vararg mainArguments: String): String { - val configurations = listOf( - listOf(platformSource, commonSource), - listOf(commonSource, platformSource) - ) - - val (platformFirst, commonFirst) = configurations.map { compile(it, *mainArguments) } - - if (platformFirst != commonFirst) { - assertEquals( - "Compilation results are different when compiling [platform-specific, common] compared to when compiling [common, platform-specific]", - "// Compiling [platform-specific, common]\n\n$platformFirst", - "// Compiling [common, platform-specific]\n\n$commonFirst" - ) - } - return platformFirst - } - - private fun CLICompiler<*>.compile(sources: List, vararg mainArguments: String): String = buildString { + private fun CLICompiler<*>.compile(sources: File, commonSources: File?, vararg mainArguments: String): String = buildString { val (output, exitCode) = AbstractCliTest.executeCompilerGrabOutput( this@compile, - sources.map(File::getAbsolutePath) + listOf("-Xmulti-platform") + mainArguments + loadExtraArguments(sources) + listOfNotNull(sources.absolutePath, commonSources?.absolutePath, commonSources?.absolutePath?.let("-Xcommon-sources="::plus)) + + "-Xmulti-platform" + mainArguments + + loadExtraArguments(listOfNotNull(sources, commonSources)) ) appendln("Exit code: $exitCode") appendln("Output:") diff --git a/compiler/util/src/org/jetbrains/kotlin/modules/Module.kt b/compiler/util/src/org/jetbrains/kotlin/modules/Module.kt index 84d0b9bf102..15e675dd131 100644 --- a/compiler/util/src/org/jetbrains/kotlin/modules/Module.kt +++ b/compiler/util/src/org/jetbrains/kotlin/modules/Module.kt @@ -27,6 +27,8 @@ interface Module { fun getSourceFiles(): List + fun getCommonSourceFiles(): List + fun getClasspathRoots(): List fun getJavaSourceRoots(): List diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt index b582978271b..13a812223e1 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.jps.build import com.intellij.testFramework.UsefulTestCase -import com.intellij.util.containers.HashMap import com.intellij.util.containers.StringInterner import org.jetbrains.kotlin.TestWithWorkingDir import org.jetbrains.kotlin.build.JvmSourceRoot @@ -78,13 +77,14 @@ abstract class AbstractJvmLookupTrackerTest : AbstractLookupTrackerTest() { override fun runCompiler(filesToCompile: Iterable, env: JpsCompilerEnvironment): Any? { val moduleFile = makeModuleFile( - name = "test", - isTest = true, - outputDir = outDir, - sourcesToCompile = filesToCompile.toList(), - javaSourceRoots = listOf(JvmSourceRoot(srcDir, null)), - classpath = listOf(outDir, ForTestCompileRuntime.runtimeJarForTests()).filter { it.exists() }, - friendDirs = emptyList() + name = "test", + isTest = true, + outputDir = outDir, + sourcesToCompile = filesToCompile.toList(), + commonSources = emptyList(), + javaSourceRoots = listOf(JvmSourceRoot(srcDir, null)), + classpath = listOf(outDir, ForTestCompileRuntime.runtimeJarForTests()).filter { it.exists() }, + friendDirs = emptyList() ) val args = K2JVMCompilerArguments().apply { diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jvm/compiler/ClasspathOrderTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jvm/compiler/ClasspathOrderTest.kt index 5a67cbce68f..62ad269e3c1 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jvm/compiler/ClasspathOrderTest.kt +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jvm/compiler/ClasspathOrderTest.kt @@ -41,16 +41,17 @@ class ClasspathOrderTest : TestCaseWithTmpdir() { fun testClasspathOrderForModuleScriptBuild() { val xmlContent = KotlinModuleXmlBuilder().addModule( - "name", - File(tmpdir, "output").absolutePath, - listOf(sourceDir), - listOf(JvmSourceRoot(sourceDir)), - listOf(PathUtil.kotlinPathsForDistDirectory.stdlibPath), - null, - JavaModuleBuildTargetType.PRODUCTION.typeId, - JavaModuleBuildTargetType.PRODUCTION.isTests, - setOf(), - emptyList() + "name", + File(tmpdir, "output").absolutePath, + listOf(sourceDir), + listOf(JvmSourceRoot(sourceDir)), + listOf(PathUtil.kotlinPathsForDistDirectory.stdlibPath), + emptyList(), + null, + JavaModuleBuildTargetType.PRODUCTION.typeId, + JavaModuleBuildTargetType.PRODUCTION.isTests, + setOf(), + emptyList() ).asText().toString() val xml = File(tmpdir, "module.xml") diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java index 7aa57449b70..ede464de4dc 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java @@ -33,6 +33,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { Arrays.asList(new File("s1"), new File("s2")), Collections.singletonList(new JvmSourceRoot(new File("java"), null)), Arrays.asList(new File("cp1"), new File("cp2")), + Collections.emptyList(), null, JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.isTests(), @@ -49,6 +50,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { Arrays.asList(new File("s1"), new File("s2")), Collections.emptyList(), Arrays.asList(new File("cp1"), new File("cp2")), + Collections.emptyList(), null, JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.isTests(), @@ -66,6 +68,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { Arrays.asList(new File("s1"), new File("s2")), Collections.emptyList(), Arrays.asList(new File("cp1"), new File("cp2")), + Collections.emptyList(), null, JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.isTests(), @@ -78,6 +81,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { Arrays.asList(new File("s12"), new File("s22")), Collections.emptyList(), Arrays.asList(new File("cp12"), new File("cp22")), + Collections.emptyList(), null, JavaModuleBuildTargetType.TEST.getTypeId(), JavaModuleBuildTargetType.TEST.isTests(), @@ -95,6 +99,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), new File("/path/to/modular/jdk"), JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.isTests(), diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinJvmModuleBuildTarget.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinJvmModuleBuildTarget.kt index 6f1aa6660ae..2d9a2958163 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinJvmModuleBuildTarget.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinJvmModuleBuildTarget.kt @@ -150,6 +150,7 @@ class KotlinJvmModuleBuildTarget(compileContext: CompileContext, jpsModuleBuildT val friendDirs = target.friendOutputDirs val moduleSources = collectSourcesToCompile(target, dirtyFilesHolder) + val commonSources = emptyList() // TODO: pass common sources here val hasDirtyOrRemovedSources = checkShouldCompileAndLog(target, dirtyFilesHolder, moduleSources) if (hasDirtyOrRemovedSources) hasDirtySources = true @@ -160,6 +161,7 @@ class KotlinJvmModuleBuildTarget(compileContext: CompileContext, jpsModuleBuildT moduleSources, target.findSourceRoots(context), target.findClassPathRoots(), + commonSources, target.findModularJdkRoot(), kotlinModuleId.type, isTests, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 1fd538b26c2..d9b5a21984d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -17,6 +17,9 @@ package org.jetbrains.kotlin.compilerRunner import org.gradle.api.Project +import org.gradle.api.invocation.Gradle +import org.gradle.api.plugins.JavaPluginConvention +import org.gradle.jvm.tasks.Jar import org.jetbrains.kotlin.build.JvmSourceRoot import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments @@ -27,22 +30,17 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageRenderer -import org.gradle.api.invocation.Gradle -import org.gradle.api.plugins.JavaPluginConvention -import org.gradle.jvm.tasks.Jar import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.daemon.client.CompileServiceSession import org.jetbrains.kotlin.daemon.common.* -import org.jetbrains.kotlin.daemon.common.IncrementalModuleEntry -import org.jetbrains.kotlin.daemon.common.IncrementalModuleInfo import org.jetbrains.kotlin.gradle.incremental.GRADLE_CACHE_VERSION import org.jetbrains.kotlin.gradle.incremental.GRADLE_CACHE_VERSION_FILE_NAME -import org.jetbrains.kotlin.gradle.utils.relativeToRoot import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.InspectClassesForMultiModuleIC import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.utils.newTmpFile +import org.jetbrains.kotlin.gradle.utils.relativeToRoot import org.jetbrains.kotlin.incremental.* import java.io.ByteArrayOutputStream import java.io.File @@ -95,19 +93,22 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil fun runJvmCompiler( sourcesToCompile: List, + commonSources: List, javaSourceRoots: Iterable, javaPackagePrefix: String?, args: K2JVMCompilerArguments, environment: GradleCompilerEnvironment ): ExitCode { val buildFile = makeModuleFile( - args.moduleName!!, - isTest = false, - outputDir = args.destinationAsFile, - sourcesToCompile = sourcesToCompile, - javaSourceRoots = javaSourceRoots.map { JvmSourceRoot(it, javaPackagePrefix) }, - classpath = args.classpathAsList, - friendDirs = args.friendPaths?.map(::File) ?: emptyList()) + args.moduleName!!, + isTest = false, + outputDir = args.destinationAsFile, + sourcesToCompile = sourcesToCompile, + commonSources = commonSources, + javaSourceRoots = javaSourceRoots.map { JvmSourceRoot(it, javaPackagePrefix) }, + classpath = args.classpathAsList, + friendDirs = args.friendPaths?.map(::File).orEmpty() + ) args.buildFile = buildFile.absolutePath if (environment !is GradleIncrementalCompilerEnvironment || kotlinCompilerExecutionStrategy != "daemon") { @@ -125,10 +126,12 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil fun runJsCompiler( kotlinSources: List, + kotlinCommonSources: List, args: K2JSCompilerArguments, environment: GradleCompilerEnvironment ): ExitCode { args.freeArgs += kotlinSources.map { it.absolutePath } + args.commonSources = kotlinCommonSources.map { it.absolutePath }.toTypedArray() return runCompiler(K2JS_COMPILER, args, environment) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt index fecec3d3e21..cdb7aefea85 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt @@ -16,11 +16,11 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl +import org.jetbrains.kotlin.gradle.plugin.PLUGIN_CLASSPATH_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions import org.jetbrains.kotlin.gradle.tasks.GradleMessageCollector import org.jetbrains.kotlin.gradle.tasks.clearOutputDirectories import org.jetbrains.kotlin.gradle.tasks.throwGradleExceptionIfError -import org.jetbrains.kotlin.gradle.plugin.PLUGIN_CLASSPATH_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput { @@ -70,6 +70,7 @@ open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput>() .single { it.sourceSetName == commonSourceSet.name } - platformTask.source(getKotlinSourceDirectorySetSafe(commonSourceSet)) + val commonSources = getKotlinSourceDirectorySetSafe(commonSourceSet)!! + platformTask.source(commonSources) + platformTask.commonSourceSet = commonSources } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 463e22a23db..7488b05a7f0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -27,14 +27,16 @@ import org.jetbrains.kotlin.compilerRunner.* import org.jetbrains.kotlin.daemon.common.MultiModuleICSettings import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.incremental.ChangedFiles -import org.jetbrains.kotlin.gradle.utils.pathsAsStringRelativeTo import org.jetbrains.kotlin.gradle.internal.CompilerArgumentAwareWithInput import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion -import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray import org.jetbrains.kotlin.gradle.utils.isParentOf -import org.jetbrains.kotlin.incremental.* +import org.jetbrains.kotlin.gradle.utils.pathsAsStringRelativeTo +import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray +import org.jetbrains.kotlin.incremental.ChangedFiles +import org.jetbrains.kotlin.incremental.classpathAsList +import org.jetbrains.kotlin.incremental.destinationAsFile import org.jetbrains.kotlin.utils.LibraryUtils import java.io.File import java.util.* @@ -189,6 +191,9 @@ abstract class AbstractKotlinCompile() : AbstractKo @get:Internal internal var sourceSetName: String by Delegates.notNull() + @get:InputFiles + internal var commonSourceSet: Iterable = emptyList() + @get:Input internal val moduleName: String get() { @@ -385,11 +390,13 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl try { val exitCode = compilerRunner.runJvmCompiler( - sourceRoots.kotlinSourceFiles, - sourceRoots.javaSourceRoots, - javaPackagePrefix, - args, - environment) + sourceRoots.kotlinSourceFiles, + commonSourceSet.toList(), + sourceRoots.javaSourceRoots, + javaPackagePrefix, + args, + environment + ) disableMultiModuleICIfNeeded() processCompilerExitCode(exitCode) @@ -536,7 +543,7 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile(), } } - val exitCode = compilerRunner.runJsCompiler(sourceRoots.kotlinSourceFiles, args, environment) + val exitCode = compilerRunner.runJsCompiler(sourceRoots.kotlinSourceFiles, commonSourceSet.toList(), args, environment) throwGradleExceptionIfError(exitCode) } } diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java index 504e8be96e7..81185396229 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java @@ -179,7 +179,7 @@ public class ExecuteKotlinScriptMojo extends AbstractMojo { } } - configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, new KotlinSourceRoot(scriptFile.getAbsolutePath())); + configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, new KotlinSourceRoot(scriptFile.getAbsolutePath(), false)); configuration.put(CommonConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME); ScriptingCompilerConfigurationExtensionKt.configureScriptDefinitions(