Introduce -Xcommon-sources and pass it correctly from build tool plugins
#KT-25196 In Progress
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
+8
@@ -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)
|
||||||
|
|||||||
+9
-3
@@ -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
|
||||||
|
|||||||
+5
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-15
@@ -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"))
|
||||||
+10
-7
@@ -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
@@ -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
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-25
@@ -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>
|
||||||
|
|||||||
+8
-8
@@ -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")
|
||||||
|
|||||||
+5
@@ -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,
|
||||||
|
|||||||
+16
-13
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -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,
|
||||||
|
|||||||
+3
-1
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+16
-9
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user