diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java index 4a0c58824f8..04926cb3d11 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,8 +19,8 @@ package org.jetbrains.kotlin.cli.js; import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ExceptionUtil; import com.intellij.util.SmartList; @@ -46,6 +46,8 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser; import org.jetbrains.kotlin.config.*; import org.jetbrains.kotlin.incremental.components.LookupTracker; +import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider; +import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer; import org.jetbrains.kotlin.incremental.js.TranslationResultValue; import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS; import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult; @@ -56,11 +58,9 @@ import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding; import org.jetbrains.kotlin.js.facade.K2JSTranslator; import org.jetbrains.kotlin.js.facade.MainCallParameters; import org.jetbrains.kotlin.js.facade.TranslationResult; -import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver; import org.jetbrains.kotlin.js.facade.TranslationUnit; import org.jetbrains.kotlin.js.facade.exceptions.TranslationException; -import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider; -import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer; +import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.serialization.js.ModuleKind; @@ -71,7 +71,6 @@ import org.jetbrains.kotlin.utils.StringsKt; import java.io.File; import java.io.IOException; -import java.util.Arrays; import java.util.*; import java.util.stream.Collectors; diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt index 311bfacc133..684782c5f82 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,20 +24,23 @@ import org.jetbrains.kotlin.cli.common.CLITool import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.ExitCode.* import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments -import org.jetbrains.kotlin.cli.common.messages.* import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* +import org.jetbrains.kotlin.cli.common.messages.FilteringMessageCollector +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.cli.common.messages.MessageUtil +import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil import org.jetbrains.kotlin.cli.jvm.compiler.CompileEnvironmentUtil import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler -import org.jetbrains.kotlin.cli.jvm.config.* +import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot +import org.jetbrains.kotlin.cli.jvm.config.JvmModulePathRoot +import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot +import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.modules.CoreJrtFileSystem import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser import org.jetbrains.kotlin.cli.jvm.repl.ReplFromTerminal import org.jetbrains.kotlin.codegen.CompilationException -import org.jetbrains.kotlin.compiler.plugin.CliOptionProcessingException -import org.jetbrains.kotlin.compiler.plugin.PluginCliOptionProcessingException -import org.jetbrains.kotlin.compiler.plugin.cliPluginUsageString import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.javac.JavacWrapper @@ -65,7 +68,8 @@ class K2JVMCompiler : CLICompiler() { PerformanceCounter.setTimeCounterEnabled(arguments.reportPerf) val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) - setupJdkClasspathRoots(arguments, configuration, messageCollector).let { + + configureJdkHome(arguments, configuration, messageCollector).let { if (it != OK) return it } @@ -398,42 +402,28 @@ class K2JVMCompiler : CLICompiler() { } } - private fun setupJdkClasspathRoots(arguments: K2JVMCompilerArguments, configuration: CompilerConfiguration, messageCollector: MessageCollector): ExitCode { - try { - if (arguments.noJdk) { - if (arguments.jdkHome != null) { - messageCollector.report(STRONG_WARNING, "The '-jdk-home' option is ignored because '-no-jdk' is specified") - } - return OK + private fun configureJdkHome(arguments: K2JVMCompilerArguments, configuration: CompilerConfiguration, messageCollector: MessageCollector): ExitCode { + if (arguments.noJdk) { + configuration.put(JVMConfigurationKeys.NO_JDK, true) + + if (arguments.jdkHome != null) { + messageCollector.report(STRONG_WARNING, "The '-jdk-home' option is ignored because '-no-jdk' is specified") + } + return OK + } + + if (arguments.jdkHome != null) { + val jdkHome = File(arguments.jdkHome) + if (!jdkHome.exists()) { + messageCollector.report(ERROR, "JDK home directory does not exist: $jdkHome") + return COMPILATION_ERROR } - val (jdkHome, classesRoots) = if (arguments.jdkHome != null) { - val jdkHome = File(arguments.jdkHome) - if (!jdkHome.exists()) { - messageCollector.report(ERROR, "JDK home directory does not exist: $jdkHome") - return COMPILATION_ERROR - } - messageCollector.report(LOGGING, "Using JDK home directory $jdkHome") - jdkHome to PathUtil.getJdkClassesRoots(jdkHome) - } - else { - File(System.getProperty("java.home")) to PathUtil.getJdkClassesRootsFromCurrentJre() - } + messageCollector.report(LOGGING, "Using JDK home directory $jdkHome") configuration.put(JVMConfigurationKeys.JDK_HOME, jdkHome) + } - if (!CoreJrtFileSystem.isModularJdk(jdkHome)) { - configuration.addJvmClasspathRoots(classesRoots) - if (classesRoots.isEmpty()) { - messageCollector.report(ERROR, "No class roots are found in the JDK path: $jdkHome") - return COMPILATION_ERROR - } - } - } - catch (t: Throwable) { - MessageCollectorUtil.reportException(messageCollector, t) - return INTERNAL_ERROR - } return OK } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/EnvironmentConfigFiles.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/EnvironmentConfigFiles.java index 137a5705d39..0f995a59f1b 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/EnvironmentConfigFiles.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/EnvironmentConfigFiles.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ public enum EnvironmentConfigFiles { JVM_CONFIG_FILES("extensions/common.xml", "extensions/kotlin2jvm.xml"), JS_CONFIG_FILES("extensions/common.xml", "extensions/kotlin2js.xml"), NATIVE_CONFIG_FILES("extensions/common.xml"), + METADATA_CONFIG_FILES("extensions/common.xml"), EMPTY(); private final List files; diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 0d08b2263f5..c4b5f37c8b1 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -113,7 +113,7 @@ import java.io.File class KotlinCoreEnvironment private constructor( parentDisposable: Disposable, applicationEnvironment: JavaCoreApplicationEnvironment, - configuration: CompilerConfiguration, + initialConfiguration: CompilerConfiguration, configFiles: EnvironmentConfigFiles ) { private val projectEnvironment: JavaCoreProjectEnvironment = object : KotlinCoreProjectEnvironment(parentDisposable, applicationEnvironment) { @@ -151,7 +151,7 @@ class KotlinCoreEnvironment private constructor( private val classpathRootsResolver: ClasspathRootsResolver private val initialRoots: List - val configuration: CompilerConfiguration = configuration.copy() + val configuration: CompilerConfiguration = initialConfiguration.apply { setupJdkClasspathRoots(configFiles) }.copy() init { PersistentFSConstants.setMaxIntellisenseFileSize(FileUtilRt.LARGE_FOR_CONTENT_LOADING) @@ -176,6 +176,7 @@ class KotlinCoreEnvironment private constructor( project.registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(configFiles == EnvironmentConfigFiles.JVM_CONFIG_FILES)) registerProjectServicesForCLI(projectEnvironment) + val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) registerProjectServices(projectEnvironment, messageCollector) @@ -546,5 +547,32 @@ class KotlinCoreEnvironment private constructor( */ } + + private fun CompilerConfiguration.setupJdkClasspathRoots(configFiles: EnvironmentConfigFiles) { + if (getBoolean(JVMConfigurationKeys.NO_JDK)) return + + val jvmTarget = configFiles == EnvironmentConfigFiles.JVM_CONFIG_FILES + if (!jvmTarget) return + + val jdkHome = get(JVMConfigurationKeys.JDK_HOME) + val (javaRoot, classesRoots) = if (jdkHome == null) { + val javaHome = File(System.getProperty("java.home")) + put(JVMConfigurationKeys.JDK_HOME, javaHome) + + javaHome to PathUtil.getJdkClassesRootsFromCurrentJre() + } + else { + jdkHome to PathUtil.getJdkClassesRoots(jdkHome) + } + + if (!CoreJrtFileSystem.isModularJdk(javaRoot)) { + addJvmClasspathRoots(classesRoots) + if (classesRoots.isEmpty()) { + val messageCollector = get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + messageCollector?.report(ERROR, "No class roots are found in the JDK path: $javaRoot") + } + } + } + } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt index 38838c261bd..54db1c42c20 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,7 +71,7 @@ class K2MetadataCompiler : CLICompiler() { configuration.put(CLIConfigurationKeys.METADATA_DESTINATION_DIRECTORY, File(destination)) } - val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) + val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.METADATA_CONFIG_FILES) if (environment.getSourceFiles().isEmpty()) { if (arguments.version) { diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt index 00e6bda7f99..ff82866b3c4 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt @@ -50,7 +50,6 @@ open class KotlinJvmReplService( ) : ReplCompileAction, ReplCheckAction, CreateReplStageStateAction { protected val configuration = CompilerConfiguration().apply { - addJvmClasspathRoots(PathUtil.getJdkClassesRootsFromCurrentJre()) addJvmClasspathRoots(PathUtil.kotlinPathsForCompiler.let { listOf(it.stdlibPath, it.reflectPath, it.scriptRuntimePath) }) addJvmClasspathRoots(templateClasspath) put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script") diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java index 9ed993297e8..614762c1e42 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,6 +42,9 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey JDK_HOME = CompilerConfigurationKey.create("jdk home"); + public static final CompilerConfigurationKey NO_JDK = + CompilerConfigurationKey.create("no jdk"); + public static final CompilerConfigurationKey> SCRIPT_DEFINITIONS = CompilerConfigurationKey.create("script definitions"); diff --git a/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java b/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java index 05a3c78c064..f5adc89da02 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java +++ b/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -488,17 +488,20 @@ public class KotlinTestUtils { JvmContentRootsKt.addJavaSourceRoots(configuration, javaSource); if (jdkKind == TestJdkKind.MOCK_JDK) { JvmContentRootsKt.addJvmClasspathRoot(configuration, findMockJdkRtJar()); + configuration.put(JVMConfigurationKeys.NO_JDK, true); } else if (jdkKind == TestJdkKind.MODIFIED_MOCK_JDK) { JvmContentRootsKt.addJvmClasspathRoot(configuration, findMockJdkRtModified()); + configuration.put(JVMConfigurationKeys.NO_JDK, true); } else if (jdkKind == TestJdkKind.ANDROID_API) { JvmContentRootsKt.addJvmClasspathRoot(configuration, findAndroidApiJar()); + configuration.put(JVMConfigurationKeys.NO_JDK, true); } else if (jdkKind == TestJdkKind.FULL_JDK_6) { String jdk6 = System.getenv("JDK_16"); assert jdk6 != null : "Environment variable JDK_16 is not set"; - JvmContentRootsKt.addJvmClasspathRoots(configuration, PathUtil.getJdkClassesRootsFromJre(getJreHome(jdk6))); + configuration.put(JVMConfigurationKeys.JDK_HOME, new File(jdk6)); } else if (jdkKind == TestJdkKind.FULL_JDK_9) { File home = getJdk9HomeIfPossible(); @@ -509,9 +512,6 @@ public class KotlinTestUtils { else if (SystemInfo.IS_AT_LEAST_JAVA9) { configuration.put(JVMConfigurationKeys.JDK_HOME, new File(System.getProperty("java.home"))); } - else { - JvmContentRootsKt.addJvmClasspathRoots(configuration, PathUtil.getJdkClassesRootsFromCurrentJre()); - } if (configurationKind.getWithRuntime()) { JvmContentRootsKt.addJvmClasspathRoot(configuration, ForTestCompileRuntime.runtimeJarForTests()); diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt b/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt index a19987e5b4c..10e06529fdb 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java index bfd3737f7e5..f8d9cde5862 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/ExecuteKotlinScriptMojo.java @@ -169,7 +169,6 @@ public class ExecuteKotlinScriptMojo extends AbstractMojo { List deps = new ArrayList<>(); - deps.addAll(PathUtil.getJdkClassesRootsFromCurrentJre()); deps.addAll(getDependenciesForScript()); for (File item: deps) { diff --git a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt index e00a0b03557..8c79fc945ec 100644 --- a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt +++ b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt @@ -132,7 +132,6 @@ done val rootDisposable = Disposer.newDisposable() try { val configuration = CompilerConfiguration().apply { - addJvmClasspathRoots(PathUtil.getJdkClassesRootsFromCurrentJre()) contextClasspath(KOTLIN_JAVA_RUNTIME_JAR, Thread.currentThread().contextClassLoader)?.let { addJvmClasspathRoots(it) }