Support legacy resolver interface
This commit is contained in:
committed by
Pavel V. Talanov
parent
65dba3615c
commit
96c2a589c0
+34
-36
@@ -45,44 +45,42 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val dependencyResolver: DependenciesResolver by lazy {
|
override val dependencyResolver: DependenciesResolver by lazy {
|
||||||
computeResolver(template, providedResolver)
|
providedResolver ?:
|
||||||
|
resolverFromAnnotation(template) ?:
|
||||||
|
resolverFromLegacyAnnotation(template) ?:
|
||||||
|
DependenciesResolver.NoDependencies
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun computeResolver(
|
private fun resolverFromLegacyAnnotation(template: KClass<out Any>): DependenciesResolver? {
|
||||||
template: KClass<out Any>,
|
val legacyDefAnn = takeUnlessError {
|
||||||
providedResolver: DependenciesResolver?
|
template.annotations.firstIsInstanceOrNull<ScriptTemplateDefinition>()
|
||||||
): @Suppress("DEPRECATION") DependenciesResolver {
|
} ?: return null
|
||||||
val defAnn by lazy { takeUnlessError { template.annotations.firstIsInstanceOrNull<kotlin.script.templates.ScriptTemplateDefinition>() } }
|
|
||||||
val legacyDefAnn by lazy { takeUnlessError { template.annotations.firstIsInstanceOrNull<ScriptTemplateDefinition>() } }
|
log.warn("[kts] Deprecated annotations on the script template are used, please update the provider")
|
||||||
return when {
|
|
||||||
providedResolver != null -> providedResolver
|
return instantiateResolver(legacyDefAnn.resolver)?.let(::LegacyPackageDependencyResolverWrapper)
|
||||||
// TODO: logScriptDefMessage missing or invalid constructor
|
}
|
||||||
defAnn != null ->
|
|
||||||
try {
|
private fun resolverFromAnnotation(template: KClass<out Any>): DependenciesResolver? {
|
||||||
defAnn.resolver.primaryConstructor?.call() as? DependenciesResolver ?: null.apply {
|
val defAnn = takeUnlessError {
|
||||||
log.warn("[kts] No default constructor found for ${defAnn.resolver.qualifiedName}")
|
template.annotations.firstIsInstanceOrNull<kotlin.script.templates.ScriptTemplateDefinition>()
|
||||||
}
|
} ?: return null
|
||||||
}
|
|
||||||
catch (ex: ClassCastException) {
|
val resolver = instantiateResolver(defAnn.resolver)
|
||||||
log.warn("[kts] Script def error ${ex.message}")
|
return if (resolver is DependenciesResolver) resolver else resolver?.let(::ApiChangeDependencyResolverWrapper)
|
||||||
null
|
}
|
||||||
}
|
|
||||||
legacyDefAnn != null ->
|
private fun <T : Any> instantiateResolver(resolverClass: KClass<T>): T? {
|
||||||
try {
|
// TODO: logScriptDefMessage missing or invalid constructor
|
||||||
log.warn("[kts] Deprecated annotations on the script template are used, please update the provider")
|
return try {
|
||||||
legacyDefAnn.resolver.primaryConstructor?.call()?.let {
|
resolverClass.primaryConstructor?.call().also {
|
||||||
LegacyScriptDependenciesResolverWrapper(it)
|
if (it == null) log.warn("[kts] No default constructor found for ${resolverClass.qualifiedName}")
|
||||||
}
|
}
|
||||||
?: null.apply {
|
}
|
||||||
log.warn("[kts] No default constructor found for ${legacyDefAnn.resolver.qualifiedName}")
|
catch (ex: ClassCastException) {
|
||||||
}
|
log.warn("[kts] Script def error ${ex.message}")
|
||||||
}
|
null
|
||||||
catch (ex: ClassCastException) {
|
}
|
||||||
log.warn("[kts] Script def error ${ex.message}")
|
|
||||||
null
|
|
||||||
}
|
|
||||||
else -> null
|
|
||||||
} ?: DependenciesResolver.NoDependencies
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val samWithReceiverAnnotations: List<String>? by lazy {
|
val samWithReceiverAnnotations: List<String>? by lazy {
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@file:Suppress("DEPRECATION")
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.script
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
import kotlin.script.dependencies.DependenciesResolver
|
||||||
|
import kotlin.script.dependencies.Environment
|
||||||
|
import kotlin.script.dependencies.ScriptDependencies
|
||||||
|
import kotlin.script.dependencies.ScriptReport
|
||||||
|
|
||||||
|
internal class LegacyPackageDependencyResolverWrapper(val legacyResolver: ScriptDependenciesResolver) : kotlin.script.dependencies.DependenciesResolver {
|
||||||
|
override fun resolve(
|
||||||
|
scriptContents: kotlin.script.dependencies.ScriptContents,
|
||||||
|
environment: Environment
|
||||||
|
): DependenciesResolver.ResolveResult {
|
||||||
|
val reports = ArrayList<ScriptReport>()
|
||||||
|
val legacyDeps = legacyResolver.resolve(
|
||||||
|
object : ScriptContents {
|
||||||
|
override val file: File? get() = scriptContents.file
|
||||||
|
override val annotations: Iterable<Annotation> get() = scriptContents.annotations
|
||||||
|
override val text: CharSequence? get() = scriptContents.text
|
||||||
|
},
|
||||||
|
environment,
|
||||||
|
{ sev, msg, pos ->
|
||||||
|
reports.add(ScriptReport(msg, sev.convertSeverity(), pos?.convertPosition()))
|
||||||
|
}, null
|
||||||
|
).get() ?: return DependenciesResolver.ResolveResult.Failure(reports)
|
||||||
|
|
||||||
|
val dependencies = ScriptDependencies(
|
||||||
|
javaHome = legacyDeps.javaHome?.let(::File),
|
||||||
|
classpath = legacyDeps.classpath.toList(),
|
||||||
|
imports = legacyDeps.imports.toList(),
|
||||||
|
sources = legacyDeps.sources.toList(),
|
||||||
|
scripts = legacyDeps.scripts.toList()
|
||||||
|
)
|
||||||
|
return DependenciesResolver.ResolveResult.Success(dependencies, reports)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ScriptDependenciesResolver.ReportSeverity.convertSeverity(): ScriptReport.Severity = when(this) {
|
||||||
|
ScriptDependenciesResolver.ReportSeverity.ERROR -> ScriptReport.Severity.ERROR
|
||||||
|
ScriptDependenciesResolver.ReportSeverity.WARNING -> ScriptReport.Severity.WARNING
|
||||||
|
ScriptDependenciesResolver.ReportSeverity.INFO -> ScriptReport.Severity.INFO
|
||||||
|
ScriptDependenciesResolver.ReportSeverity.DEBUG -> ScriptReport.Severity.DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ScriptContents.Position.convertPosition(): ScriptReport.Position = ScriptReport.Position(line, col)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ApiChangeDependencyResolverWrapper(val legacyResolver: kotlin.script.dependencies.ScriptDependenciesResolver)
|
||||||
|
: kotlin.script.dependencies.DependenciesResolver {
|
||||||
|
|
||||||
|
override fun resolve(
|
||||||
|
scriptContents: kotlin.script.dependencies.ScriptContents,
|
||||||
|
environment: Environment
|
||||||
|
): DependenciesResolver.ResolveResult {
|
||||||
|
val reports = ArrayList<ScriptReport>()
|
||||||
|
val legacyDeps = legacyResolver.resolve(
|
||||||
|
scriptContents,
|
||||||
|
environment,
|
||||||
|
{ sev, msg, pos ->
|
||||||
|
reports.add(ScriptReport(msg, sev.convertSeverity(), pos?.convertPosition()))
|
||||||
|
}, null
|
||||||
|
).get() ?: return DependenciesResolver.ResolveResult.Failure(reports)
|
||||||
|
|
||||||
|
val dependencies = ScriptDependencies(
|
||||||
|
javaHome = legacyDeps.javaHome?.let(::File),
|
||||||
|
classpath = legacyDeps.classpath.toList(),
|
||||||
|
imports = legacyDeps.imports.toList(),
|
||||||
|
sources = legacyDeps.sources.toList(),
|
||||||
|
scripts = legacyDeps.scripts.toList()
|
||||||
|
)
|
||||||
|
return DependenciesResolver.ResolveResult.Success(dependencies, reports)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.convertSeverity(): ScriptReport.Severity = when(this) {
|
||||||
|
kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.ERROR -> ScriptReport.Severity.ERROR
|
||||||
|
kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.WARNING -> ScriptReport.Severity.WARNING
|
||||||
|
kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.INFO -> ScriptReport.Severity.INFO
|
||||||
|
kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.DEBUG -> ScriptReport.Severity.DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun kotlin.script.dependencies.ScriptContents.Position.convertPosition(): ScriptReport.Position = ScriptReport.Position(line, col)
|
||||||
|
}
|
||||||
@@ -118,42 +118,3 @@ private fun<T: Comparable<T>> compareIterables(a: Iterable<T>, b: Iterable<T>):
|
|||||||
|
|
||||||
private inline fun Int.chainCompare(compFn: () -> Int ): Int = if (this != 0) this else compFn()
|
private inline fun Int.chainCompare(compFn: () -> Int ): Int = if (this != 0) this else compFn()
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
|
||||||
class LegacyScriptDependenciesResolverWrapper(val legacyResolver: ScriptDependenciesResolver) : kotlin.script.dependencies.DependenciesResolver {
|
|
||||||
|
|
||||||
override fun resolve(
|
|
||||||
scriptContents: kotlin.script.dependencies.ScriptContents,
|
|
||||||
environment: Map<String, Any?>
|
|
||||||
): ResolveResult {
|
|
||||||
val reports = ArrayList<ScriptReport>()
|
|
||||||
val legacyDeps = legacyResolver.resolve(
|
|
||||||
object : ScriptContents {
|
|
||||||
override val file: File? get() = scriptContents.file
|
|
||||||
override val annotations: Iterable<Annotation> get() = scriptContents.annotations
|
|
||||||
override val text: CharSequence? get() = scriptContents.text
|
|
||||||
},
|
|
||||||
environment,
|
|
||||||
{ sev, msg, pos ->
|
|
||||||
reports.add(ScriptReport(msg, sev.convertSeverity(), pos?.convertPosition()))
|
|
||||||
}, null
|
|
||||||
).get() ?: return ResolveResult.Failure()
|
|
||||||
|
|
||||||
val dependencies = ScriptDependencies(
|
|
||||||
javaHome = legacyDeps.javaHome?.let(::File),
|
|
||||||
classpath = legacyDeps.classpath.toList(),
|
|
||||||
imports = legacyDeps.imports.toList(),
|
|
||||||
sources = legacyDeps.sources.toList(),
|
|
||||||
scripts = legacyDeps.scripts.toList()
|
|
||||||
)
|
|
||||||
return ResolveResult.Success(dependencies, reports)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun ScriptDependenciesResolver.ReportSeverity.convertSeverity(): ScriptReport.Severity = when(this) {
|
|
||||||
ScriptDependenciesResolver.ReportSeverity.ERROR -> ScriptReport.Severity.ERROR
|
|
||||||
ScriptDependenciesResolver.ReportSeverity.WARNING -> ScriptReport.Severity.WARNING
|
|
||||||
ScriptDependenciesResolver.ReportSeverity.INFO -> ScriptReport.Severity.INFO
|
|
||||||
ScriptDependenciesResolver.ReportSeverity.DEBUG -> ScriptReport.Severity.DEBUG
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun ScriptContents.Position.convertPosition(): ScriptReport.Position = ScriptReport.Position(line, col)
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user