~ scripts
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java index b0f7c7f..dc88698 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLIConfigurationKeys.java
@@ -16,6 +16,7 @@ package org.jetbrains.kotlin.cli.common; +import kotlin.jvm.functions.Function2; import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig; import org.jetbrains.kotlin.cli.common.config.ContentRoot; import org.jetbrains.kotlin.cli.common.messages.MessageCollector; @@ -51,6 +52,9 @@ public static final CompilerConfigurationKey<Integer> REPEAT_COMPILE_MODULES = CompilerConfigurationKey.create("debug key for profiling, repeats compileModules"); + public static final CompilerConfigurationKey<Function2<File, String, Boolean>> FAST_CHECK_JAR_CONTAINS_FILE = + CompilerConfigurationKey.create("Predicate telling if a jar contains a file"); + private CLIConfigurationKeys() { } }
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 7be1516..ea84212 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
@@ -188,16 +188,6 @@ registerProjectServices(projectEnvironment.project) - for (extension in CompilerConfigurationExtension.getInstances(project)) { - extension.updateConfiguration(configuration) - } - - sourceFiles += createKtFiles(project) - - collectAdditionalSources(project) - - sourceFiles.sortBy { it.virtualFile.path } - val jdkHome = configuration.get(JVMConfigurationKeys.JDK_HOME) val jrtFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.JRT_PROTOCOL) val javaModuleFinder = CliJavaModuleFinder(jdkHome?.path?.let { path -> @@ -222,6 +212,20 @@ classpathRootsResolver.convertClasspathRoots(configuration.getList(CLIConfigurationKeys.CONTENT_ROOTS)) this.initialRoots.addAll(initialRoots) + configuration.put(CLIConfigurationKeys.FAST_CHECK_JAR_CONTAINS_FILE) { file, path -> + findJarRoot(file)?.findFileByRelativePath(path) != null + } + + for (extension in CompilerConfigurationExtension.getInstances(project)) { + extension.updateConfiguration(configuration) + } + + sourceFiles += createKtFiles(project) + + collectAdditionalSources(project) + + sourceFiles.sortBy { it.virtualFile.path } + if (!configuration.getBoolean(JVMConfigurationKeys.SKIP_RUNTIME_VERSION_CHECK) && messageCollector != null) { JvmRuntimeVersionsConsistencyChecker.checkCompilerClasspathConsistency( messageCollector,
diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt index 1013584..9a83557 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt
@@ -21,10 +21,13 @@ typealias MessageReporter = (ScriptDiagnostic.Severity, String) -> Unit +typealias FastCheckForJarEntryPresence = (jarFile: File, entry: String) -> Boolean + class ScriptDefinitionsFromClasspathDiscoverySource( private val classpath: List<File>, private val hostConfiguration: ScriptingHostConfiguration, - private val messageReporter: MessageReporter + private val messageReporter: MessageReporter, + private val fastCheckForJarEntryPresence: FastCheckForJarEntryPresence? = null, ) : ScriptDefinitionsSource { override val definitions: Sequence<ScriptDefinition> = run { @@ -32,7 +35,8 @@ classpath, this::class.java.classLoader, hostConfiguration, - messageReporter + messageReporter, + fastCheckForJarEntryPresence, ) } } @@ -52,25 +56,27 @@ } } val classpathWithLoader = SimpleClasspathWithClassLoader(classpath.toList(), classLoader) - return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter) + return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter, fastCheckForJarEntryPresence = null) } fun discoverScriptTemplatesInClasspath( classpath: List<File>, baseClassLoader: ClassLoader?, hostConfiguration: ScriptingHostConfiguration, - messageReporter: MessageReporter + messageReporter: MessageReporter, + fastCheckForJarEntryPresence: FastCheckForJarEntryPresence? = null, ): Sequence<ScriptDefinition> { // TODO: try to find a way to reduce classpath (and classloader) to minimal one needed to load script definition and its dependencies val classpathWithLoader = LazyClasspathWithClassLoader(baseClassLoader) { classpath } - return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter) + return scriptTemplatesDiscoverySequence(classpathWithLoader, hostConfiguration, messageReporter, fastCheckForJarEntryPresence) } private fun scriptTemplatesDiscoverySequence( classpathWithLoader: ClasspathWithClassLoader, hostConfiguration: ScriptingHostConfiguration, - messageReporter: MessageReporter + messageReporter: MessageReporter, + fastCheckForJarEntryPresence: FastCheckForJarEntryPresence? ): Sequence<ScriptDefinition> { return sequence<ScriptDefinition> { // for jar files the definition class is expected in the same jar as the discovery file @@ -80,7 +86,10 @@ for (dep in classpathWithLoader.classpath) { try { when { - dep.isFile && dep.extension == "jar" -> { // checking for extension is the compiler current behaviour, so the same logic is implemented here + dep.isFile && dep.extension == "jar" && + fastCheckForJarEntryPresence?.invoke(dep, SCRIPT_DEFINITION_MARKERS_PATH) != false + -> { + // checking for extension is the compiler current behaviour, so the same logic is implemented here JarFile(dep).use { jar -> if (jar.getJarEntry(SCRIPT_DEFINITION_MARKERS_PATH) != null) { val definitionNames = jar.entries().asSequence().mapNotNull {
diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt index 328db81..d1af3fa 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt
@@ -73,7 +73,8 @@ ScriptDefinitionsFromClasspathDiscoverySource( configuration.jvmClasspathRoots, hostConfiguration, - messageCollector.reporter + messageCollector.reporter, + fastCheckForJarEntryPresence = configuration.get(CLIConfigurationKeys.FAST_CHECK_JAR_CONTAINS_FILE), ), AutoloadedScriptDefinitions(hostConfiguration, this::class.java.classLoader, messageCollector.reporter) )