Introduce -Xcommon-sources and pass it correctly from build tool plugins

#KT-25196 In Progress
This commit is contained in:
Alexander Udalov
2018-07-27 14:15:12 +02:00
parent d35e73d29b
commit 0f003802fe
28 changed files with 205 additions and 126 deletions
@@ -41,6 +41,7 @@ fun makeModuleFile(
isTest: Boolean, isTest: Boolean,
outputDir: File, outputDir: File,
sourcesToCompile: Iterable<File>, sourcesToCompile: Iterable<File>,
commonSources: Iterable<File>,
javaSourceRoots: Iterable<JvmSourceRoot>, javaSourceRoots: Iterable<JvmSourceRoot>,
classpath: Iterable<File>, classpath: Iterable<File>,
friendDirs: Iterable<File> friendDirs: Iterable<File>
@@ -55,6 +56,7 @@ fun makeModuleFile(
sourcesToCompile.map { it.absoluteFile }, sourcesToCompile.map { it.absoluteFile },
javaSourceRoots, javaSourceRoots,
classpath, classpath,
commonSources.map { it.absoluteFile },
null, null,
"java-production", "java-production",
isTest, isTest,
@@ -34,16 +34,18 @@ class KotlinModuleXmlBuilder {
} }
fun addModule( fun addModule(
moduleName: String, moduleName: String,
outputDir: String, outputDir: String,
sourceFiles: Iterable<File>, sourceFiles: Iterable<File>,
javaSourceRoots: Iterable<JvmSourceRoot>, javaSourceRoots: Iterable<JvmSourceRoot>,
classpathRoots: Iterable<File>, classpathRoots: Iterable<File>,
modularJdkRoot: File?, commonSourceFiles: Iterable<File>,
targetTypeId: String, modularJdkRoot: File?,
isTests: Boolean, targetTypeId: String,
directoriesToFilterOut: Set<File>, isTests: Boolean,
friendDirs: Iterable<File>): KotlinModuleXmlBuilder { directoriesToFilterOut: Set<File>,
friendDirs: Iterable<File>
): KotlinModuleXmlBuilder {
assert(!done) { "Already done" } assert(!done) { "Already done" }
p.println("<!-- Module script for ${if (isTests) "tests" else "production"} -->") p.println("<!-- Module script for ${if (isTests) "tests" else "production"} -->")
@@ -62,6 +64,10 @@ class KotlinModuleXmlBuilder {
p.println("<", SOURCES, " ", PATH, "=\"", getEscapedPath(sourceFile), "\"/>") p.println("<", SOURCES, " ", PATH, "=\"", getEscapedPath(sourceFile), "\"/>")
} }
for (commonSourceFile in commonSourceFiles) {
p.println("<", COMMON_SOURCES, " ", PATH, "=\"", getEscapedPath(commonSourceFile), "\"/>")
}
processJavaSourceRoots(javaSourceRoots) processJavaSourceRoots(javaSourceRoots)
processClasspath(classpathRoots, directoriesToFilterOut) processClasspath(classpathRoots, directoriesToFilterOut)
@@ -180,6 +180,14 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
) )
var metadataVersion: String? by FreezableVar(null) var metadataVersion: String? by FreezableVar(null)
@Argument(
value = "-Xcommon-sources",
valueDescription = "<path>",
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<String>? by FreezableVar(null)
open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> { open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
return HashMap<AnalysisFlag<*>, Any>().apply { return HashMap<AnalysisFlag<*>, Any>().apply {
put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck) put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck)
@@ -21,11 +21,12 @@ import org.jetbrains.kotlin.modules.Module
import java.util.* import java.util.*
class ModuleBuilder( class ModuleBuilder(
private val name: String, private val name: String,
private val outputDir: String, private val outputDir: String,
private val type: String private val type: String
) : Module { ) : Module {
private val sourceFiles = ArrayList<String>() private val sourceFiles = ArrayList<String>()
private val commonSourceFiles = ArrayList<String>()
private val classpathRoots = ArrayList<String>() private val classpathRoots = ArrayList<String>()
private val javaSourceRoots = ArrayList<JavaRootPath>() private val javaSourceRoots = ArrayList<JavaRootPath>()
private val friendDirs = ArrayList<String>() private val friendDirs = ArrayList<String>()
@@ -35,6 +36,10 @@ class ModuleBuilder(
sourceFiles.add(path) sourceFiles.add(path)
} }
fun addCommonSourceFiles(path: String) {
commonSourceFiles.add(path)
}
fun addClasspathEntry(path: String) { fun addClasspathEntry(path: String) {
classpathRoots.add(path) classpathRoots.add(path)
} }
@@ -51,6 +56,7 @@ class ModuleBuilder(
override fun getFriendPaths(): List<String> = friendDirs override fun getFriendPaths(): List<String> = friendDirs
override fun getJavaSourceRoots(): List<JavaRootPath> = javaSourceRoots override fun getJavaSourceRoots(): List<JavaRootPath> = javaSourceRoots
override fun getSourceFiles(): List<String> = sourceFiles override fun getSourceFiles(): List<String> = sourceFiles
override fun getCommonSourceFiles(): List<String> = commonSourceFiles
override fun getClasspathRoots(): List<String> = classpathRoots override fun getClasspathRoots(): List<String> = classpathRoots
override fun getModuleName(): String = name override fun getModuleName(): String = name
override fun getModuleType(): String = type override fun getModuleType(): String = type
@@ -47,6 +47,7 @@ public class ModuleXmlParser {
public static final String OUTPUT_DIR = "outputDir"; public static final String OUTPUT_DIR = "outputDir";
public static final String FRIEND_DIR = "friendDir"; public static final String FRIEND_DIR = "friendDir";
public static final String SOURCES = "sources"; 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_ROOTS = "javaSourceRoots";
public static final String JAVA_SOURCE_PACKAGE_PREFIX = "packagePrefix"; public static final String JAVA_SOURCE_PACKAGE_PREFIX = "packagePrefix";
public static final String PATH = "path"; public static final String PATH = "path";
@@ -159,6 +160,10 @@ public class ModuleXmlParser {
String path = getAttribute(attributes, PATH, qName); String path = getAttribute(attributes, PATH, qName);
moduleBuilder.addSourceFiles(path); moduleBuilder.addSourceFiles(path);
} }
else if (COMMON_SOURCES.equalsIgnoreCase(qName)) {
String path = getAttribute(attributes, PATH, qName);
moduleBuilder.addCommonSourceFiles(path);
}
else if (FRIEND_DIR.equalsIgnoreCase(qName)) { else if (FRIEND_DIR.equalsIgnoreCase(qName)) {
String path = getAttribute(attributes, PATH, qName); String path = getAttribute(attributes, PATH, qName);
moduleBuilder.addFriendDir(path); moduleBuilder.addFriendDir(path);
@@ -10,14 +10,18 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
interface ContentRoot 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) { @JvmOverloads
add(CLIConfigurationKeys.CONTENT_ROOTS, KotlinSourceRoot(source)) fun CompilerConfiguration.addKotlinSourceRoot(path: String, isCommon: Boolean = false) {
add(CLIConfigurationKeys.CONTENT_ROOTS, KotlinSourceRoot(path, isCommon))
} }
fun CompilerConfiguration.addKotlinSourceRoots(sources: List<String>): Unit = fun CompilerConfiguration.addKotlinSourceRoots(sources: List<String>): Unit =
sources.forEach(this::addKotlinSourceRoot) sources.forEach { addKotlinSourceRoot(it) }
val CompilerConfiguration.kotlinSourceRoots: List<String> val CompilerConfiguration.kotlinSourceRoots: List<KotlinSourceRoot>
get() = get(CLIConfigurationKeys.CONTENT_ROOTS)?.filterIsInstance<KotlinSourceRoot>()?.map { it.path }.orEmpty() get() = get(CLIConfigurationKeys.CONTENT_ROOTS)?.filterIsInstance<KotlinSourceRoot>().orEmpty()
@@ -26,6 +26,7 @@ import com.intellij.util.ExceptionUtil;
import com.intellij.util.SmartList; import com.intellij.util.SmartList;
import kotlin.collections.ArraysKt; import kotlin.collections.ArraysKt;
import kotlin.collections.CollectionsKt; import kotlin.collections.CollectionsKt;
import kotlin.collections.SetsKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.analyzer.AnalysisResult;
@@ -175,7 +176,12 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
configuration.put(JSConfigurationKeys.LIBRARIES, configureLibraries(arguments, paths, messageCollector)); configuration.put(JSConfigurationKeys.LIBRARIES, configureLibraries(arguments, paths, messageCollector));
ContentRootsKt.addKotlinSourceRoots(configuration, arguments.getFreeArgs()); String[] commonSourcesArray = arguments.getCommonSources();
Set<String> commonSources = commonSourcesArray == null ? Collections.emptySet() : SetsKt.setOf(commonSourcesArray);
for (String arg : arguments.getFreeArgs()) {
ContentRootsKt.addKotlinSourceRoot(configuration, arg, commonSources.contains(arg));
}
KotlinCoreEnvironment environmentForJS = KotlinCoreEnvironment environmentForJS =
KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES); KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES);
@@ -77,13 +77,14 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
val pluginLoadResult = loadPlugins(arguments, configuration) val pluginLoadResult = loadPlugins(arguments, configuration)
if (pluginLoadResult != ExitCode.OK) return pluginLoadResult if (pluginLoadResult != ExitCode.OK) return pluginLoadResult
val commonSources = arguments.commonSources?.toSet().orEmpty()
if (!arguments.script && arguments.buildFile == null) { if (!arguments.script && arguments.buildFile == null) {
for (arg in arguments.freeArgs) { for (arg in arguments.freeArgs) {
val file = File(arg) val file = File(arg)
if (file.extension == JavaFileType.DEFAULT_EXTENSION) { if (file.extension == JavaFileType.DEFAULT_EXTENSION) {
configuration.addJavaSourceRoot(file) configuration.addJavaSourceRoot(file)
} else { } else {
configuration.addKotlinSourceRoot(arg) configuration.addKotlinSourceRoot(arg, isCommon = arg in commonSources)
if (file.isDirectory) { if (file.isDirectory) {
configuration.addJavaSourceRoot(file) configuration.addJavaSourceRoot(file)
} }
@@ -69,6 +69,7 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl
import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY 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.ContentRoot
import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot
import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR 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.jvm.modules.JavaModuleResolver
import org.jetbrains.kotlin.resolve.lazy.declarations.CliDeclarationProviderFactoryService import org.jetbrains.kotlin.resolve.lazy.declarations.CliDeclarationProviderFactoryService
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService 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.ScriptDefinitionProvider
import org.jetbrains.kotlin.script.ScriptDependenciesProvider import org.jetbrains.kotlin.script.ScriptDependenciesProvider
import org.jetbrains.kotlin.script.ScriptReportSink import org.jetbrains.kotlin.script.ScriptReportSink
@@ -400,16 +402,18 @@ class KotlinCoreEnvironment private constructor(
private fun findJarRoot(file: File): VirtualFile? = private fun findJarRoot(file: File): VirtualFile? =
applicationEnvironment.jarFileSystem.findFileByPath("$file${URLUtil.JAR_SEPARATOR}") applicationEnvironment.jarFileSystem.findFileByPath("$file${URLUtil.JAR_SEPARATOR}")
private fun getSourceRootsCheckingForDuplicates(): Collection<String> { private fun getSourceRootsCheckingForDuplicates(): List<KotlinSourceRoot> {
val uniqueSourceRoots = linkedSetOf<String>() val uniqueSourceRoots = hashSetOf<String>()
val result = mutableListOf<KotlinSourceRoot>()
configuration.kotlinSourceRoots.forEach { path -> for (root in configuration.kotlinSourceRoots) {
if (!uniqueSourceRoots.add(path)) { if (!uniqueSourceRoots.add(root.path)) {
report(STRONG_WARNING, "Duplicate source root: $path") report(STRONG_WARNING, "Duplicate source root: ${root.path}")
} }
result.add(root)
} }
return uniqueSourceRoots return result
} }
fun getSourceFiles(): List<KtFile> = sourceFiles fun getSourceFiles(): List<KtFile> = sourceFiles
@@ -425,7 +429,7 @@ class KotlinCoreEnvironment private constructor(
val virtualFileCreator = PreprocessedFileCreator(project) val virtualFileCreator = PreprocessedFileCreator(project)
for (sourceRootPath in sourceRoots) { for ((sourceRootPath, isCommon) in sourceRoots) {
val vFile = localFileSystem.findFileByPath(sourceRootPath) val vFile = localFileSystem.findFileByPath(sourceRootPath)
if (vFile == null) { if (vFile == null) {
val message = "Source file or directory not found: $sourceRootPath" val message = "Source file or directory not found: $sourceRootPath"
@@ -452,6 +456,9 @@ class KotlinCoreEnvironment private constructor(
val psiFile = psiManager.findFile(virtualFile) val psiFile = psiManager.findFile(virtualFile)
if (psiFile is KtFile) { if (psiFile is KtFile) {
result.add(psiFile) result.add(psiFile)
if (isCommon) {
psiFile.isCommonSource = true
}
} }
} }
} }
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.checkKotlinPackageUsage 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.AnalyzerWithCompilerReport
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.OUTPUT import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.OUTPUT
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.WARNING import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.WARNING
@@ -65,18 +65,6 @@ import java.lang.reflect.InvocationTargetException
import java.net.URLClassLoader import java.net.URLClassLoader
object KotlinToJVMBytecodeCompiler { object KotlinToJVMBytecodeCompiler {
private fun getAbsoluteFiles(buildFile: File, module: Module): List<File> {
return module.getSourceFiles().map { sourceFile ->
val source = File(sourceFile)
if (!source.isAbsolute) {
File(buildFile.absoluteFile.parentFile, sourceFile)
} else {
source
}
}
}
private fun writeOutput( private fun writeOutput(
configuration: CompilerConfiguration, configuration: CompilerConfiguration,
outputFiles: OutputFileCollection, outputFiles: OutputFileCollection,
@@ -142,7 +130,7 @@ object KotlinToJVMBytecodeCompiler {
for (module in chunk) { for (module in chunk) {
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() 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 } val ktFiles = environment.getSourceFiles().filter { file -> file.virtualFile in moduleSourceFiles }
if (!checkKotlinPackageUsage(environment, ktFiles)) return false if (!checkKotlinPackageUsage(environment, ktFiles)) return false
@@ -184,7 +172,11 @@ object KotlinToJVMBytecodeCompiler {
internal fun configureSourceRoots(configuration: CompilerConfiguration, chunk: List<Module>, buildFile: File) { internal fun configureSourceRoots(configuration: CompilerConfiguration, chunk: List<Module>, buildFile: File) {
for (module in chunk) { 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) { for (module in chunk) {
@@ -224,6 +216,16 @@ object KotlinToJVMBytecodeCompiler {
configuration.addAll(JVMConfigurationKeys.MODULES, chunk) configuration.addAll(JVMConfigurationKeys.MODULES, chunk)
} }
private fun getAbsolutePaths(buildFile: File, sourceFilePaths: List<String>): List<String> =
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<KtFile>): FqName? { private fun findMainClass(generationState: GenerationState, files: List<KtFile>): FqName? {
val mainFunctionDetector = MainFunctionDetector(generationState.bindingContext) val mainFunctionDetector = MainFunctionDetector(generationState.bindingContext)
return files.asSequence() return files.asSequence()
@@ -60,7 +60,7 @@ class K2MetadataCompiler : CLICompiler<K2MetadataCompilerArguments>() {
if (pluginLoadResult != ExitCode.OK) return pluginLoadResult if (pluginLoadResult != ExitCode.OK) return pluginLoadResult
for (arg in arguments.freeArgs) { for (arg in arguments.freeArgs) {
configuration.addKotlinSourceRoot(arg) configuration.addKotlinSourceRoot(arg, isCommon = true)
} }
if (arguments.classpath != null) { if (arguments.classpath != null) {
configuration.addJvmClasspathRoots(arguments.classpath!!.split(File.pathSeparatorChar).map(::File)) configuration.addJvmClasspathRoots(arguments.classpath!!.split(File.pathSeparatorChar).map(::File))
@@ -38,7 +38,6 @@ import org.jetbrains.kotlin.cli.js.K2JSCompiler
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler
import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.daemon.common.* import org.jetbrains.kotlin.daemon.common.*
import org.jetbrains.kotlin.daemon.report.CompileServicesFacadeMessageCollector 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.components.LookupTracker
import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer 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.ModulesApiHistoryAndroid
import org.jetbrains.kotlin.incremental.multiproject.ModulesApiHistoryJs import org.jetbrains.kotlin.incremental.multiproject.ModulesApiHistoryJs
import org.jetbrains.kotlin.incremental.multiproject.ModulesApiHistoryJvm 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.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.modules.Module import org.jetbrains.kotlin.modules.Module
import org.jetbrains.kotlin.progress.CompilationCanceledStatus import org.jetbrains.kotlin.progress.CompilationCanceledStatus
@@ -516,6 +515,8 @@ class CompileServiceImpl(
it.getJavaSourceRoots().map { JvmSourceRoot(File(it.path), it.packagePrefix) } 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) } val allKotlinFiles = parsedModule.modules.flatMap { it.getSourceFiles().map(::File) }
k2jvmArgs.friendPaths = parsedModule.modules.flatMap(Module::getFriendPaths).toTypedArray() k2jvmArgs.friendPaths = parsedModule.modules.flatMap(Module::getFriendPaths).toTypedArray()
@@ -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"))
@@ -340,13 +340,16 @@ class IncrementalJvmCompilerRunner(
val compiler = K2JVMCompiler() val compiler = K2JVMCompiler()
val outputDir = args.destinationAsFile val outputDir = args.destinationAsFile
val classpath = args.classpathAsList val classpath = args.classpathAsList
val moduleFile = makeModuleFile(args.moduleName!!, val moduleFile = makeModuleFile(
isTest = false, args.moduleName!!,
outputDir = outputDir, isTest = false,
sourcesToCompile = sourcesToCompile, outputDir = outputDir,
javaSourceRoots = javaSourceRoots, sourcesToCompile = sourcesToCompile,
classpath = classpath, commonSources = args.commonSources?.map(::File).orEmpty(),
friendDirs = listOf()) javaSourceRoots = javaSourceRoots,
classpath = classpath,
friendDirs = listOf()
)
val destination = args.destination val destination = args.destination
args.destination = null args.destination = null
args.buildFile = moduleFile.absolutePath args.buildFile = moduleFile.absolutePath
+2
View File
@@ -4,6 +4,8 @@ where advanced options include:
-Xfriend-modules-disabled Disable internal declaration export -Xfriend-modules-disabled Disable internal declaration export
-Xtyped-arrays Translate primitive arrays to JS typed arrays -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 -Xallow-kotlin-package Allow compiling code in package 'kotlin' and allow not requiring kotlin.stdlib in module-info
-Xcommon-sources=<path> 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} -Xcoroutines={enable|warn|error}
Enable coroutines or report warnings or errors on declarations and use sites of 'suspend' modifier Enable coroutines or report warnings or errors on declarations and use sites of 'suspend' modifier
-Xdump-perf=<path> Dump detailed performance statistics to the specified file -Xdump-perf=<path> Dump detailed performance statistics to the specified file
+2
View File
@@ -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-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 -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 -Xallow-kotlin-package Allow compiling code in package 'kotlin' and allow not requiring kotlin.stdlib in module-info
-Xcommon-sources=<path> 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} -Xcoroutines={enable|warn|error}
Enable coroutines or report warnings or errors on declarations and use sites of 'suspend' modifier Enable coroutines or report warnings or errors on declarations and use sites of 'suspend' modifier
-Xdump-perf=<path> Dump detailed performance statistics to the specified file -Xdump-perf=<path> Dump detailed performance statistics to the specified file
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.checkers.CompilerTestLanguageVersionSettings; import org.jetbrains.kotlin.checkers.CompilerTestLanguageVersionSettings;
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys;
import org.jetbrains.kotlin.cli.common.config.ContentRootsKt; 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.CompilerMessageLocation;
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity; import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity;
import org.jetbrains.kotlin.cli.common.messages.MessageCollector; import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
@@ -610,11 +611,11 @@ public class KotlinTestUtils {
} }
public static void resolveAllKotlinFiles(KotlinCoreEnvironment environment) throws IOException { public static void resolveAllKotlinFiles(KotlinCoreEnvironment environment) throws IOException {
List<String> paths = ContentRootsKt.getKotlinSourceRoots(environment.getConfiguration()); List<KotlinSourceRoot> roots = ContentRootsKt.getKotlinSourceRoots(environment.getConfiguration());
if (paths.isEmpty()) return; if (roots.isEmpty()) return;
List<KtFile> ktFiles = new ArrayList<>(); List<KtFile> ktFiles = new ArrayList<>();
for (String path : paths) { for (KotlinSourceRoot root : roots) {
File file = new File(path); File file = new File(root.getPath());
if (file.isFile()) { if (file.isFile()) {
ktFiles.add(loadJetFile(environment.getProject(), file)); ktFiles.add(loadJetFile(environment.getProject(), file));
} }
@@ -55,24 +55,24 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() {
val result = buildString { val result = buildString {
appendln("-- Common --") appendln("-- Common --")
appendln(K2MetadataCompiler().compile(listOf(commonSrc), "-d", commonDest, *optionalStdlibCommon)) appendln(K2MetadataCompiler().compile(commonSrc, null, "-d", commonDest, *optionalStdlibCommon))
if (jvmSrc != null) { if (jvmSrc != null) {
appendln() appendln()
appendln("-- JVM --") appendln("-- JVM --")
appendln(K2JVMCompiler().compileBothWays(commonSrc, jvmSrc, "-d", jvmDest!!)) appendln(K2JVMCompiler().compile(jvmSrc, commonSrc, "-d", jvmDest!!))
} }
if (jsSrc != null) { if (jsSrc != null) {
appendln() appendln()
appendln("-- JS --") appendln("-- JS --")
appendln(K2JSCompiler().compileBothWays(commonSrc, jsSrc, "-output", jsDest!!)) appendln(K2JSCompiler().compile(jsSrc, commonSrc, "-output", jsDest!!))
} }
if (common2Src != null) { if (common2Src != null) {
appendln() appendln()
appendln("-- Common (2) --") 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) { if (jvm2Src != null) {
@@ -80,7 +80,7 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() {
appendln("-- JVM (2) --") appendln("-- JVM (2) --")
appendln( appendln(
K2JVMCompiler().compile( K2JVMCompiler().compile(
listOf(jvm2Src), "-d", jvm2Dest!!, jvm2Src, common2Src, "-d", jvm2Dest!!,
"-cp", listOfNotNull(commonDest, common2Dest, jvmDest).joinToString(File.pathSeparator) "-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") }?.toFile() ?: error("kotlin-stdlib-common is not found in $stdlibCommonLibsDir")
} }
private fun CLICompiler<*>.compileBothWays(commonSource: File, platformSource: File, vararg mainArguments: String): String { private fun CLICompiler<*>.compile(sources: File, commonSources: File?, vararg mainArguments: String): String = buildString {
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<File>, vararg mainArguments: String): String = buildString {
val (output, exitCode) = AbstractCliTest.executeCompilerGrabOutput( val (output, exitCode) = AbstractCliTest.executeCompilerGrabOutput(
this@compile, 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("Exit code: $exitCode")
appendln("Output:") appendln("Output:")
@@ -27,6 +27,8 @@ interface Module {
fun getSourceFiles(): List<String> fun getSourceFiles(): List<String>
fun getCommonSourceFiles(): List<String>
fun getClasspathRoots(): List<String> fun getClasspathRoots(): List<String>
fun getJavaSourceRoots(): List<JavaRootPath> fun getJavaSourceRoots(): List<JavaRootPath>
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.jps.build package org.jetbrains.kotlin.jps.build
import com.intellij.testFramework.UsefulTestCase import com.intellij.testFramework.UsefulTestCase
import com.intellij.util.containers.HashMap
import com.intellij.util.containers.StringInterner import com.intellij.util.containers.StringInterner
import org.jetbrains.kotlin.TestWithWorkingDir import org.jetbrains.kotlin.TestWithWorkingDir
import org.jetbrains.kotlin.build.JvmSourceRoot import org.jetbrains.kotlin.build.JvmSourceRoot
@@ -78,13 +77,14 @@ abstract class AbstractJvmLookupTrackerTest : AbstractLookupTrackerTest() {
override fun runCompiler(filesToCompile: Iterable<File>, env: JpsCompilerEnvironment): Any? { override fun runCompiler(filesToCompile: Iterable<File>, env: JpsCompilerEnvironment): Any? {
val moduleFile = makeModuleFile( val moduleFile = makeModuleFile(
name = "test", name = "test",
isTest = true, isTest = true,
outputDir = outDir, outputDir = outDir,
sourcesToCompile = filesToCompile.toList(), sourcesToCompile = filesToCompile.toList(),
javaSourceRoots = listOf(JvmSourceRoot(srcDir, null)), commonSources = emptyList(),
classpath = listOf(outDir, ForTestCompileRuntime.runtimeJarForTests()).filter { it.exists() }, javaSourceRoots = listOf(JvmSourceRoot(srcDir, null)),
friendDirs = emptyList() classpath = listOf(outDir, ForTestCompileRuntime.runtimeJarForTests()).filter { it.exists() },
friendDirs = emptyList()
) )
val args = K2JVMCompilerArguments().apply { val args = K2JVMCompilerArguments().apply {
@@ -41,16 +41,17 @@ class ClasspathOrderTest : TestCaseWithTmpdir() {
fun testClasspathOrderForModuleScriptBuild() { fun testClasspathOrderForModuleScriptBuild() {
val xmlContent = KotlinModuleXmlBuilder().addModule( val xmlContent = KotlinModuleXmlBuilder().addModule(
"name", "name",
File(tmpdir, "output").absolutePath, File(tmpdir, "output").absolutePath,
listOf(sourceDir), listOf(sourceDir),
listOf(JvmSourceRoot(sourceDir)), listOf(JvmSourceRoot(sourceDir)),
listOf(PathUtil.kotlinPathsForDistDirectory.stdlibPath), listOf(PathUtil.kotlinPathsForDistDirectory.stdlibPath),
null, emptyList(),
JavaModuleBuildTargetType.PRODUCTION.typeId, null,
JavaModuleBuildTargetType.PRODUCTION.isTests, JavaModuleBuildTargetType.PRODUCTION.typeId,
setOf(), JavaModuleBuildTargetType.PRODUCTION.isTests,
emptyList() setOf(),
emptyList()
).asText().toString() ).asText().toString()
val xml = File(tmpdir, "module.xml") val xml = File(tmpdir, "module.xml")
@@ -33,6 +33,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
Arrays.asList(new File("s1"), new File("s2")), Arrays.asList(new File("s1"), new File("s2")),
Collections.singletonList(new JvmSourceRoot(new File("java"), null)), Collections.singletonList(new JvmSourceRoot(new File("java"), null)),
Arrays.asList(new File("cp1"), new File("cp2")), Arrays.asList(new File("cp1"), new File("cp2")),
Collections.emptyList(),
null, null,
JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.getTypeId(),
JavaModuleBuildTargetType.PRODUCTION.isTests(), JavaModuleBuildTargetType.PRODUCTION.isTests(),
@@ -49,6 +50,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
Arrays.asList(new File("s1"), new File("s2")), Arrays.asList(new File("s1"), new File("s2")),
Collections.emptyList(), Collections.emptyList(),
Arrays.asList(new File("cp1"), new File("cp2")), Arrays.asList(new File("cp1"), new File("cp2")),
Collections.emptyList(),
null, null,
JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.getTypeId(),
JavaModuleBuildTargetType.PRODUCTION.isTests(), JavaModuleBuildTargetType.PRODUCTION.isTests(),
@@ -66,6 +68,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
Arrays.asList(new File("s1"), new File("s2")), Arrays.asList(new File("s1"), new File("s2")),
Collections.emptyList(), Collections.emptyList(),
Arrays.asList(new File("cp1"), new File("cp2")), Arrays.asList(new File("cp1"), new File("cp2")),
Collections.emptyList(),
null, null,
JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.getTypeId(),
JavaModuleBuildTargetType.PRODUCTION.isTests(), JavaModuleBuildTargetType.PRODUCTION.isTests(),
@@ -78,6 +81,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
Arrays.asList(new File("s12"), new File("s22")), Arrays.asList(new File("s12"), new File("s22")),
Collections.emptyList(), Collections.emptyList(),
Arrays.asList(new File("cp12"), new File("cp22")), Arrays.asList(new File("cp12"), new File("cp22")),
Collections.emptyList(),
null, null,
JavaModuleBuildTargetType.TEST.getTypeId(), JavaModuleBuildTargetType.TEST.getTypeId(),
JavaModuleBuildTargetType.TEST.isTests(), JavaModuleBuildTargetType.TEST.isTests(),
@@ -95,6 +99,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
Collections.emptyList(), Collections.emptyList(),
Collections.emptyList(), Collections.emptyList(),
Collections.emptyList(), Collections.emptyList(),
Collections.emptyList(),
new File("/path/to/modular/jdk"), new File("/path/to/modular/jdk"),
JavaModuleBuildTargetType.PRODUCTION.getTypeId(), JavaModuleBuildTargetType.PRODUCTION.getTypeId(),
JavaModuleBuildTargetType.PRODUCTION.isTests(), JavaModuleBuildTargetType.PRODUCTION.isTests(),
@@ -150,6 +150,7 @@ class KotlinJvmModuleBuildTarget(compileContext: CompileContext, jpsModuleBuildT
val friendDirs = target.friendOutputDirs val friendDirs = target.friendOutputDirs
val moduleSources = collectSourcesToCompile(target, dirtyFilesHolder) val moduleSources = collectSourcesToCompile(target, dirtyFilesHolder)
val commonSources = emptyList<File>() // TODO: pass common sources here
val hasDirtyOrRemovedSources = checkShouldCompileAndLog(target, dirtyFilesHolder, moduleSources) val hasDirtyOrRemovedSources = checkShouldCompileAndLog(target, dirtyFilesHolder, moduleSources)
if (hasDirtyOrRemovedSources) hasDirtySources = true if (hasDirtyOrRemovedSources) hasDirtySources = true
@@ -160,6 +161,7 @@ class KotlinJvmModuleBuildTarget(compileContext: CompileContext, jpsModuleBuildT
moduleSources, moduleSources,
target.findSourceRoots(context), target.findSourceRoots(context),
target.findClassPathRoots(), target.findClassPathRoots(),
commonSources,
target.findModularJdkRoot(), target.findModularJdkRoot(),
kotlinModuleId.type, kotlinModuleId.type,
isTests, isTests,
@@ -17,6 +17,9 @@
package org.jetbrains.kotlin.compilerRunner package org.jetbrains.kotlin.compilerRunner
import org.gradle.api.Project 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.build.JvmSourceRoot
import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments 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.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer 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.config.Services
import org.jetbrains.kotlin.daemon.client.CompileServiceSession import org.jetbrains.kotlin.daemon.client.CompileServiceSession
import org.jetbrains.kotlin.daemon.common.* 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
import org.jetbrains.kotlin.gradle.incremental.GRADLE_CACHE_VERSION_FILE_NAME 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.plugin.kotlinDebug
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.InspectClassesForMultiModuleIC import org.jetbrains.kotlin.gradle.tasks.InspectClassesForMultiModuleIC
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.utils.newTmpFile import org.jetbrains.kotlin.gradle.utils.newTmpFile
import org.jetbrains.kotlin.gradle.utils.relativeToRoot
import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.*
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
@@ -95,19 +93,22 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil
fun runJvmCompiler( fun runJvmCompiler(
sourcesToCompile: List<File>, sourcesToCompile: List<File>,
commonSources: List<File>,
javaSourceRoots: Iterable<File>, javaSourceRoots: Iterable<File>,
javaPackagePrefix: String?, javaPackagePrefix: String?,
args: K2JVMCompilerArguments, args: K2JVMCompilerArguments,
environment: GradleCompilerEnvironment environment: GradleCompilerEnvironment
): ExitCode { ): ExitCode {
val buildFile = makeModuleFile( val buildFile = makeModuleFile(
args.moduleName!!, args.moduleName!!,
isTest = false, isTest = false,
outputDir = args.destinationAsFile, outputDir = args.destinationAsFile,
sourcesToCompile = sourcesToCompile, sourcesToCompile = sourcesToCompile,
javaSourceRoots = javaSourceRoots.map { JvmSourceRoot(it, javaPackagePrefix) }, commonSources = commonSources,
classpath = args.classpathAsList, javaSourceRoots = javaSourceRoots.map { JvmSourceRoot(it, javaPackagePrefix) },
friendDirs = args.friendPaths?.map(::File) ?: emptyList()) classpath = args.classpathAsList,
friendDirs = args.friendPaths?.map(::File).orEmpty()
)
args.buildFile = buildFile.absolutePath args.buildFile = buildFile.absolutePath
if (environment !is GradleIncrementalCompilerEnvironment || kotlinCompilerExecutionStrategy != "daemon") { if (environment !is GradleIncrementalCompilerEnvironment || kotlinCompilerExecutionStrategy != "daemon") {
@@ -125,10 +126,12 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil
fun runJsCompiler( fun runJsCompiler(
kotlinSources: List<File>, kotlinSources: List<File>,
kotlinCommonSources: List<File>,
args: K2JSCompilerArguments, args: K2JSCompilerArguments,
environment: GradleCompilerEnvironment environment: GradleCompilerEnvironment
): ExitCode { ): ExitCode {
args.freeArgs += kotlinSources.map { it.absolutePath } args.freeArgs += kotlinSources.map { it.absolutePath }
args.commonSources = kotlinCommonSources.map { it.absolutePath }.toTypedArray()
return runCompiler(K2JS_COMPILER, args, environment) return runCompiler(K2JS_COMPILER, args, environment)
} }
@@ -16,11 +16,11 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment
import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner
import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl 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.CompilerPluginOptions
import org.jetbrains.kotlin.gradle.tasks.GradleMessageCollector import org.jetbrains.kotlin.gradle.tasks.GradleMessageCollector
import org.jetbrains.kotlin.gradle.tasks.clearOutputDirectories import org.jetbrains.kotlin.gradle.tasks.clearOutputDirectories
import org.jetbrains.kotlin.gradle.tasks.throwGradleExceptionIfError import org.jetbrains.kotlin.gradle.tasks.throwGradleExceptionIfError
import org.jetbrains.kotlin.gradle.plugin.PLUGIN_CLASSPATH_CONFIGURATION_NAME
import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray
open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput<K2JVMCompilerArguments> { open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput<K2JVMCompilerArguments> {
@@ -70,6 +70,7 @@ open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput<K2JV
val compilerRunner = GradleCompilerRunner(project) val compilerRunner = GradleCompilerRunner(project)
val exitCode = compilerRunner.runJvmCompiler( val exitCode = compilerRunner.runJvmCompiler(
sourcesToCompile = emptyList(), sourcesToCompile = emptyList(),
commonSources = emptyList(),
javaSourceRoots = javaSourceRoots, javaSourceRoots = javaSourceRoots,
javaPackagePrefix = kotlinCompileTask.javaPackagePrefix, javaPackagePrefix = kotlinCompileTask.javaPackagePrefix,
args = args, args = args,
@@ -154,7 +154,9 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin
.filterIsInstance<AbstractKotlinCompile<*>>() .filterIsInstance<AbstractKotlinCompile<*>>()
.single { it.sourceSetName == commonSourceSet.name } .single { it.sourceSetName == commonSourceSet.name }
platformTask.source(getKotlinSourceDirectorySetSafe(commonSourceSet)) val commonSources = getKotlinSourceDirectorySetSafe(commonSourceSet)!!
platformTask.source(commonSources)
platformTask.commonSourceSet = commonSources
} }
} }
@@ -27,14 +27,16 @@ import org.jetbrains.kotlin.compilerRunner.*
import org.jetbrains.kotlin.daemon.common.MultiModuleICSettings import org.jetbrains.kotlin.daemon.common.MultiModuleICSettings
import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.incremental.ChangedFiles 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.CompilerArgumentAwareWithInput
import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion 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.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 org.jetbrains.kotlin.utils.LibraryUtils
import java.io.File import java.io.File
import java.util.* import java.util.*
@@ -189,6 +191,9 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments>() : AbstractKo
@get:Internal @get:Internal
internal var sourceSetName: String by Delegates.notNull() internal var sourceSetName: String by Delegates.notNull()
@get:InputFiles
internal var commonSourceSet: Iterable<File> = emptyList()
@get:Input @get:Input
internal val moduleName: String internal val moduleName: String
get() { get() {
@@ -385,11 +390,13 @@ open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), Kotl
try { try {
val exitCode = compilerRunner.runJvmCompiler( val exitCode = compilerRunner.runJvmCompiler(
sourceRoots.kotlinSourceFiles, sourceRoots.kotlinSourceFiles,
sourceRoots.javaSourceRoots, commonSourceSet.toList(),
javaPackagePrefix, sourceRoots.javaSourceRoots,
args, javaPackagePrefix,
environment) args,
environment
)
disableMultiModuleICIfNeeded() disableMultiModuleICIfNeeded()
processCompilerExitCode(exitCode) processCompilerExitCode(exitCode)
@@ -536,7 +543,7 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile<K2JSCompilerArguments>(),
} }
} }
val exitCode = compilerRunner.runJsCompiler(sourceRoots.kotlinSourceFiles, args, environment) val exitCode = compilerRunner.runJsCompiler(sourceRoots.kotlinSourceFiles, commonSourceSet.toList(), args, environment)
throwGradleExceptionIfError(exitCode) throwGradleExceptionIfError(exitCode)
} }
} }
@@ -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); configuration.put(CommonConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME);
ScriptingCompilerConfigurationExtensionKt.configureScriptDefinitions( ScriptingCompilerConfigurationExtensionKt.configureScriptDefinitions(