Scripting: avoid definitions discovery when compiling regular kotlin
If only regular kotlin .kt (and .java) files are compiled, do not register file extensions that may come from discovered script definitions. Since the discovery is lazy by itself, this should skip jars processing for regular compilation scenarios without scripts. #KT-47816 fixed
This commit is contained in:
+13
-7
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.scripting.compiler.plugin.impl.reporter
|
||||
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
|
||||
import org.jetbrains.kotlin.scripting.definitions.*
|
||||
import java.io.File
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
||||
|
||||
class ScriptingCompilerConfigurationExtension(
|
||||
@@ -88,15 +89,20 @@ class ScriptingCompilerConfigurationExtension(
|
||||
if (scriptDefinitionProvider != null) {
|
||||
scriptDefinitionProvider.setScriptDefinitionsSources(configuration.getList(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS_SOURCES))
|
||||
scriptDefinitionProvider.setScriptDefinitions(configuration.getList(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Register new file extensions
|
||||
val fileTypeRegistry = FileTypeRegistry.getInstance() as CoreFileTypeRegistry
|
||||
override fun updateFileRegistry() {
|
||||
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) as? CliScriptDefinitionProvider
|
||||
if (scriptDefinitionProvider != null) {
|
||||
// Register new file extensions
|
||||
val fileTypeRegistry = FileTypeRegistry.getInstance() as CoreFileTypeRegistry
|
||||
|
||||
scriptDefinitionProvider.getKnownFilenameExtensions().filter {
|
||||
fileTypeRegistry.getFileTypeByExtension(it) != KotlinFileType.INSTANCE
|
||||
}.forEach {
|
||||
fileTypeRegistry.registerFileType(KotlinFileType.INSTANCE, it)
|
||||
}
|
||||
scriptDefinitionProvider.getKnownFilenameExtensions().filter {
|
||||
fileTypeRegistry.getFileTypeByExtension(it) != KotlinFileType.INSTANCE
|
||||
}.forEach {
|
||||
fileTypeRegistry.registerFileType(KotlinFileType.INSTANCE, it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
|
||||
fun main() {
|
||||
println("OK")
|
||||
}
|
||||
+27
@@ -240,6 +240,33 @@ class ScriptingWithCliCompilerTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testScriptMainKtsDiscovery() {
|
||||
withTempDir { tmpdir ->
|
||||
|
||||
fun compileSuccessfullyGetStdErr(fileArg: String): List<String> {
|
||||
val (_, err, ret) = captureOutErrRet {
|
||||
CLITool.doMainNoExit(
|
||||
K2JVMCompiler(),
|
||||
arrayOf(
|
||||
"-P", "plugin:kotlin.scripting:disable-script-definitions-autoloading=true",
|
||||
"-cp", getMainKtsClassPath().joinToString(File.pathSeparator), "-d", tmpdir.path, "-verbose", fileArg)
|
||||
)
|
||||
}
|
||||
Assert.assertEquals(0, ret.code)
|
||||
return err.linesSplitTrim()
|
||||
}
|
||||
|
||||
val loadMainKtsMessage = "logging: configure scripting: loading script definition class org.jetbrains.kotlin.mainKts.MainKtsScript using classpath"
|
||||
|
||||
val res1 = compileSuccessfullyGetStdErr("$TEST_DATA_DIR/compiler/mixedCompilation/nonScript.kt")
|
||||
Assert.assertTrue(res1.none { it.startsWith(loadMainKtsMessage) })
|
||||
|
||||
val res2 = compileSuccessfullyGetStdErr("$TEST_DATA_DIR/compiler/mixedCompilation/simpleScript.main.kts")
|
||||
Assert.assertTrue(res2.any { it.startsWith(loadMainKtsMessage) })
|
||||
}
|
||||
}
|
||||
|
||||
private fun getMainKtsClassPath(): List<File> {
|
||||
return listOf(
|
||||
File("dist/kotlinc/lib/kotlin-main-kts.jar").also {
|
||||
|
||||
Reference in New Issue
Block a user