From a60e1ab807ad0db4621fdf583df21a66264dc579 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 13 Jun 2016 10:39:42 +0200 Subject: [PATCH] Fix implementation of gradle ScriptTemplateProvider extension WARNING: adds dependency to idea's gradle-and-groovy-plugin to idea-core --- .../scriptTemplateProviderExtensionPoint.kt | 8 +++++--- idea/idea-core/idea-core.iml | 1 + .../script/KotlinScriptConfigurationManager.kt | 2 +- .../core/script/gradleScriptTemplateProvider.kt | 16 +++++++++++++--- idea/src/META-INF/extensions/common.xml | 3 ++- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt index 4b36c79850a..caf1e60f65e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.script import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.extensions.Extensions +import com.intellij.openapi.project.Project import java.io.File import java.net.URLClassLoader @@ -40,8 +41,9 @@ interface ScriptTemplateProvider { } } -fun makeScriptDefsFromTemplateProviderExtesions(errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = fun (ep, ex) = println(ex)): List = - makeScriptDefsFromTemplateProviders(Extensions.getExtensions(ScriptTemplateProvider.EP_NAME).asIterable(), +fun makeScriptDefsFromTemplateProviderExtensions(project: Project, + errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = fun (ep, ex) = println(ex)): List = + makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplateProvider.EP_NAME).extensions.asIterable(), errorsHandler) fun makeScriptDefsFromTemplateProviders(providers: Iterable, @@ -51,7 +53,7 @@ fun makeScriptDefsFromTemplateProviders(providers: Iterable errorsHandler(it, RuntimeException("Conflicting scriptTemplateProvider ${it.id}, using one with version $ver")) } - val loader = URLClassLoader(it.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray()) + val loader = URLClassLoader(it.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplateProvider::class.java.classLoader) val cl = loader.loadClass(it.templateClass) idToVersion.put(it.id, it.version) KotlinScriptDefinitionFromTemplate(cl.kotlin, it.context) diff --git a/idea/idea-core/idea-core.iml b/idea/idea-core/idea-core.iml index 9bcf255455a..e3568f246dc 100644 --- a/idea/idea-core/idea-core.iml +++ b/idea/idea-core/idea-core.iml @@ -14,5 +14,6 @@ + \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt index b434e1a23b4..ad4868fdf26 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt @@ -83,7 +83,7 @@ class KotlinScriptConfigurationManager( } private fun reloadScriptDefinitions() { - (makeScriptDefsFromTemplateProviderExtesions(/* TODO: add logging here */) + + (makeScriptDefsFromTemplateProviderExtensions(project /* TODO: add logging here */) + loadScriptConfigsFromProjectRoot(File(project.basePath ?: "")).map { KotlinConfigurableScriptDefinition(it, kotlinEnvVars) } + makeScriptDefsFromConfigs(loadScriptDefConfigsFromProjectRoot(File(project.basePath ?: "")))).let { if (it.isNotEmpty()) { 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 da67ab51642..e99765bace9 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 @@ -16,18 +16,28 @@ package org.jetbrains.kotlin.idea.core.script +import com.intellij.openapi.project.Project import org.jetbrains.kotlin.script.ScriptTemplateProvider +import org.jetbrains.plugins.gradle.service.GradleInstallationManager import java.io.File -class GradleScriptTemplateProvider: ScriptTemplateProvider { +class GradleScriptTemplateProvider(project: Project, gim: GradleInstallationManager?): ScriptTemplateProvider { - private val gradleHome = System.getProperty("idea.gradle.home")?.let { File(it) }?.let { if (it.exists()) it else null } + private val gradleHome: File? = project.basePath?.let { gim?.getGradleHome(project, it) } + private val gradleLibsPath: File? = gradleHome?.let { File(it, "lib") }?.let { if (it.exists()) it else null } override val id: String = "Gradle" override val version: Int = 1 override val isValid: Boolean = gradleHome != null override val templateClass: String = "org.gradle.script.lang.kotlin.KotlinBuildScript" - override val dependenciesClasspath: Iterable = listOf(File(gradleHome, "gradle_all.jar").absolutePath) + override val dependenciesClasspath: Iterable = + gradleLibsPath?.listFiles { file -> file.extension == "jar" && depLibsPrefixes.any { file.name.startsWith(it) } } + ?.map { it.absolutePath } + ?: emptyList() override val context: Any? = gradleHome + + companion object { + private val depLibsPrefixes = listOf("gradle-script-kotlin", "gradle-core") + } } diff --git a/idea/src/META-INF/extensions/common.xml b/idea/src/META-INF/extensions/common.xml index ba2484ae380..c7f379c0e5a 100644 --- a/idea/src/META-INF/extensions/common.xml +++ b/idea/src/META-INF/extensions/common.xml @@ -35,6 +35,7 @@ interface="org.jetbrains.kotlin.extensions.StorageComponentContainerContributor" area="IDEA_PROJECT"/> + interface="org.jetbrains.kotlin.script.ScriptTemplateProvider" + area="IDEA_PROJECT"/>