diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt index 3a6bbfce902..1ddc9f677a8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt @@ -43,10 +43,11 @@ val SCRIPT_CONFIG_FILE_EXTENSION = ".ktscfg.xml" class KotlinScriptConfigurationManager(project: Project, scriptDefinitionProvider: KotlinScriptDefinitionProvider) : AbstractProjectComponent(project) { - val kotlinEnvVars: Map by lazy { + val kotlinEnvVars: Map> by lazy { val paths = PathUtil.getKotlinPathsForIdeaPlugin() - mapOf("kotlin-runtime" to paths.runtimePath.canonicalPath, - "project-root" to (project.basePath ?: ".")) + mapOf("kotlin-runtime" to listOf(paths.runtimePath.canonicalPath), + "project-root" to listOf(project.basePath ?: "."), + "jdk" to PathUtil.getJdkClassesRoots().map { it.canonicalPath }) } init { @@ -58,11 +59,11 @@ class KotlinScriptConfigurationManager(project: Project, scriptDefinitionProvide } } -fun loadScriptDefinitionsFromDirectoryWithConfigs(dir: File, kotlinEnvVars: Map? = null): List = +fun loadScriptDefinitionsFromDirectoryWithConfigs(dir: File, kotlinEnvVars: Map>? = null): List = dir.walk().filter { it.isFile && it.name.endsWith(SCRIPT_CONFIG_FILE_EXTENSION, ignoreCase = true) }.toList() .flatMap { loadScriptDefinitionsFromConfig(it, kotlinEnvVars) } -fun loadScriptDefinitionsFromConfig(configFile: File, kotlinEnvVars: Map? = null): List = +fun loadScriptDefinitionsFromConfig(configFile: File, kotlinEnvVars: Map>? = null): List = JDOMUtil.loadDocument(configFile).rootElement.children.mapNotNull { XmlSerializer.deserialize(it, KotlinScriptConfig::class.java)?.let { KotlinConfigurableScriptDefinition(it, kotlinEnvVars) @@ -70,7 +71,7 @@ fun loadScriptDefinitionsFromConfig(configFile: File, kotlinEnvVars: Map? = null): List = +fun loadScriptDefinitionsFromConfig(configStream: InputStream, kotlinEnvVars: Map>? = null): List = JDOMUtil.loadDocument(configStream).rootElement.children.mapNotNull { XmlSerializer.deserialize(it, KotlinScriptConfig::class.java)?.let { KotlinConfigurableScriptDefinition(it, kotlinEnvVars) @@ -123,7 +124,7 @@ class KotlinScriptConfig( var superclassParamsMapping: MutableList = ArrayList() ) -class KotlinConfigurableScriptDefinition(val config: KotlinScriptConfig, val environmentVars: Map?) : KotlinScriptDefinition { +class KotlinConfigurableScriptDefinition(val config: KotlinScriptConfig, val environmentVars: Map>?) : KotlinScriptDefinition { override val name = config.name override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List = config.parameters.map { ScriptParameter(Name.identifier(it.name), getKotlinTypeByFqName(scriptDescriptor, it.type)) } @@ -139,11 +140,17 @@ class KotlinConfigurableScriptDefinition(val config: KotlinScriptConfig, val env override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) + // return all combination of replacements of env vars in the classpath entries + // if corresponding list of replacements is empty, all classpath entries containing the reference to the var are removed + // TODO: tests override fun getScriptDependenciesClasspath(): List = if (environmentVars == null || environmentVars.isEmpty()) config.classpath - else config.classpath.map { - environmentVars.entries.fold(it) { p, v -> - p.replace("\${${v.key}}", v.value) + else config.classpath.flatMap { cpentry -> + environmentVars.entries.fold(listOf(cpentry)) { p, v -> + if (v.value.isEmpty() && cpentry.contains("\${${v.key}}")) emptyList() + else v.value.flatMap { valListElement -> + p.map { it.replace("\${${v.key}}", valListElement) } + } } } }