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.net.URLClassLoader
interface ScriptTemplateProvider {
interface ScriptTemplatesProvider {
// for resolving ambiguities
val id: String
@@ -31,7 +31,7 @@ interface ScriptTemplateProvider {
val isValid: Boolean
val templateClassName: String
val templateClassNames: Iterable<String>
val resolver: ScriptDependenciesResolver? get() = null
@@ -42,33 +42,35 @@ interface ScriptTemplateProvider {
val environment: Map<String, Any?>?
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,
errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = { ep, ex -> throw ex }
errorsHandler: ((ScriptTemplatesProvider, Exception) -> Unit) = { ep, ex -> throw ex }
): List<KotlinScriptDefinitionFromTemplate> =
makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplateProvider.EP_NAME).extensions.asIterable(),
makeScriptDefsFromTemplateProviders(Extensions.getArea(project).getExtensionPoint(ScriptTemplatesProvider.EP_NAME).extensions.asIterable(),
errorsHandler)
fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvider>,
errorsHandler: ((ScriptTemplateProvider, Exception) -> Unit) = { ep, ex -> throw ex }
fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplatesProvider>,
errorsHandler: ((ScriptTemplatesProvider, Exception) -> Unit) = { ep, ex -> throw ex }
): List<KotlinScriptDefinitionFromTemplate> {
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 {
idToVersion.get(provider.id)?.let { ver -> errorsHandler(provider, RuntimeException("Conflicting scriptTemplateProvider ${provider.id}, using one with version $ver")) }
Logger.getInstance("makeScriptDefsFromTemplateProviders")
.info("[kts] loading script definition ${provider.templateClassName} using cp: ${provider.dependenciesClasspath.joinToString(File.pathSeparator)}")
val loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplateProvider::class.java.classLoader)
val cl = loader.loadClass(provider.templateClassName)
idToVersion.put(provider.id, provider.version)
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.filePattern, provider.environment)
.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(), ScriptTemplatesProvider::class.java.classLoader)
provider.templateClassNames.map {
val cl = loader.loadClass(it)
idToVersion.put(provider.id, provider.version)
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.filePattern, provider.environment)
}
}
catch (ex: Exception) {
errorsHandler(provider, ex)
null
emptyList<KotlinScriptDefinitionFromTemplate>()
}
}
}
@@ -23,13 +23,13 @@ import com.intellij.openapi.project.Project
import org.gradle.tooling.ProjectConnection
import org.jetbrains.kotlin.lexer.KotlinLexer
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.settings.GradleExecutionSettings
import java.io.File
import java.util.*
class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider {
class GradleScriptTemplateProvider(project: Project): ScriptTemplatesProvider {
private val gradleExeSettings: GradleExecutionSettings? by lazy {
try {
@@ -62,7 +62,7 @@ class GradleScriptTemplateProvider(project: Project): ScriptTemplateProvider {
override val version: Int = 1
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 {
gradleExeSettings?.gradleHome?.let { File(it, "lib") }
?.let { if (it.exists()) it else null }
+1 -1
View File
@@ -35,7 +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.ScriptTemplatesProvider"
area="IDEA_PROJECT"/>
</extensionPoints>
</idea-plugin>