Fix implementation of gradle ScriptTemplateProvider extension
WARNING: adds dependency to idea's gradle-and-groovy-plugin to idea-core
This commit is contained in:
committed by
Pavel V. Talanov
parent
834372a3b3
commit
a60e1ab807
+5
-3
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
+1
-1
@@ -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()) {
|
||||
|
||||
+13
-3
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user