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:
+9
-7
@@ -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>()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-1
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user