Update template(s) provider interface to support multiple templates, rename it appropriately
This commit is contained in:
+16
-14
@@ -23,7 +23,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
interface ScriptTemplateProvider {
|
interface ScriptTemplatesProvider {
|
||||||
|
|
||||||
// for resolving ambiguities
|
// for resolving ambiguities
|
||||||
val id: String
|
val id: String
|
||||||
@@ -31,7 +31,7 @@ interface ScriptTemplateProvider {
|
|||||||
|
|
||||||
val isValid: Boolean
|
val isValid: Boolean
|
||||||
|
|
||||||
val templateClassName: String
|
val templateClassNames: Iterable<String>
|
||||||
|
|
||||||
val resolver: ScriptDependenciesResolver? get() = null
|
val resolver: ScriptDependenciesResolver? get() = null
|
||||||
|
|
||||||
@@ -42,33 +42,35 @@ interface ScriptTemplateProvider {
|
|||||||
val environment: Map<String, Any?>?
|
val environment: Map<String, Any?>?
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val EP_NAME = ExtensionPointName.create<ScriptTemplateProvider>("org.jetbrains.kotlin.scriptTemplateProvider")
|
val EP_NAME = ExtensionPointName.create<ScriptTemplatesProvider>("org.jetbrains.kotlin.scriptTemplateProvider")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun makeScriptDefsFromTemplateProviderExtensions(project: Project,
|
fun makeScriptDefsFromTemplateProviderExtensions(project: Project,
|
||||||
errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = { ep, ex -> throw ex }
|
errorsHandler: ((ScriptTemplatesProvider, Exception) -> Unit) = { ep, ex -> throw ex }
|
||||||
): List<KotlinScriptDefinitionFromTemplate> =
|
): List<KotlinScriptDefinitionFromTemplate> =
|
||||||
makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplateProvider.EP_NAME).extensions.asIterable(),
|
makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplatesProvider.EP_NAME).extensions.asIterable(),
|
||||||
errorsHandler)
|
errorsHandler)
|
||||||
|
|
||||||
fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvider>,
|
fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplatesProvider>,
|
||||||
errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = { ep, ex -> throw ex }
|
errorsHandler: ((ScriptTemplatesProvider, Exception) -> Unit) = { ep, ex -> throw ex }
|
||||||
): List<KotlinScriptDefinitionFromTemplate> {
|
): List<KotlinScriptDefinitionFromTemplate> {
|
||||||
val idToVersion = hashMapOf<String, Int>()
|
val idToVersion = hashMapOf<String, Int>()
|
||||||
return providers.filter { it.isValid }.sortedByDescending { it.version }.mapNotNull { provider ->
|
return providers.filter { it.isValid }.sortedByDescending { it.version }.flatMap { provider ->
|
||||||
try {
|
try {
|
||||||
idToVersion.get(provider.id)?.let { ver -> errorsHandler(provider, RuntimeException("Conflicting scriptTemplateProvider ${provider.id}, using one with version $ver")) }
|
idToVersion.get(provider.id)?.let { ver -> errorsHandler(provider, RuntimeException("Conflicting scriptTemplateProvider ${provider.id}, using one with version $ver")) }
|
||||||
Logger.getInstance("makeScriptDefsFromTemplateProviders")
|
Logger.getInstance("makeScriptDefsFromTemplateProviders")
|
||||||
.info("[kts] loading script definition ${provider.templateClassName} using cp: ${provider.dependenciesClasspath.joinToString(File.pathSeparator)}")
|
.info("[kts] loading script definitions ${provider.templateClassNames} using cp: ${provider.dependenciesClasspath.joinToString(File.pathSeparator)}")
|
||||||
val loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplateProvider::class.java.classLoader)
|
val loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplatesProvider::class.java.classLoader)
|
||||||
val cl = loader.loadClass(provider.templateClassName)
|
provider.templateClassNames.map {
|
||||||
idToVersion.put(provider.id, provider.version)
|
val cl = loader.loadClass(it)
|
||||||
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.filePattern, provider.environment)
|
idToVersion.put(provider.id, provider.version)
|
||||||
|
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.filePattern, provider.environment)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (ex: Exception) {
|
catch (ex: Exception) {
|
||||||
errorsHandler(provider, ex)
|
errorsHandler(provider, ex)
|
||||||
null
|
emptyList<KotlinScriptDefinitionFromTemplate>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -23,13 +23,13 @@ import com.intellij.openapi.project.Project
|
|||||||
import org.gradle.tooling.ProjectConnection
|
import org.gradle.tooling.ProjectConnection
|
||||||
import org.jetbrains.kotlin.lexer.KotlinLexer
|
import org.jetbrains.kotlin.lexer.KotlinLexer
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.script.ScriptTemplateProvider
|
import org.jetbrains.kotlin.script.ScriptTemplatesProvider
|
||||||
import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper
|
import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper
|
||||||
import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings
|
import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider {
|
class GradleScriptTemplateProvider(project: Project): ScriptTemplatesProvider {
|
||||||
|
|
||||||
private val gradleExeSettings: GradleExecutionSettings? by lazy {
|
private val gradleExeSettings: GradleExecutionSettings? by lazy {
|
||||||
try {
|
try {
|
||||||
@@ -62,7 +62,7 @@ class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider {
|
|||||||
override val version: Int = 1
|
override val version: Int = 1
|
||||||
override val isValid: Boolean get() = gradleExeSettings?.gradleHome != null
|
override val isValid: Boolean get() = gradleExeSettings?.gradleHome != null
|
||||||
|
|
||||||
override val templateClassName: String = "org.gradle.script.lang.kotlin.KotlinBuildScript"
|
override val templateClassNames: Iterable<String> = listOf("org.gradle.script.lang.kotlin.KotlinBuildScript")
|
||||||
override val dependenciesClasspath: Iterable<String> by lazy {
|
override val dependenciesClasspath: Iterable<String> by lazy {
|
||||||
gradleExeSettings?.gradleHome?.let { File(it, "lib") }
|
gradleExeSettings?.gradleHome?.let { File(it, "lib") }
|
||||||
?.let { if (it.exists()) it else null }
|
?.let { if (it.exists()) it else null }
|
||||||
|
|||||||
@@ -35,7 +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.ScriptTemplatesProvider"
|
||||||
area="IDEA_PROJECT"/>
|
area="IDEA_PROJECT"/>
|
||||||
</extensionPoints>
|
</extensionPoints>
|
||||||
</idea-plugin>
|
</idea-plugin>
|
||||||
|
|||||||
Reference in New Issue
Block a user