Update template(s) provider interface to support multiple templates, rename it appropriately

This commit is contained in:
Ilya Chernikov
2016-08-08 16:06:02 +02:00
parent 6c0b78fb01
commit c9441bd7b3
3 changed files with 20 additions and 18 deletions
@@ -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>()
} }
} }
} }
@@ -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 }
+1 -1
View File
@@ -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>