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 3058934c595..ed11f1d165a 100644 --- a/compiler/frontend.script/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt +++ b/compiler/frontend.script/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt @@ -54,20 +54,9 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate( override val dependencyResolver: DependenciesResolver by lazy(LazyThreadSafetyMode.PUBLICATION) { resolverFromAnnotation(template) ?: - resolverFromLegacyAnnotation(template) ?: 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() @@ -101,7 +90,6 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate( private val samWithReceiverAnnotations: List? by lazy(LazyThreadSafetyMode.PUBLICATION) { takeUnlessError { template.annotations.firstIsInstanceOrNull()?.annotations?.toList() } - ?: takeUnlessError { template.annotations.firstIsInstanceOrNull()?.annotations?.toList() } } override val acceptedAnnotations: List> by lazy(LazyThreadSafetyMode.PUBLICATION) { diff --git a/compiler/frontend.script/src/org/jetbrains/kotlin/script/legacyWrappers.kt b/compiler/frontend.script/src/org/jetbrains/kotlin/script/legacyWrappers.kt deleted file mode 100644 index 4e5ac4b7b31..00000000000 --- a/compiler/frontend.script/src/org/jetbrains/kotlin/script/legacyWrappers.kt +++ /dev/null @@ -1,119 +0,0 @@ -/* - * 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.experimental.dependencies.DependenciesResolver -import kotlin.script.dependencies.Environment -import kotlin.script.experimental.dependencies.ScriptDependencies -import kotlin.script.experimental.dependencies.ScriptReport - -interface LegacyResolverWrapper - -// NOTE: not implementing resolver wrapper since it was not implemented initially and this is deprecated API -@Deprecated("Compatibility with deprecated API") -internal class LegacyPackageDependencyResolverWrapper( - val legacyResolver: ScriptDependenciesResolver -) : kotlin.script.experimental.dependencies.DependenciesResolver, LegacyResolverWrapper { - - private var previousDependencies: org.jetbrains.kotlin.script.KotlinScriptExternalDependencies? = null - - 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())) - }, - previousDependencies - ).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() - ) - previousDependencies = legacyDeps - return DependenciesResolver.ResolveResult.Success(dependencies, reports) - } - - private fun ScriptDependenciesResolver.ReportSeverity.convertSeverity(): ScriptReport.Severity = when(this) { - ScriptDependenciesResolver.ReportSeverity.FATAL -> ScriptReport.Severity.FATAL - 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( - override val delegate: kotlin.script.dependencies.ScriptDependenciesResolver -) : kotlin.script.experimental.dependencies.DependenciesResolver, - DependencyResolverWrapper, - LegacyResolverWrapper { - - private var previousDependencies: kotlin.script.dependencies.KotlinScriptExternalDependencies? = null - - override fun resolve( - scriptContents: kotlin.script.dependencies.ScriptContents, - environment: Environment - ): DependenciesResolver.ResolveResult { - val reports = ArrayList() - val legacyDeps = delegate.resolve( - scriptContents, - environment, - { sev, msg, pos -> - reports.add(ScriptReport(msg, sev.convertSeverity(), pos?.convertPosition())) - }, - previousDependencies - ).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() - ) - previousDependencies = legacyDeps - return DependenciesResolver.ResolveResult.Success(dependencies, reports) - } - - private fun kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.convertSeverity(): ScriptReport.Severity = when (this) { - kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.FATAL -> ScriptReport.Severity.FATAL - 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 deleted file mode 100644 index 53c5dac9991..00000000000 --- a/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplate.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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. - */ - -package org.jetbrains.kotlin.script - -import java.io.File -import java.util.concurrent.Future -import java.util.concurrent.TimeUnit -import kotlin.reflect.KClass - -const val DEFAULT_SCRIPT_FILE_PATTERN = ".*\\.kts" - -// TODO: remove this file and all the usages after releasing GSK 1.0 - -@Deprecated("Used only for compatibility with legacy code, use kotlin.script.templatesScriptTemplateDefinition instead", - replaceWith = ReplaceWith("kotlin.script.templates.ScriptTemplateDefinition")) -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -annotation class ScriptTemplateDefinition(val resolver: KClass, - val scriptFilePattern: String = DEFAULT_SCRIPT_FILE_PATTERN) - -@Deprecated("Used only for compatibility with legacy code, use kotlin.script.extensions.SamWithReceiverAnnotations instead", - replaceWith = ReplaceWith("kotlin.script.extensions.SamWithReceiverAnnotations")) -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -annotation class SamWithReceiverAnnotations(vararg val annotations: String) - -@Deprecated("Used only for compatibility with legacy code, use kotlin.script.dependencies.ScriptContents instead", - replaceWith = ReplaceWith("kotlin.script.dependencies.ScriptContents")) -interface ScriptContents { - - data class Position(val line: Int, val col: Int) - - val file: File? - val annotations: Iterable - val text: CharSequence? -} - -@Deprecated("Used only for compatibility with legacy code, use kotlin.script.dependencies.PseudoFuture instead", - replaceWith = ReplaceWith("kotlin.script.dependencies.PseudoFuture")) -class PseudoFuture(private val value: T): Future { - override fun get(): T = value - override fun get(p0: Long, p1: TimeUnit): T = value - override fun cancel(p0: Boolean): Boolean = false - override fun isDone(): Boolean = true - override fun isCancelled(): Boolean = false -} - -fun KotlinScriptExternalDependencies?.asFuture(): PseudoFuture = PseudoFuture(this) - -@Deprecated("Used only for compatibility with legacy code, use kotlin.script.dependencies.ScriptDependenciesResolver instead", - replaceWith = ReplaceWith("kotlin.script.dependencies.ScriptDependenciesResolver")) -interface ScriptDependenciesResolver { - - enum class ReportSeverity { FATAL, ERROR, WARNING, INFO, DEBUG } - - fun resolve(script: ScriptContents, - environment: Map?, - report: (ReportSeverity, String, ScriptContents.Position?) -> Unit, - previousDependencies: KotlinScriptExternalDependencies? - ): Future = PseudoFuture(null) -} - -@Suppress("unused") -@Deprecated("Used only for compatibility with legacy code, use kotlin.script.dependencies.ScriptDependenciesResolver instead", - replaceWith = ReplaceWith("kotlin.script.dependencies.ScriptDependenciesResolver")) -interface ScriptDependenciesResolverEx { - fun resolve(script: ScriptContents, - environment: Map?, - previousDependencies: KotlinScriptExternalDependencies? - ): KotlinScriptExternalDependencies? = null -} - -@Deprecated("Used only for compatibility with legacy code, use kotlin.script.dependencies.KotlinScriptExternalDependencies instead", - replaceWith = ReplaceWith("kotlin.script.dependencies.KotlinScriptExternalDependencies")) -interface KotlinScriptExternalDependencies : Comparable { - val javaHome: String? get() = null - val classpath: Iterable get() = emptyList() - val imports: Iterable get() = emptyList() - val sources: Iterable get() = emptyList() - val scripts: Iterable get() = emptyList() - - override fun compareTo(other: KotlinScriptExternalDependencies): Int = - compareValues(javaHome, other.javaHome) - .chainCompare { compareIterables(classpath, other.classpath) } - .chainCompare { compareIterables(imports, other.imports) } - .chainCompare { compareIterables(sources, other.sources) } - .chainCompare { compareIterables(scripts, other.scripts) } -} - -private fun> compareIterables(a: Iterable, b: Iterable): Int { - val ia = a.iterator() - val ib = b.iterator() - while (true) { - if (ia.hasNext() && !ib.hasNext()) return 1 - if (!ia.hasNext() && !ib.hasNext()) return 0 - if (!ia.hasNext()) return -1 - val compRes = compareValues(ia.next(), ib.next()) - if (compRes != 0) return compRes - } -} - -private inline fun Int.chainCompare(compFn: () -> Int ): Int = if (this != 0) this else compFn() - diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt index 02e8752d1c5..7f5d1425dec 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt @@ -239,8 +239,7 @@ fun loadDefinitionsFromTemplates( // as a compatibility measure, the asm based reading of annotations should be implemented to filter classes before classloading val template = loader.loadClass(templateClassName).kotlin when { - template.annotations.firstIsInstanceOrNull() != null || - template.annotations.firstIsInstanceOrNull() != null -> { + template.annotations.firstIsInstanceOrNull() != null -> { KotlinScriptDefinitionFromAnnotatedTemplate( template, environment, diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt index 6920bc6a36f..978a172bb97 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt @@ -40,10 +40,8 @@ import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.NotNullableUserDataProperty import org.jetbrains.kotlin.script.KotlinScriptDefinition -import org.jetbrains.kotlin.script.LegacyResolverWrapper import org.jetbrains.kotlin.scripting.shared.definitions.findScriptDefinition import org.jetbrains.kotlin.scripting.shared.definitions.scriptDefinition -import kotlin.script.experimental.dependencies.AsyncDependenciesResolver import kotlin.script.experimental.dependencies.ScriptDependencies class ScriptDependenciesUpdater( diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt index 6725b9c9866..71a3394bb93 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt @@ -16,7 +16,6 @@ import kotlinx.coroutines.Runnable import kotlinx.coroutines.runBlocking import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings import org.jetbrains.kotlin.script.KotlinScriptDefinition -import org.jetbrains.kotlin.script.LegacyResolverWrapper import org.jetbrains.kotlin.script.asResolveFailure import org.jetbrains.kotlin.scripting.shared.definitions.findScriptDefinition import java.util.concurrent.ConcurrentLinkedQueue @@ -89,7 +88,7 @@ class AsyncScriptDependenciesLoader internal constructor(project: Project) : Scr return if (dependenciesResolver is AsyncDependenciesResolver) { dependenciesResolver.resolveAsync(scriptContents, environment) } else { - assert(dependenciesResolver is LegacyResolverWrapper) + // TODO: shouldn't come here after dropping legacy resolvers, refactor accordingly dependenciesResolver.resolve(scriptContents, environment) } } diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/shared/resolve/legacyWrappers.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/shared/resolve/legacyWrappers.kt new file mode 100644 index 00000000000..939f4a63b93 --- /dev/null +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/shared/resolve/legacyWrappers.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("DEPRECATION") + +package org.jetbrains.kotlin.scripting.shared.resolve + +import org.jetbrains.kotlin.script.DependencyResolverWrapper +import java.io.File +import kotlin.script.dependencies.Environment +import kotlin.script.dependencies.ScriptDependenciesResolver +import kotlin.script.experimental.dependencies.DependenciesResolver +import kotlin.script.experimental.dependencies.ScriptDependencies +import kotlin.script.experimental.dependencies.ScriptReport + +interface LegacyResolverWrapper + +class ApiChangeDependencyResolverWrapper( + override val delegate: kotlin.script.dependencies.ScriptDependenciesResolver +) : kotlin.script.experimental.dependencies.DependenciesResolver, + DependencyResolverWrapper, + LegacyResolverWrapper { + + private var previousDependencies: kotlin.script.dependencies.KotlinScriptExternalDependencies? = null + + override fun resolve( + scriptContents: kotlin.script.dependencies.ScriptContents, + environment: Environment + ): DependenciesResolver.ResolveResult { + val reports = ArrayList() + val legacyDeps = delegate.resolve( + scriptContents, + environment, + { sev, msg, pos -> + reports.add(ScriptReport(msg, sev.convertSeverity(), pos?.convertPosition())) + }, + previousDependencies + ).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() + ) + previousDependencies = legacyDeps + return DependenciesResolver.ResolveResult.Success(dependencies, reports) + } + + private fun kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.convertSeverity(): ScriptReport.Severity = when (this) { + kotlin.script.dependencies.ScriptDependenciesResolver.ReportSeverity.FATAL -> ScriptReport.Severity.FATAL + 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