Deprecate version field and preserve order of script providers in extension point

It's impossible to guess the order of the final list when there're
providers from different vendors as they might have different versioning systems.

com.intellij.openapi.extensions.LoadingOrder constants can be used by plugins authors to
resolve priority issues.
This commit is contained in:
Nikolay Krasko
2017-01-04 00:39:08 +03:00
parent 0c2247ca41
commit 9f11564708
5 changed files with 16 additions and 12 deletions
@@ -27,7 +27,11 @@ interface ScriptTemplatesProvider {
// for resolving ambiguities
val id: String
val version: Int
@Deprecated("Parameter isn't used for resolving priorities anymore. " +
"com.intellij.openapi.extensions.LoadingOrder constants can be used to order providers when registered from Intellij plugin.",
ReplaceWith("0"))
val version: Int get() = 0
val isValid: Boolean
@@ -42,7 +46,8 @@ interface ScriptTemplatesProvider {
val environment: Map<String, Any?>?
companion object {
val EP_NAME = ExtensionPointName.create<ScriptTemplatesProvider>("org.jetbrains.kotlin.scriptTemplatesProvider")
val EP_NAME: ExtensionPointName<ScriptTemplatesProvider> =
ExtensionPointName.create<ScriptTemplatesProvider>("org.jetbrains.kotlin.scriptTemplatesProvider")
}
}
@@ -55,16 +60,13 @@ fun makeScriptDefsFromTemplatesProviderExtensions(project: Project,
fun makeScriptDefsFromTemplatesProviders(providers: Iterable<ScriptTemplatesProvider>,
errorsHandler: ((ScriptTemplatesProvider, Exception) -> Unit) = { ep, ex -> throw ex }
): List<KotlinScriptDefinitionFromAnnotatedTemplate> {
val idToVersion = hashMapOf<String, Int>()
return providers.filter { it.isValid }.sortedByDescending { it.version }.flatMap { provider ->
return providers.filter { it.isValid }.flatMap { provider ->
try {
idToVersion.get(provider.id)?.let { ver -> errorsHandler(provider, RuntimeException("Conflicting scriptTemplatesProvider ${provider.id}, using one with version $ver")) }
Logger.getInstance("makeScriptDefsFromTemplatesProviders")
.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)
KotlinScriptDefinitionFromAnnotatedTemplate(cl.kotlin, provider.resolver, provider.filePattern, provider.environment)
}
}
@@ -73,4 +75,4 @@ fun makeScriptDefsFromTemplatesProviders(providers: Iterable<ScriptTemplatesProv
emptyList<KotlinScriptDefinitionFromAnnotatedTemplate>()
}
}
}
}
@@ -55,7 +55,6 @@ class GradleScriptTemplatesProvider(project: Project): ScriptTemplatesProvider {
}
override val id: String = "Gradle"
override val version: Int = 1
override val isValid: Boolean get() = gradleExeSettings?.gradleHome != null
override val templateClassNames: Iterable<String> = listOf("org.gradle.script.lang.kotlin.KotlinBuildScript")
+7 -2
View File
@@ -15,7 +15,12 @@
<!-- diagnosticSuppressor decelerated in common.xml -->
<diagnosticSuppressor implementation="org.jetbrains.kotlin.idea.debugger.DiagnosticSuppressorForDebugger"/>
<scriptTemplatesProvider implementation="org.jetbrains.kotlin.idea.core.script.GradleScriptTemplatesProvider"/>
<scriptTemplatesProvider implementation="org.jetbrains.kotlin.idea.script.ScriptTemplatesFromCompilerSettingsProvider"/>
<scriptTemplatesProvider
id="GradleScriptTemplatesProvider"
implementation="org.jetbrains.kotlin.idea.core.script.GradleScriptTemplatesProvider"/>
<scriptTemplatesProvider
id="ScriptTemplatesFromCompilerSettingsProvider"
implementation="org.jetbrains.kotlin.idea.script.ScriptTemplatesFromCompilerSettingsProvider"/>
</extensions>
</idea-plugin>
@@ -27,7 +27,6 @@ class ScriptTemplatesFromCompilerSettingsProvider(project: Project): ScriptTempl
private val kotlinSettings = KotlinCompilerSettings.getInstance(project).settings
override val id: String = "KotlinCompilerScriptTemplatesSettings"
override val version: Int = 1
override val isValid: Boolean = kotlinSettings.scriptTemplates.isNotBlank()
override val templateClassNames: Iterable<String> get() = kotlinSettings.scriptTemplates.split(',', ' ')
@@ -141,7 +141,6 @@ class TestScriptTemplateProvider(
override val environment: Map<String, Any?>
) : ScriptTemplatesProvider {
override val id = "Test"
override val version = 0
override val isValid = true
override val templateClassNames = listOf("custom.scriptDefinition.Template")
override val dependenciesClasspath = listOf(compiledTemplateDir.canonicalPath)