Fix implementation of gradle ScriptTemplateProvider extension

WARNING: adds dependency to idea's gradle-and-groovy-plugin to idea-core
This commit is contained in:
Ilya Chernikov
2016-06-13 10:39:42 +02:00
committed by Pavel V. Talanov
parent 834372a3b3
commit a60e1ab807
5 changed files with 22 additions and 8 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.script
import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.project.Project
import java.io.File import java.io.File
import java.net.URLClassLoader import java.net.URLClassLoader
@@ -40,8 +41,9 @@ interface ScriptTemplateProvider {
} }
} }
fun makeScriptDefsFromTemplateProviderExtesions(errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = fun (ep, ex) = println(ex)): List<KotlinScriptDefinitionFromTemplate> = fun makeScriptDefsFromTemplateProviderExtensions(project: Project,
makeScriptDefsFromTemplateProviders(Extensions.getExtensions(ScriptTemplateProvider.EP_NAME).asIterable(), errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = fun (ep, ex) = println(ex)): List<KotlinScriptDefinitionFromTemplate> =
makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplateProvider.EP_NAME).extensions.asIterable(),
errorsHandler) errorsHandler)
fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvider>, fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvider>,
@@ -51,7 +53,7 @@ fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvid
return providers.filter { it.isValid }.sortedByDescending { it.version }.mapNotNull { return providers.filter { it.isValid }.sortedByDescending { it.version }.mapNotNull {
try { try {
idToVersion.get(it.id)?.let { ver -> errorsHandler(it, RuntimeException("Conflicting scriptTemplateProvider ${it.id}, using one with version $ver")) } idToVersion.get(it.id)?.let { ver -> 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) val cl = loader.loadClass(it.templateClass)
idToVersion.put(it.id, it.version) idToVersion.put(it.id, it.version)
KotlinScriptDefinitionFromTemplate(cl.kotlin, it.context) KotlinScriptDefinitionFromTemplate(cl.kotlin, it.context)
+1
View File
@@ -14,5 +14,6 @@
<orderEntry type="module" module-name="light-classes" /> <orderEntry type="module" module-name="light-classes" />
<orderEntry type="module" module-name="frontend.java" /> <orderEntry type="module" module-name="frontend.java" />
<orderEntry type="module" module-name="util" /> <orderEntry type="module" module-name="util" />
<orderEntry type="library" name="gradle-and-groovy-plugin" level="project" />
</component> </component>
</module> </module>
@@ -83,7 +83,7 @@ class KotlinScriptConfigurationManager(
} }
private fun reloadScriptDefinitions() { private fun reloadScriptDefinitions() {
(makeScriptDefsFromTemplateProviderExtesions(/* TODO: add logging here */) + (makeScriptDefsFromTemplateProviderExtensions(project /* TODO: add logging here */) +
loadScriptConfigsFromProjectRoot(File(project.basePath ?: "")).map { KotlinConfigurableScriptDefinition(it, kotlinEnvVars) } + loadScriptConfigsFromProjectRoot(File(project.basePath ?: "")).map { KotlinConfigurableScriptDefinition(it, kotlinEnvVars) } +
makeScriptDefsFromConfigs(loadScriptDefConfigsFromProjectRoot(File(project.basePath ?: "")))).let { makeScriptDefsFromConfigs(loadScriptDefConfigsFromProjectRoot(File(project.basePath ?: "")))).let {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
@@ -16,18 +16,28 @@
package org.jetbrains.kotlin.idea.core.script package org.jetbrains.kotlin.idea.core.script
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.script.ScriptTemplateProvider import org.jetbrains.kotlin.script.ScriptTemplateProvider
import org.jetbrains.plugins.gradle.service.GradleInstallationManager
import java.io.File 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 id: String = "Gradle"
override val version: Int = 1 override val version: Int = 1
override val isValid: Boolean = gradleHome != null override val isValid: Boolean = gradleHome != null
override val templateClass: String = "org.gradle.script.lang.kotlin.KotlinBuildScript" override val templateClass: String = "org.gradle.script.lang.kotlin.KotlinBuildScript"
override val dependenciesClasspath: Iterable<String> = listOf(File(gradleHome, "gradle_all.jar").absolutePath) override val dependenciesClasspath: Iterable<String> =
gradleLibsPath?.listFiles { file -> file.extension == "jar" && depLibsPrefixes.any { file.name.startsWith(it) } }
?.map { it.absolutePath }
?: emptyList()
override val context: Any? = gradleHome override val context: Any? = gradleHome
companion object {
private val depLibsPrefixes = listOf("gradle-script-kotlin", "gradle-core")
}
} }
+2 -1
View File
@@ -35,6 +35,7 @@
interface="org.jetbrains.kotlin.extensions.StorageComponentContainerContributor" interface="org.jetbrains.kotlin.extensions.StorageComponentContainerContributor"
area="IDEA_PROJECT"/> area="IDEA_PROJECT"/>
<extensionPoint name="scriptTemplateProvider" <extensionPoint name="scriptTemplateProvider"
interface="org.jetbrains.kotlin.script.ScriptTemplateProvider"/> interface="org.jetbrains.kotlin.script.ScriptTemplateProvider"
area="IDEA_PROJECT"/>
</extensionPoints> </extensionPoints>
</idea-plugin> </idea-plugin>