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.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)
|
||||||
|
|||||||
@@ -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>
|
||||||
+1
-1
@@ -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()) {
|
||||||
|
|||||||
+13
-3
@@ -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")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user