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.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<KotlinScriptDefinitionFromTemplate> =
makeScriptDefsFromTemplateProviders(Extensions.getExtensions(ScriptTemplateProvider.EP_NAME).asIterable(),
fun makeScriptDefsFromTemplateProviderExtensions(project: Project,
errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = fun (ep, ex) = println(ex)): List<KotlinScriptDefinitionFromTemplate> =
makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplateProvider.EP_NAME).extensions.asIterable(),
errorsHandler)
fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvider>,
@@ -51,7 +53,7 @@ fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvid
return providers.filter { it.isValid }.sortedByDescending { it.version }.mapNotNull {
try {
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)
idToVersion.put(it.id, it.version)
KotlinScriptDefinitionFromTemplate(cl.kotlin, it.context)
+1
View File
@@ -14,5 +14,6 @@
<orderEntry type="module" module-name="light-classes" />
<orderEntry type="module" module-name="frontend.java" />
<orderEntry type="module" module-name="util" />
<orderEntry type="library" name="gradle-and-groovy-plugin" level="project" />
</component>
</module>
@@ -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()) {
@@ -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<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
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"
area="IDEA_PROJECT"/>
<extensionPoint name="scriptTemplateProvider"
interface="org.jetbrains.kotlin.script.ScriptTemplateProvider"/>
interface="org.jetbrains.kotlin.script.ScriptTemplateProvider"
area="IDEA_PROJECT"/>
</extensionPoints>
</idea-plugin>