From 96c2a589c08b20d90ef8f602046535e0056217ed Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 5 Jul 2017 15:58:20 +0300 Subject: [PATCH] Support legacy resolver interface --- ...inScriptDefinitionFromAnnotatedTemplate.kt | 70 +++++++------ .../jetbrains/kotlin/script/legacyWrappers.kt | 99 +++++++++++++++++++ .../jetbrains/kotlin/script/scriptTemplate.kt | 39 -------- 3 files changed, 133 insertions(+), 75 deletions(-) create mode 100644 compiler/frontend.script/src/org/jetbrains/kotlin/script/legacyWrappers.kt diff --git a/compiler/frontend.script/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt b/compiler/frontend.script/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt index 6258d66cd57..fa7db21fd4f 100644 --- a/compiler/frontend.script/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt +++ b/compiler/frontend.script/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt @@ -45,44 +45,42 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate( } override val dependencyResolver: DependenciesResolver by lazy { - computeResolver(template, providedResolver) + providedResolver ?: + resolverFromAnnotation(template) ?: + resolverFromLegacyAnnotation(template) ?: + DependenciesResolver.NoDependencies } - private fun computeResolver( - template: KClass, - providedResolver: DependenciesResolver? - ): @Suppress("DEPRECATION") DependenciesResolver { - val defAnn by lazy { takeUnlessError { template.annotations.firstIsInstanceOrNull() } } - val legacyDefAnn by lazy { takeUnlessError { template.annotations.firstIsInstanceOrNull() } } - return when { - providedResolver != null -> providedResolver - // TODO: logScriptDefMessage missing or invalid constructor - defAnn != null -> - try { - defAnn.resolver.primaryConstructor?.call() as? DependenciesResolver ?: null.apply { - log.warn("[kts] No default constructor found for ${defAnn.resolver.qualifiedName}") - } - } - catch (ex: ClassCastException) { - log.warn("[kts] Script def error ${ex.message}") - null - } - legacyDefAnn != null -> - try { - log.warn("[kts] Deprecated annotations on the script template are used, please update the provider") - legacyDefAnn.resolver.primaryConstructor?.call()?.let { - LegacyScriptDependenciesResolverWrapper(it) - } - ?: 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 - } - else -> null - } ?: DependenciesResolver.NoDependencies + private fun resolverFromLegacyAnnotation(template: KClass): DependenciesResolver? { + val legacyDefAnn = takeUnlessError { + template.annotations.firstIsInstanceOrNull() + } ?: return null + + log.warn("[kts] Deprecated annotations on the script template are used, please update the provider") + + return instantiateResolver(legacyDefAnn.resolver)?.let(::LegacyPackageDependencyResolverWrapper) + } + + private fun resolverFromAnnotation(template: KClass): DependenciesResolver? { + val defAnn = takeUnlessError { + template.annotations.firstIsInstanceOrNull() + } ?: return null + + val resolver = instantiateResolver(defAnn.resolver) + return if (resolver is DependenciesResolver) resolver else resolver?.let(::ApiChangeDependencyResolverWrapper) + } + + private fun instantiateResolver(resolverClass: KClass): T? { + // TODO: logScriptDefMessage missing or invalid constructor + return try { + resolverClass.primaryConstructor?.call().also { + if (it == null) log.warn("[kts] No default constructor found for ${resolverClass.qualifiedName}") + } + } + catch (ex: ClassCastException) { + log.warn("[kts] Script def error ${ex.message}") + null + } } val samWithReceiverAnnotations: List? by lazy { diff --git a/compiler/frontend.script/src/org/jetbrains/kotlin/script/legacyWrappers.kt b/compiler/frontend.script/src/org/jetbrains/kotlin/script/legacyWrappers.kt new file mode 100644 index 00000000000..998e1a2cb00 --- /dev/null +++ b/compiler/frontend.script/src/org/jetbrains/kotlin/script/legacyWrappers.kt @@ -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() + val legacyDeps = legacyResolver.resolve( + object : ScriptContents { + override val file: File? get() = scriptContents.file + override val annotations: Iterable 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() + 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) +} \ No newline at end of file diff --git a/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplate.kt b/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplate.kt index d7fac8d0504..08c865fc201 100644 --- a/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplate.kt +++ b/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplate.kt @@ -118,42 +118,3 @@ private fun> compareIterables(a: Iterable, b: Iterable): 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 - ): ResolveResult { - val reports = ArrayList() - val legacyDeps = legacyResolver.resolve( - object : ScriptContents { - override val file: File? get() = scriptContents.file - override val annotations: Iterable 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) -} \ No newline at end of file