diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt index a1a734e2eae..bc2bdf7dc2b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt @@ -23,7 +23,7 @@ import com.intellij.openapi.project.Project import java.io.File import java.net.URLClassLoader -interface ScriptTemplateProvider { +interface ScriptTemplatesProvider { // for resolving ambiguities val id: String @@ -31,7 +31,7 @@ interface ScriptTemplateProvider { val isValid: Boolean - val templateClassName: String + val templateClassNames: Iterable val resolver: ScriptDependenciesResolver? get() = null @@ -42,33 +42,35 @@ interface ScriptTemplateProvider { val environment: Map? companion object { - val EP_NAME = ExtensionPointName.create("org.jetbrains.kotlin.scriptTemplateProvider") + val EP_NAME = ExtensionPointName.create("org.jetbrains.kotlin.scriptTemplateProvider") } } fun makeScriptDefsFromTemplateProviderExtensions(project: Project, - errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = { ep, ex -> throw ex } + errorsHandler: ((ScriptTemplatesProvider, Exception) -> Unit) = { ep, ex -> throw ex } ): List = - makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplateProvider.EP_NAME).extensions.asIterable(), + makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplatesProvider.EP_NAME).extensions.asIterable(), errorsHandler) -fun makeScriptDefsFromTemplateProviders(providers: Iterable, - errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = { ep, ex -> throw ex } +fun makeScriptDefsFromTemplateProviders(providers: Iterable, + errorsHandler: ((ScriptTemplatesProvider, Exception) -> Unit) = { ep, ex -> throw ex } ): List { val idToVersion = hashMapOf() - return providers.filter { it.isValid }.sortedByDescending { it.version }.mapNotNull { provider -> + return providers.filter { it.isValid }.sortedByDescending { it.version }.flatMap { provider -> try { idToVersion.get(provider.id)?.let { ver -> errorsHandler(provider, RuntimeException("Conflicting scriptTemplateProvider ${provider.id}, using one with version $ver")) } Logger.getInstance("makeScriptDefsFromTemplateProviders") - .info("[kts] loading script definition ${provider.templateClassName} using cp: ${provider.dependenciesClasspath.joinToString(File.pathSeparator)}") - val loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplateProvider::class.java.classLoader) - val cl = loader.loadClass(provider.templateClassName) - idToVersion.put(provider.id, provider.version) - KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.filePattern, provider.environment) + .info("[kts] loading script definitions ${provider.templateClassNames} using cp: ${provider.dependenciesClasspath.joinToString(File.pathSeparator)}") + val loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplatesProvider::class.java.classLoader) + provider.templateClassNames.map { + val cl = loader.loadClass(it) + idToVersion.put(provider.id, provider.version) + KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.filePattern, provider.environment) + } } catch (ex: Exception) { errorsHandler(provider, ex) - null + emptyList() } } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt index 2a0a9b978e6..62235d5ace4 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/gradleScriptTemplateProvider.kt @@ -23,13 +23,13 @@ import com.intellij.openapi.project.Project import org.gradle.tooling.ProjectConnection import org.jetbrains.kotlin.lexer.KotlinLexer import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.script.ScriptTemplateProvider +import org.jetbrains.kotlin.script.ScriptTemplatesProvider import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings import java.io.File import java.util.* -class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider { +class GradleScriptTemplateProvider(project: Project): ScriptTemplatesProvider { private val gradleExeSettings: GradleExecutionSettings? by lazy { try { @@ -62,7 +62,7 @@ class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider { override val version: Int = 1 override val isValid: Boolean get() = gradleExeSettings?.gradleHome != null - override val templateClassName: String = "org.gradle.script.lang.kotlin.KotlinBuildScript" + override val templateClassNames: Iterable = listOf("org.gradle.script.lang.kotlin.KotlinBuildScript") override val dependenciesClasspath: Iterable by lazy { gradleExeSettings?.gradleHome?.let { File(it, "lib") } ?.let { if (it.exists()) it else null } diff --git a/idea/src/META-INF/extensions/common.xml b/idea/src/META-INF/extensions/common.xml index c7f379c0e5a..5e610c22fb0 100644 --- a/idea/src/META-INF/extensions/common.xml +++ b/idea/src/META-INF/extensions/common.xml @@ -35,7 +35,7 @@ interface="org.jetbrains.kotlin.extensions.StorageComponentContainerContributor" area="IDEA_PROJECT"/>