diff --git a/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt b/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt index d529af00391..ddf72e44c49 100644 --- a/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt +++ b/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt @@ -42,7 +42,15 @@ interface ScriptTemplatesProvider { val filePattern: String? get() = null - val dependenciesClasspath: Iterable + val dependenciesClasspath: List + + // TODO: need to provide a way to specify this in compiler/repl .. etc + /* + * Allows to specify additional jars needed for DependenciesResolver (and not script template). + * Script template dependencies naturally become (part of) dependencies of the script which is not always desired for resolver dependencies. + * i.e. gradle resolver may depend on some jars that 'built.gradle.kts' files should not depend on. + */ + val additionalResolverClasspath: List get() = emptyList() val environment: Map? @@ -65,9 +73,10 @@ fun makeScriptDefsFromTemplatesProviders(providers: Iterable Unit) = { _, ex -> throw ex } ): List = providers.flatMap { provider -> try { - LOG.info("[kts] loading script definitions ${provider.templateClassNames} using cp: ${provider.dependenciesClasspath.joinToString(File.pathSeparator)}") + val classpath = provider.dependenciesClasspath + provider.additionalResolverClasspath + LOG.info("[kts] loading script definitions ${provider.templateClassNames} using cp: ${classpath.joinToString(File.pathSeparator)}") provider.scriptDefinitions ?: run { - val loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplatesProvider::class.java.classLoader) + val loader = URLClassLoader(classpath.map { it.toURI().toURL() }.toTypedArray(), ScriptTemplatesProvider::class.java.classLoader) provider.templateClassNames.map { KotlinScriptDefinitionFromAnnotatedTemplate(loader.loadClass(it).kotlin, provider.resolver, provider.filePattern, provider.environment) } 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 67cc8527d5f..18cb669853e 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 @@ -62,7 +62,7 @@ class GradleScriptTemplatesProvider(project: Project): ScriptTemplatesProvider { private sealed class TemplateDataOrError { class Data(val templateClassNames: Iterable, - val dependenciesClasspath: Iterable, + val dependenciesClasspath: List, val scriptDefinitions: List) : TemplateDataOrError() class Error(val message: String) : TemplateDataOrError() } @@ -83,7 +83,7 @@ class GradleScriptTemplatesProvider(project: Project): ScriptTemplatesProvider { try { val cl = loader.loadClass(template) val def = KotlinScriptDefinitionFromAnnotatedTemplate(cl.kotlin, resolver, filePattern, environment) - return@lazy TemplateDataOrError.Data(listOf(template), cp.asIterable(), listOf(def)) + return@lazy TemplateDataOrError.Data(listOf(template), cp.asList(), listOf(def)) } catch (e: ClassNotFoundException) {} catch (e: NoClassDefFoundError) {} @@ -97,8 +97,8 @@ class GradleScriptTemplatesProvider(project: Project): ScriptTemplatesProvider { is GradleScriptTemplatesProvider.TemplateDataOrError.Error -> throw IllegalStateException((templatesData as TemplateDataOrError.Error).message) } - override val dependenciesClasspath: Iterable get() = when(templatesData) { - is GradleScriptTemplatesProvider.TemplateDataOrError.Data -> (templatesData as TemplateDataOrError.Data).dependenciesClasspath.map { it.canonicalPath } + override val dependenciesClasspath: List get() = when(templatesData) { + is GradleScriptTemplatesProvider.TemplateDataOrError.Data -> (templatesData as TemplateDataOrError.Data).dependenciesClasspath is GradleScriptTemplatesProvider.TemplateDataOrError.Error -> throw IllegalStateException((templatesData as TemplateDataOrError.Error).message) } diff --git a/idea/src/org/jetbrains/kotlin/idea/script/StandardKotlinScriptTemplateProvider.kt b/idea/src/org/jetbrains/kotlin/idea/script/StandardKotlinScriptTemplateProvider.kt index 8a0150b5e2a..23e0db9fe02 100644 --- a/idea/src/org/jetbrains/kotlin/idea/script/StandardKotlinScriptTemplateProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/script/StandardKotlinScriptTemplateProvider.kt @@ -33,7 +33,7 @@ class StandardKotlinScriptTemplateProvider(val project: Project) : ScriptTemplat override val isValid: Boolean = true override val templateClassNames: Iterable get() = listOf(ScriptTemplateWithArgs::class.qualifiedName!!) - override val dependenciesClasspath: Iterable get() = emptyList() + override val dependenciesClasspath get() = emptyList() override val environment: Map? get() { return mapOf( diff --git a/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt b/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt index 4e5fb3e7544..f05d88af0f4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt +++ b/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.script import com.intellij.openapi.project.Project import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings -import org.jetbrains.kotlin.idea.core.script.topLevelSectionCodeTextTokens import org.jetbrains.kotlin.script.ScriptTemplatesProvider import java.io.File @@ -30,7 +29,7 @@ class ScriptTemplatesFromCompilerSettingsProvider(project: Project): ScriptTempl override val isValid: Boolean = kotlinSettings.scriptTemplates.isNotBlank() override val templateClassNames: Iterable get() = kotlinSettings.scriptTemplates.split(',', ' ') - override val dependenciesClasspath: Iterable get() = kotlinSettings.scriptTemplatesClasspath.split(File.pathSeparator) + override val dependenciesClasspath get() = kotlinSettings.scriptTemplatesClasspath.split(File.pathSeparator).map(::File) override val environment: Map? by lazy { mapOf( "projectRoot" to (project.basePath ?: project.baseDir.canonicalPath)?.let(::File)) } diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt index 5ec9ba4c2f8..fc071a3524f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt @@ -143,5 +143,5 @@ class TestScriptTemplateProvider( override val id = "Test" override val isValid = true override val templateClassNames = listOf("custom.scriptDefinition.Template") - override val dependenciesClasspath = listOf(compiledTemplateDir.canonicalPath) + override val dependenciesClasspath = listOf(compiledTemplateDir) }