From b5ac35dec1063d3b757be1a05936a10ebe7938e3 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 10 Jan 2020 12:43:52 +0100 Subject: [PATCH] Implement automatic loading of .main.kts scripts support also fix discovery from ScriptDefinitionsProvider --- .../org/jetbrains/kotlin/utils/KotlinPaths.kt | 4 ++- .../org/jetbrains/kotlin/utils/PathUtil.kt | 1 + idea/resources/META-INF/extensions/ide.xml | 3 ++ .../script/BridgeDefinitionsContributor.kt | 13 ++++---- .../script/MainKtsScriptDefinitionSource.kt | 31 +++++++++++++++++++ 5 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/script/MainKtsScriptDefinitionSource.kt diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinPaths.kt b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinPaths.kt index 88e7bce068f..5e684450ffd 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinPaths.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinPaths.kt @@ -100,13 +100,15 @@ interface KotlinPaths { CoroutinesCore(PathUtil.KOTLINX_COROUTINES_CORE_NAME), KotlinDaemon(PathUtil.KOTLIN_DAEMON_NAME), Ktor(PathUtil.KTOR_NAME), + MainKts(PathUtil.MAIN_KTS_NAME) } // TODO: Maybe we need separate classpaths for compilers with and without the daemon enum class ClassPaths(val contents: List = emptyList()) { Empty(), Compiler(Jar.Compiler, Jar.StdLib, Jar.Reflect, Jar.ScriptRuntime, Jar.Trove4j, Jar.KotlinDaemon, Jar.Ktor), - CompilerWithScripting(Compiler, Jar.ScriptingPlugin, Jar.ScriptingImpl, Jar.ScriptingLib, Jar.ScriptingJvmLib) + CompilerWithScripting(Compiler, Jar.ScriptingPlugin, Jar.ScriptingImpl, Jar.ScriptingLib, Jar.ScriptingJvmLib), + MainKts(Jar.MainKts, Jar.ScriptRuntime, Jar.StdLib, Jar.Reflect) ; constructor(vararg jars: Jar) : this(jars.asList()) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt b/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt index 0431730a054..30eab6d8536 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.kt @@ -79,6 +79,7 @@ object PathUtil { const val KOTLIN_SCRIPTING_COMPILER_IMPL_JAR = "$KOTLIN_SCRIPTING_COMPILER_IMPL_NAME.jar" const val JS_ENGINES_NAME = "js.engines" const val JS_ENGINES_JAR = "$JS_ENGINES_NAME.jar" + const val MAIN_KTS_NAME = "kotlin-main-kts" val KOTLIN_SCRIPTING_PLUGIN_CLASSPATH_JARS = arrayOf( KOTLIN_SCRIPTING_COMPILER_PLUGIN_JAR, KOTLIN_SCRIPTING_COMPILER_IMPL_JAR, diff --git a/idea/resources/META-INF/extensions/ide.xml b/idea/resources/META-INF/extensions/ide.xml index 5d3ccf573a9..3a3de8c1162 100644 --- a/idea/resources/META-INF/extensions/ide.xml +++ b/idea/resources/META-INF/extensions/ide.xml @@ -92,6 +92,9 @@ + + diff --git a/idea/src/org/jetbrains/kotlin/idea/script/BridgeDefinitionsContributor.kt b/idea/src/org/jetbrains/kotlin/idea/script/BridgeDefinitionsContributor.kt index 9a2c1fd37cd..0d01a73b80a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/script/BridgeDefinitionsContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/script/BridgeDefinitionsContributor.kt @@ -30,12 +30,13 @@ class BridgeScriptDefinitionsContributor(private val project: Project) : ScriptD if (explicitClasses.isEmpty()) emptySequence() else loadDefinitionsFromTemplates(explicitClasses, classPath, hostConfiguration).asSequence() val discoveredDefinitions = - if (provider.useDiscovery()) emptySequence() - else ScriptDefinitionsFromClasspathDiscoverySource( - classPath, - hostConfiguration, - ::loggingReporter - ).definitions + if (provider.useDiscovery()) + ScriptDefinitionsFromClasspathDiscoverySource( + classPath, + hostConfiguration, + ::loggingReporter + ).definitions + else emptySequence() explicitDefinitions + discoveredDefinitions } } diff --git a/idea/src/org/jetbrains/kotlin/idea/script/MainKtsScriptDefinitionSource.kt b/idea/src/org/jetbrains/kotlin/idea/script/MainKtsScriptDefinitionSource.kt new file mode 100644 index 00000000000..dee3e8073a7 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/script/MainKtsScriptDefinitionSource.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.idea.script + +import com.intellij.openapi.diagnostic.Logger +import org.jetbrains.kotlin.utils.KotlinPaths +import org.jetbrains.kotlin.utils.PathUtil +import java.io.File +import kotlin.script.experimental.intellij.ScriptDefinitionsProvider + +class MainKtsScriptDefinitionSource : ScriptDefinitionsProvider { + override val id: String = ".main.kts script" + + override fun getDefinitionClasses(): Iterable = emptyList() + + override fun getDefinitionsClassPath(): Iterable { + + val paths = PathUtil.kotlinPathsForIdeaPlugin + return if (paths.jar(KotlinPaths.Jar.MainKts).exists()) { + paths.classPath(KotlinPaths.ClassPaths.MainKts) + } else { + Logger.getInstance(MainKtsScriptDefinitionSource::class.java).warn("[kts] Support for .main.kts scripts is not loaded: kotlin-main-kts.jar not found") + emptyList() + } + } + + override fun useDiscovery(): Boolean = true +} \ No newline at end of file