diff --git a/runtime/src/main/kotlin/kotlin/KotlinVersion.kt b/runtime/src/main/kotlin/kotlin/KotlinVersion.kt new file mode 100644 index 00000000000..e11a0754206 --- /dev/null +++ b/runtime/src/main/kotlin/kotlin/KotlinVersion.kt @@ -0,0 +1,89 @@ +/* + * 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 + +/** + * Represents a version of the Kotlin standard library. + * + * [major], [minor] and [patch] are integer components of a version, + * they must be non-negative and not greater than 255 ([MAX_COMPONENT_VALUE]). + * + * @constructor Creates a version from all three components. + */ +public class KotlinVersion(val major: Int, val minor: Int, val patch: Int) : Comparable { + /** + * Creates a version from [major] and [minor] components, leaving [patch] component zero. + */ + public constructor(major: Int, minor: Int) : this(major, minor, 0) + + private val version = versionOf(major, minor, patch) + + private fun versionOf(major: Int, minor: Int, patch: Int): Int { + require(major in 0..MAX_COMPONENT_VALUE && minor in 0..MAX_COMPONENT_VALUE && patch in 0..MAX_COMPONENT_VALUE) { + "Version components are out of range: $major.$minor.$patch" + } + return major shl 16 + minor shl 8 + patch + } + + /** + * Returns the string representation of this version + */ + override fun toString(): String = "$major.$minor.$patch" + + override fun equals(other: Any?): Boolean { + if (this === other) return true + val otherVersion = (other as? KotlinVersion) ?: return false + return this.version == otherVersion.version + } + + override fun hashCode(): Int = version + + override fun compareTo(other: KotlinVersion): Int = version - other.version + + /** + * Returns `true` if this version is not less than the version specified + * with the provided [major] and [minor] components. + */ + public fun isAtLeast(major: Int, minor: Int): Boolean = + // or this.version >= versionOf(major, minor, 0) + this.major > major || (this.major == major && + this.minor >= minor) + + /** + * Returns `true` if this version is not less than the version specified + * with the provided [major], [minor] and [patch] components. + */ + public fun isAtLeast(major: Int, minor: Int, patch: Int): Boolean = + // or this.version >= versionOf(major, minor, patch) + this.major > major || (this.major == major && + (this.minor > minor || this.minor == minor && + this.patch >= patch)) + + companion object { + /** + * Maximum value a version component can have, a constant value 255. + */ + // NOTE: Must be placed before CURRENT because its initialization requires this field being initialized in JS + public const val MAX_COMPONENT_VALUE = 255 + + /** + * Returns the current version of the Kotlin standard library. + */ + // TODO: get from metadata or hardcode automatically during build + public val CURRENT: KotlinVersion = KotlinVersion(1, 1, 4) + } +}