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:
Ilya Chernikov
2022-06-10 14:27:00 +02:00
committed by teamcity
parent 5caf2a2aca
commit c2316ca305
11 changed files with 102 additions and 17 deletions
@@ -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)
}
}
}
@@ -0,0 +1,4 @@
fun main() {
println("OK")
}
@@ -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 {