From 0f21db1ecbc00a63c8933ad667c9a301856b7007 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 20 Mar 2017 14:01:16 +0100 Subject: [PATCH] Copy base script classes to script-runtime before building bootstrap --- .../script/dependencies/dependencies.kt | 61 +++++++++++++++++++ .../kotlin/script/dependencies/resolvers.kt | 54 ++++++++++++++++ .../script/extensions/samWithReceiver.kt | 21 +++++++ .../kotlin/script/templates/annotations.kt | 34 +++++++++++ 4 files changed, 170 insertions(+) create mode 100644 core/script.runtime/src/kotlin/script/dependencies/dependencies.kt create mode 100644 core/script.runtime/src/kotlin/script/dependencies/resolvers.kt create mode 100644 core/script.runtime/src/kotlin/script/extensions/samWithReceiver.kt create mode 100644 core/script.runtime/src/kotlin/script/templates/annotations.kt diff --git a/core/script.runtime/src/kotlin/script/dependencies/dependencies.kt b/core/script.runtime/src/kotlin/script/dependencies/dependencies.kt new file mode 100644 index 00000000000..6f6600ec3a7 --- /dev/null +++ b/core/script.runtime/src/kotlin/script/dependencies/dependencies.kt @@ -0,0 +1,61 @@ +/* + * 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("unused") + +package kotlin.script.dependencies + +import java.io.File +import java.util.Collections.emptyList + +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) } +} + +// copied form Comparisons.kt to resolve temporary build issues with dependency on stdlib +private fun > compareValues(a: T?, b: T?): Int { + if (a === b) return 0 + if (a == null) return -1 + if (b == null) return 1 + + @Suppress("UNCHECKED_CAST") + return (a as Comparable).compareTo(b) +} + +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() \ No newline at end of file diff --git a/core/script.runtime/src/kotlin/script/dependencies/resolvers.kt b/core/script.runtime/src/kotlin/script/dependencies/resolvers.kt new file mode 100644 index 00000000000..9fd9cfc3ba6 --- /dev/null +++ b/core/script.runtime/src/kotlin/script/dependencies/resolvers.kt @@ -0,0 +1,54 @@ +/* + * 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("unused") + +package kotlin.script.dependencies + +import java.io.File +import java.util.concurrent.Future +import java.util.concurrent.TimeUnit + +interface ScriptDependenciesResolver { + + enum class ReportSeverity { ERROR, WARNING, INFO, DEBUG } + + fun resolve(script: ScriptContents, + environment: Map?, + report: (ReportSeverity, String, ScriptContents.Position?) -> Unit, + previousDependencies: KotlinScriptExternalDependencies? + ): Future = PseudoFuture(null) +} + +class BasicScriptDependenciesResolver : ScriptDependenciesResolver +interface ScriptContents { + + data class Position(val line: Int, val col: Int) + + val file: File? + val annotations: Iterable + val text: CharSequence? +} + +fun KotlinScriptExternalDependencies?.asFuture(): PseudoFuture = PseudoFuture(this) + +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 +} diff --git a/core/script.runtime/src/kotlin/script/extensions/samWithReceiver.kt b/core/script.runtime/src/kotlin/script/extensions/samWithReceiver.kt new file mode 100644 index 00000000000..c22b7e01765 --- /dev/null +++ b/core/script.runtime/src/kotlin/script/extensions/samWithReceiver.kt @@ -0,0 +1,21 @@ +/* + * 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 kotlin.script.extensions + +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class SamWithReceiverAnnotations(vararg val annotations: String) \ No newline at end of file diff --git a/core/script.runtime/src/kotlin/script/templates/annotations.kt b/core/script.runtime/src/kotlin/script/templates/annotations.kt new file mode 100644 index 00000000000..8e31165a318 --- /dev/null +++ b/core/script.runtime/src/kotlin/script/templates/annotations.kt @@ -0,0 +1,34 @@ +/* + * 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("unused") + +package kotlin.script.templates + +import kotlin.reflect.KClass +import kotlin.script.dependencies.BasicScriptDependenciesResolver +import kotlin.script.dependencies.ScriptDependenciesResolver + +const val DEFAULT_SCRIPT_FILE_PATTERN = ".*\\.kts" + +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class ScriptTemplateDefinition(val resolver: KClass = BasicScriptDependenciesResolver::class, + val scriptFilePattern: String = DEFAULT_SCRIPT_FILE_PATTERN) + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class AcceptedAnnotations(vararg val supportedAnnotationClasses: KClass)