Plumbing KlibMetadataVersion and KlibIrVersion values to klib manifest
This commit is contained in:
committed by
alexander-gorshenev
parent
bf12f7eee0
commit
b0f077ff4b
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.cli.js
|
|||||||
import com.intellij.openapi.Disposable
|
import com.intellij.openapi.Disposable
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
import com.intellij.openapi.util.text.StringUtil
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion
|
||||||
import org.jetbrains.kotlin.cli.common.*
|
import org.jetbrains.kotlin.cli.common.*
|
||||||
import org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR
|
import org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR
|
||||||
import org.jetbrains.kotlin.cli.common.ExitCode.OK
|
import org.jetbrains.kotlin.cli.common.ExitCode.OK
|
||||||
@@ -317,7 +318,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
|||||||
|
|
||||||
override fun createMetadataVersion(versionArray: IntArray): BinaryVersion {
|
override fun createMetadataVersion(versionArray: IntArray): BinaryVersion {
|
||||||
// TODO: Support metadata versions for klibs
|
// TODO: Support metadata versions for klibs
|
||||||
return JsMetadataVersion(*versionArray)
|
return KlibMetadataVersion(*versionArray)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun MutableList<String>.addPlatformOptions(arguments: K2JSCompilerArguments) {}
|
override fun MutableList<String>.addPlatformOptions(arguments: K2JSCompilerArguments) {}
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
package org.jetbrains.kotlin.backend.common.serialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.library.KLIB_PROPERTY_IR_VERSION
|
||||||
|
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||||
|
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
||||||
|
|
||||||
|
class KlibIrVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
|
||||||
|
|
||||||
|
override fun isCompatible(): Boolean = isCompatibleTo(INSTANCE)
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@JvmField
|
||||||
|
val INSTANCE = KlibIrVersion(1, 0, 0)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val INVALID_VERSION = KlibIrVersion(-1, -1, -1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val KotlinLibrary.metadataVersion: KlibIrVersion
|
||||||
|
get() {
|
||||||
|
val versionString = manifestProperties.getProperty(KLIB_PROPERTY_IR_VERSION)
|
||||||
|
val versionIntArray = BinaryVersion.parseVersionArray(versionString)
|
||||||
|
?: error("Could not parse metadata version: $versionString")
|
||||||
|
return KlibIrVersion(*versionIntArray)
|
||||||
|
}
|
||||||
+1
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.isExpectMember
|
import org.jetbrains.kotlin.backend.common.serialization.isExpectMember
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.isSerializableExpectClass
|
import org.jetbrains.kotlin.backend.common.serialization.isSerializableExpectClass
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataSerializer
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataSerializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
||||||
|
|||||||
+3
-3
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js
|
package org.jetbrains.kotlin.ir.backend.js
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
||||||
import org.jetbrains.kotlin.library.KotlinLibrary
|
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||||
@@ -20,7 +20,7 @@ class JsLibraryResolver(
|
|||||||
repositories: List<String>,
|
repositories: List<String>,
|
||||||
directLibs: List<String>,
|
directLibs: List<String>,
|
||||||
knownAbiVersions: List<KotlinAbiVersion>?,
|
knownAbiVersions: List<KotlinAbiVersion>?,
|
||||||
knownCompilerVersions: List<KonanVersion>?,
|
knownCompilerVersions: List<CompilerVersion>?,
|
||||||
distributionKlib: String?,
|
distributionKlib: String?,
|
||||||
localKotlinDir: String?,
|
localKotlinDir: String?,
|
||||||
skipCurrentDir: Boolean,
|
skipCurrentDir: Boolean,
|
||||||
@@ -49,7 +49,7 @@ fun jsResolveLibraries(libraries: List<String>, logger: Logger): KotlinLibraryRe
|
|||||||
repositories = emptyList(),
|
repositories = emptyList(),
|
||||||
directLibs = libraryAbsolutePaths,
|
directLibs = libraryAbsolutePaths,
|
||||||
knownAbiVersions = listOf(KotlinAbiVersion.CURRENT),
|
knownAbiVersions = listOf(KotlinAbiVersion.CURRENT),
|
||||||
knownCompilerVersions = emptyList<KonanVersion>(),
|
knownCompilerVersions = emptyList<CompilerVersion>(),
|
||||||
distributionKlib = null,
|
distributionKlib = null,
|
||||||
localKotlinDir = null,
|
localKotlinDir = null,
|
||||||
skipCurrentDir = false,
|
skipCurrentDir = false,
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.backend.common.LoggingContext
|
|||||||
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
||||||
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.KlibIrVersion
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.*
|
import org.jetbrains.kotlin.config.*
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
@@ -21,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
|
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
|
||||||
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrModuleSerializer
|
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrModuleSerializer
|
||||||
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsMangler
|
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsMangler
|
||||||
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.JsKlibMetadataVersion
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.KlibMetadataIncrementalSerializer
|
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.KlibMetadataIncrementalSerializer
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
@@ -32,8 +33,6 @@ import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList
|
|||||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult
|
import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult
|
||||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
||||||
import org.jetbrains.kotlin.konan.KonanVersionImpl
|
|
||||||
import org.jetbrains.kotlin.konan.MetaVersion
|
|
||||||
import org.jetbrains.kotlin.konan.properties.propertyList
|
import org.jetbrains.kotlin.konan.properties.propertyList
|
||||||
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
|
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
|
||||||
import org.jetbrains.kotlin.library.*
|
import org.jetbrains.kotlin.library.*
|
||||||
@@ -76,7 +75,7 @@ val emptyLoggingContext = object : LoggingContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val CompilerConfiguration.metadataVersion
|
private val CompilerConfiguration.metadataVersion
|
||||||
get() = get(CommonConfigurationKeys.METADATA_VERSION) as? JsKlibMetadataVersion ?: JsKlibMetadataVersion.INSTANCE
|
get() = get(CommonConfigurationKeys.METADATA_VERSION) as? KlibMetadataVersion ?: KlibMetadataVersion.INSTANCE
|
||||||
|
|
||||||
class KotlinFileSerializedData(val metadata: ByteArray, val irData: SerializedIrFile)
|
class KotlinFileSerializedData(val metadata: ByteArray, val irData: SerializedIrFile)
|
||||||
|
|
||||||
@@ -417,12 +416,13 @@ fun serializeModuleIntoKlib(
|
|||||||
|
|
||||||
val fullSerializedIr = SerializedIrModule(compiledKotlinFiles.map { it.irData })
|
val fullSerializedIr = SerializedIrModule(compiledKotlinFiles.map { it.irData })
|
||||||
|
|
||||||
val abiVersion = KotlinAbiVersion.CURRENT
|
val versions = KotlinLibraryVersioning(
|
||||||
// DO NOT PUSH. Commonize me.
|
abiVersion = KotlinAbiVersion.CURRENT,
|
||||||
val compilerVersion = KonanVersionImpl(MetaVersion.DEV, 1, 3, 0, -1)
|
libraryVersion = null,
|
||||||
val libraryVersion = null
|
compilerVersion = KotlinCompilerVersion.VERSION,
|
||||||
|
metadataVersion = KlibMetadataVersion.INSTANCE.toString(),
|
||||||
val versions = KonanLibraryVersioning(abiVersion = abiVersion, libraryVersion = libraryVersion, compilerVersion = compilerVersion)
|
irVersion = KlibIrVersion.INSTANCE.toString()
|
||||||
|
)
|
||||||
|
|
||||||
buildKoltinLibrary(
|
buildKoltinLibrary(
|
||||||
linkDependencies = dependencies,
|
linkDependencies = dependencies,
|
||||||
|
|||||||
-39
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
|
||||||
import java.io.DataInputStream
|
|
||||||
import java.io.InputStream
|
|
||||||
|
|
||||||
class JsKlibMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
|
|
||||||
override fun isCompatible(): Boolean =
|
|
||||||
this.isCompatibleTo(INSTANCE)
|
|
||||||
|
|
||||||
fun toInteger() = (patch shl 16) + (minOf(minor, 255) shl 8) + minOf(major, 255)
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmField
|
|
||||||
val INSTANCE = JsKlibMetadataVersion(1, 2, 6)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val INVALID_VERSION = JsKlibMetadataVersion()
|
|
||||||
|
|
||||||
fun fromInteger(version: Int): JsKlibMetadataVersion =
|
|
||||||
JsKlibMetadataVersion(version and 255, (version shr 8) and 255, version shr 16)
|
|
||||||
|
|
||||||
fun readFrom(stream: InputStream): JsKlibMetadataVersion {
|
|
||||||
val dataInput = DataInputStream(stream)
|
|
||||||
val size = dataInput.readInt()
|
|
||||||
|
|
||||||
// We assume here that the version will always have 3 components. This is needed to prevent reading an unpredictable amount
|
|
||||||
// of integers from old .kjsm files (pre-1.1) because they did not have the version in the beginning
|
|
||||||
if (size != INSTANCE.toArray().size) return INVALID_VERSION
|
|
||||||
|
|
||||||
return JsKlibMetadataVersion(*(1..size).map { dataInput.readInt() }.toIntArray())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+6
-6
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.konan
|
|||||||
|
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
||||||
interface KonanVersion : Serializable {
|
interface CompilerVersion : Serializable {
|
||||||
val meta: MetaVersion
|
val meta: MetaVersion
|
||||||
val major: Int
|
val major: Int
|
||||||
val minor: Int
|
val minor: Int
|
||||||
@@ -20,12 +20,12 @@ interface KonanVersion : Serializable {
|
|||||||
// major.minor.patch-meta-build where patch, meta and build are optional.
|
// major.minor.patch-meta-build where patch, meta and build are optional.
|
||||||
private val versionPattern = "(\\d+)\\.(\\d+)(?:\\.(\\d+))?(?:-(\\p{Alpha}\\p{Alnum}*))?(?:-(\\d+))?".toRegex()
|
private val versionPattern = "(\\d+)\\.(\\d+)(?:\\.(\\d+))?(?:-(\\p{Alpha}\\p{Alnum}*))?(?:-(\\d+))?".toRegex()
|
||||||
|
|
||||||
fun fromString(version: String): KonanVersion {
|
fun fromString(version: String): CompilerVersion {
|
||||||
val (major, minor, maintenance, metaString, build) =
|
val (major, minor, maintenance, metaString, build) =
|
||||||
versionPattern.matchEntire(version)?.destructured
|
versionPattern.matchEntire(version)?.destructured
|
||||||
?: throw IllegalArgumentException("Cannot parse Kotlin/Native version: $version")
|
?: throw IllegalArgumentException("Cannot parse Kotlin/Native version: $version")
|
||||||
|
|
||||||
return KonanVersionImpl(
|
return CompilerVersionImpl(
|
||||||
MetaVersion.findAppropriate(metaString),
|
MetaVersion.findAppropriate(metaString),
|
||||||
major.toInt(),
|
major.toInt(),
|
||||||
minor.toInt(),
|
minor.toInt(),
|
||||||
@@ -36,15 +36,15 @@ interface KonanVersion : Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun String.parseKonanVersion() = KonanVersion.fromString(this)
|
fun String.parseCompilerVersion() = CompilerVersion.fromString(this)
|
||||||
|
|
||||||
data class KonanVersionImpl(
|
data class CompilerVersionImpl(
|
||||||
override val meta: MetaVersion = MetaVersion.DEV,
|
override val meta: MetaVersion = MetaVersion.DEV,
|
||||||
override val major: Int,
|
override val major: Int,
|
||||||
override val minor: Int,
|
override val minor: Int,
|
||||||
override val maintenance: Int,
|
override val maintenance: Int,
|
||||||
override val build: Int = -1
|
override val build: Int = -1
|
||||||
) : KonanVersion {
|
) : CompilerVersion {
|
||||||
|
|
||||||
override fun toString(showMeta: Boolean, showBuild: Boolean) = buildString {
|
override fun toString(showMeta: Boolean, showBuild: Boolean) = buildString {
|
||||||
append(major)
|
append(major)
|
||||||
+12
-2
@@ -5,17 +5,27 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.common.serialization.metadata
|
package org.jetbrains.kotlin.backend.common.serialization.metadata
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.library.KLIB_PROPERTY_METADATA_VERSION
|
||||||
|
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
||||||
|
|
||||||
class KlibMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
|
class KlibMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
|
||||||
|
|
||||||
override fun isCompatible(): Boolean = this.major == 1 && this.minor == 0
|
override fun isCompatible(): Boolean = isCompatibleTo(INSTANCE)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmField
|
@JvmField
|
||||||
val INSTANCE = KlibMetadataVersion(1, 0, 0)
|
val INSTANCE = KlibMetadataVersion(1, 0, 0)
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val INVALID_VERSION = KlibMetadataVersion()
|
val INVALID_VERSION = KlibMetadataVersion(-1, -1, -1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val KotlinLibrary.metadataVersion: KlibMetadataVersion
|
||||||
|
get() {
|
||||||
|
val versionString = manifestProperties.getProperty(KLIB_PROPERTY_METADATA_VERSION)
|
||||||
|
val versionIntArray = BinaryVersion.parseVersionArray(versionString)
|
||||||
|
?: error("Could not parse ir version: $versionString")
|
||||||
|
return KlibMetadataVersion(*versionIntArray)
|
||||||
|
}
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
package org.jetbrains.kotlin.library
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.parseKonanVersion
|
|
||||||
import org.jetbrains.kotlin.konan.properties.Properties
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
|
||||||
|
|
||||||
data class KonanLibraryVersioning(
|
|
||||||
val libraryVersion: String?,
|
|
||||||
val compilerVersion: KonanVersion?,
|
|
||||||
val abiVersion: KotlinAbiVersion?
|
|
||||||
)
|
|
||||||
|
|
||||||
fun Properties.writeKonanLibraryVersioning(versions: KonanLibraryVersioning) {
|
|
||||||
versions.abiVersion ?. let { this.setProperty(KLIB_PROPERTY_ABI_VERSION, it.toString()) }
|
|
||||||
versions.libraryVersion ?. let { this.setProperty(KLIB_PROPERTY_LIBRARY_VERSION, it) }
|
|
||||||
versions.compilerVersion ?. let { this.setProperty(KLIB_PROPERTY_COMPILER_VERSION, "${versions.compilerVersion.toString(true, true)}") }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Properties.readKonanLibraryVersioning(): KonanLibraryVersioning {
|
|
||||||
val abiVersion = this.getProperty(KLIB_PROPERTY_ABI_VERSION)?.parseKonanAbiVersion()
|
|
||||||
val libraryVersion = this.getProperty(KLIB_PROPERTY_LIBRARY_VERSION)
|
|
||||||
val compilerVersion = this.getProperty(KLIB_PROPERTY_COMPILER_VERSION)?.parseKonanVersion()
|
|
||||||
|
|
||||||
return KonanLibraryVersioning(
|
|
||||||
abiVersion = abiVersion,
|
|
||||||
libraryVersion = libraryVersion,
|
|
||||||
compilerVersion = compilerVersion
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -8,6 +8,8 @@ const val KLIB_PROPERTY_ABI_VERSION = "abi_version"
|
|||||||
const val KLIB_PROPERTY_COMPILER_VERSION = "compiler_version"
|
const val KLIB_PROPERTY_COMPILER_VERSION = "compiler_version"
|
||||||
const val KLIB_PROPERTY_DEPENDENCY_VERSION = "dependency_version"
|
const val KLIB_PROPERTY_DEPENDENCY_VERSION = "dependency_version"
|
||||||
const val KLIB_PROPERTY_LIBRARY_VERSION = "library_version"
|
const val KLIB_PROPERTY_LIBRARY_VERSION = "library_version"
|
||||||
|
const val KLIB_PROPERTY_METADATA_VERSION = "metadata_version"
|
||||||
|
const val KLIB_PROPERTY_IR_VERSION = "ir_version"
|
||||||
const val KLIB_PROPERTY_UNIQUE_NAME = "unique_name"
|
const val KLIB_PROPERTY_UNIQUE_NAME = "unique_name"
|
||||||
const val KLIB_PROPERTY_DEPENDS = "depends"
|
const val KLIB_PROPERTY_DEPENDS = "depends"
|
||||||
const val KLIB_PROPERTY_PACKAGE = "package"
|
const val KLIB_PROPERTY_PACKAGE = "package"
|
||||||
@@ -21,7 +23,7 @@ const val KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS = "exportForwardDeclarations
|
|||||||
interface BaseKotlinLibrary {
|
interface BaseKotlinLibrary {
|
||||||
val libraryName: String
|
val libraryName: String
|
||||||
val libraryFile: File
|
val libraryFile: File
|
||||||
val versions: KonanLibraryVersioning
|
val versions: KotlinLibraryVersioning
|
||||||
// Whether this library is default (provided by distribution)?
|
// Whether this library is default (provided by distribution)?
|
||||||
val isDefault: Boolean
|
val isDefault: Boolean
|
||||||
val manifestProperties: Properties
|
val manifestProperties: Properties
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package org.jetbrains.kotlin.library
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.konan.properties.Properties
|
||||||
|
|
||||||
|
data class KotlinLibraryVersioning(
|
||||||
|
val libraryVersion: String?,
|
||||||
|
val compilerVersion: String?,
|
||||||
|
val abiVersion: KotlinAbiVersion?,
|
||||||
|
val metadataVersion: String?,
|
||||||
|
val irVersion: String?
|
||||||
|
)
|
||||||
|
|
||||||
|
fun Properties.writeKonanLibraryVersioning(versions: KotlinLibraryVersioning) {
|
||||||
|
versions.abiVersion ?. let { this.setProperty(KLIB_PROPERTY_ABI_VERSION, it.toString()) }
|
||||||
|
versions.libraryVersion ?. let { this.setProperty(KLIB_PROPERTY_LIBRARY_VERSION, it) }
|
||||||
|
versions.compilerVersion ?. let { this.setProperty(KLIB_PROPERTY_COMPILER_VERSION, it) }
|
||||||
|
versions.metadataVersion ?. let { this.setProperty(KLIB_PROPERTY_METADATA_VERSION, it) }
|
||||||
|
versions.irVersion ?. let { this.setProperty(KLIB_PROPERTY_IR_VERSION, it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Properties.readKonanLibraryVersioning(): KotlinLibraryVersioning {
|
||||||
|
val abiVersion = this.getProperty(KLIB_PROPERTY_ABI_VERSION)?.parseKonanAbiVersion()
|
||||||
|
val libraryVersion = this.getProperty(KLIB_PROPERTY_LIBRARY_VERSION)
|
||||||
|
val compilerVersion = this.getProperty(KLIB_PROPERTY_COMPILER_VERSION)
|
||||||
|
val metadataVersion = this.getProperty(KLIB_PROPERTY_METADATA_VERSION)
|
||||||
|
val irVersion = this.getProperty(KLIB_PROPERTY_IR_VERSION)
|
||||||
|
|
||||||
|
return KotlinLibraryVersioning(
|
||||||
|
abiVersion = abiVersion,
|
||||||
|
libraryVersion = libraryVersion,
|
||||||
|
compilerVersion = compilerVersion,
|
||||||
|
metadataVersion = metadataVersion,
|
||||||
|
irVersion = irVersion
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.library
|
|||||||
import org.jetbrains.kotlin.konan.properties.Properties
|
import org.jetbrains.kotlin.konan.properties.Properties
|
||||||
|
|
||||||
interface BaseWriter {
|
interface BaseWriter {
|
||||||
val versions: KonanLibraryVersioning
|
val versions: KotlinLibraryVersioning
|
||||||
fun addLinkDependencies(libraries: List<KotlinLibrary>)
|
fun addLinkDependencies(libraries: List<KotlinLibrary>)
|
||||||
fun addManifestAddend(properties: Properties)
|
fun addManifestAddend(properties: Properties)
|
||||||
fun commit()
|
fun commit()
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package org.jetbrains.kotlin.library
|
package org.jetbrains.kotlin.library
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.properties.hasProperty
|
|
||||||
import org.jetbrains.kotlin.library.impl.createKotlinLibrary
|
|
||||||
import org.jetbrains.kotlin.util.*
|
import org.jetbrains.kotlin.util.*
|
||||||
|
|
||||||
const val KOTLIN_STDLIB_NAME = "stdlib"
|
const val KOTLIN_STDLIB_NAME = "stdlib"
|
||||||
@@ -19,7 +17,7 @@ interface SearchPathResolver<L: KotlinLibrary> : WithLogger {
|
|||||||
|
|
||||||
interface SearchPathResolverWithAttributes<L: KotlinLibrary>: SearchPathResolver<L> {
|
interface SearchPathResolverWithAttributes<L: KotlinLibrary>: SearchPathResolver<L> {
|
||||||
val knownAbiVersions: List<KotlinAbiVersion>?
|
val knownAbiVersions: List<KotlinAbiVersion>?
|
||||||
val knownCompilerVersions: List<KonanVersion>?
|
val knownCompilerVersions: List<CompilerVersion>?
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a simple library resolver that only cares for file names.
|
// This is a simple library resolver that only cares for file names.
|
||||||
@@ -159,7 +157,7 @@ abstract class KotlinLibrarySearchPathResolver<L: KotlinLibrary>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KonanVersion.compatible(other: KonanVersion) =
|
fun CompilerVersion.compatible(other: CompilerVersion) =
|
||||||
this.major == other.major
|
this.major == other.major
|
||||||
&& this.minor == other.minor
|
&& this.minor == other.minor
|
||||||
&& this.maintenance == other.maintenance
|
&& this.maintenance == other.maintenance
|
||||||
@@ -172,7 +170,7 @@ abstract class KotlinLibraryProperResolverWithAttributes<L: KotlinLibrary>(
|
|||||||
repositories: List<String>,
|
repositories: List<String>,
|
||||||
directLibs: List<String>,
|
directLibs: List<String>,
|
||||||
override val knownAbiVersions: List<KotlinAbiVersion>?,
|
override val knownAbiVersions: List<KotlinAbiVersion>?,
|
||||||
override val knownCompilerVersions: List<KonanVersion>?,
|
override val knownCompilerVersions: List<CompilerVersion>?,
|
||||||
distributionKlib: String?,
|
distributionKlib: String?,
|
||||||
localKotlinDir: String?,
|
localKotlinDir: String?,
|
||||||
skipCurrentDir: Boolean,
|
skipCurrentDir: Boolean,
|
||||||
@@ -188,23 +186,13 @@ abstract class KotlinLibraryProperResolverWithAttributes<L: KotlinLibrary>(
|
|||||||
val candidateAbiVersion = candidate.versions.abiVersion
|
val candidateAbiVersion = candidate.versions.abiVersion
|
||||||
val candidateLibraryVersion = candidate.versions.libraryVersion
|
val candidateLibraryVersion = candidate.versions.libraryVersion
|
||||||
|
|
||||||
|
|
||||||
val abiVersionMatch = candidateAbiVersion != null &&
|
val abiVersionMatch = candidateAbiVersion != null &&
|
||||||
knownAbiVersions != null &&
|
knownAbiVersions != null &&
|
||||||
knownAbiVersions!!.contains(candidateAbiVersion)
|
knownAbiVersions!!.contains(candidateAbiVersion)
|
||||||
|
|
||||||
val compilerVersionMatch = candidateCompilerVersion != null &&
|
if (!abiVersionMatch) {
|
||||||
knownCompilerVersions != null &&
|
|
||||||
knownCompilerVersions!!.any { it.compatible(candidateCompilerVersion) }
|
|
||||||
|
|
||||||
if (!abiVersionMatch && !compilerVersionMatch) {
|
|
||||||
logger.warning("skipping $candidatePath. The abi versions don't match. Expected '${knownAbiVersions}', found '${candidateAbiVersion}'")
|
logger.warning("skipping $candidatePath. The abi versions don't match. Expected '${knownAbiVersions}', found '${candidateAbiVersion}'")
|
||||||
|
|
||||||
if (knownCompilerVersions != null) {
|
|
||||||
val expected = knownCompilerVersions?.map { it.toString(false, false) }
|
|
||||||
val found = candidateCompilerVersion?.toString(true, true)
|
|
||||||
logger.warning("The compiler versions don't match either. Expected '${expected}', found '${found}'")
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ open class BaseKotlinLibraryImpl(
|
|||||||
access.inPlace { it.manifestFile.loadProperties() }
|
access.inPlace { it.manifestFile.loadProperties() }
|
||||||
}
|
}
|
||||||
|
|
||||||
override val versions: KonanLibraryVersioning by lazy {
|
override val versions: KotlinLibraryVersioning by lazy {
|
||||||
manifestProperties.readKonanLibraryVersioning()
|
manifestProperties.readKonanLibraryVersioning()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ open class KotlinLibraryLayoutForWriter(
|
|||||||
open class BaseWriterImpl(
|
open class BaseWriterImpl(
|
||||||
val libraryLayout: KotlinLibraryLayoutForWriter,
|
val libraryLayout: KotlinLibraryLayoutForWriter,
|
||||||
moduleName: String,
|
moduleName: String,
|
||||||
override val versions: KonanLibraryVersioning,
|
override val versions: KotlinLibraryVersioning,
|
||||||
val nopack: Boolean = false
|
val nopack: Boolean = false
|
||||||
) : BaseWriter {
|
) : BaseWriter {
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ open class BaseWriterImpl(
|
|||||||
class KoltinLibraryWriterImpl(
|
class KoltinLibraryWriterImpl(
|
||||||
libDir: File,
|
libDir: File,
|
||||||
moduleName: String,
|
moduleName: String,
|
||||||
versions: KonanLibraryVersioning,
|
versions: KotlinLibraryVersioning,
|
||||||
nopack: Boolean = false,
|
nopack: Boolean = false,
|
||||||
|
|
||||||
val layout: KotlinLibraryLayoutForWriter = KotlinLibraryLayoutForWriter(libDir),
|
val layout: KotlinLibraryLayoutForWriter = KotlinLibraryLayoutForWriter(libDir),
|
||||||
@@ -90,7 +90,7 @@ fun buildKoltinLibrary(
|
|||||||
linkDependencies: List<KotlinLibrary>,
|
linkDependencies: List<KotlinLibrary>,
|
||||||
metadata: SerializedMetadata,
|
metadata: SerializedMetadata,
|
||||||
ir: SerializedIrModule,
|
ir: SerializedIrModule,
|
||||||
versions: KonanLibraryVersioning,
|
versions: KotlinLibraryVersioning,
|
||||||
output: String,
|
output: String,
|
||||||
moduleName: String,
|
moduleName: String,
|
||||||
nopack: Boolean,
|
nopack: Boolean,
|
||||||
|
|||||||
+2
-2
@@ -39,7 +39,7 @@ class KotlinNativeLoadingMetadataCache : BaseComponent {
|
|||||||
|
|
||||||
private val packageFragmentCache = createConcurrentWeakValueMap<CacheKey, CacheValue<ProtoBuf.PackageFragment>>()
|
private val packageFragmentCache = createConcurrentWeakValueMap<CacheKey, CacheValue<ProtoBuf.PackageFragment>>()
|
||||||
private val moduleHeaderCache = createConcurrentWeakValueMap<CacheKey, CacheValue<KlibMetadataProtoBuf.Header>>()
|
private val moduleHeaderCache = createConcurrentWeakValueMap<CacheKey, CacheValue<KlibMetadataProtoBuf.Header>>()
|
||||||
private val libraryVersioningCache = createConcurrentWeakValueMap<CacheKey, CacheValue<KonanLibraryVersioning>>()
|
private val libraryVersioningCache = createConcurrentWeakValueMap<CacheKey, CacheValue<KotlinLibraryVersioning>>()
|
||||||
|
|
||||||
fun getCachedPackageFragment(packageFragmentFile: VirtualFile): ProtoBuf.PackageFragment? {
|
fun getCachedPackageFragment(packageFragmentFile: VirtualFile): ProtoBuf.PackageFragment? {
|
||||||
check(packageFragmentFile.extension == KLIB_METADATA_FILE_EXTENSION) {
|
check(packageFragmentFile.extension == KLIB_METADATA_FILE_EXTENSION) {
|
||||||
@@ -93,7 +93,7 @@ class KotlinNativeLoadingMetadataCache : BaseComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun computeLibraryVersioning(manifestFile: VirtualFile): KonanLibraryVersioning? = try {
|
private fun computeLibraryVersioning(manifestFile: VirtualFile): KotlinLibraryVersioning? = try {
|
||||||
Properties().apply { manifestFile.inputStream.use { load(it) } }.readKonanLibraryVersioning()
|
Properties().apply { manifestFile.inputStream.use { load(it) } }.readKonanLibraryVersioning()
|
||||||
} catch (_: IOException) {
|
} catch (_: IOException) {
|
||||||
// ignore and cache null value
|
// ignore and cache null value
|
||||||
|
|||||||
+2
-2
@@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.konan.library.lite
|
package org.jetbrains.kotlin.konan.library.lite
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class LiteKonanDistribution(
|
class LiteKonanDistribution(
|
||||||
val distributionHome: File,
|
val distributionHome: File,
|
||||||
val konanVersion: KonanVersion,
|
val konanVersion: CompilerVersion,
|
||||||
val konanVersionString: String
|
val konanVersionString: String
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-2
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.konan.library.lite
|
package org.jetbrains.kotlin.konan.library.lite
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
||||||
import org.jetbrains.kotlin.konan.library.konanCommonLibraryPath
|
import org.jetbrains.kotlin.konan.library.konanCommonLibraryPath
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -17,7 +17,7 @@ object LiteKonanDistributionProvider {
|
|||||||
|
|
||||||
return LiteKonanDistribution(
|
return LiteKonanDistribution(
|
||||||
konanHomeDir,
|
konanHomeDir,
|
||||||
KonanVersion.fromString(stdlib.compilerVersion),
|
CompilerVersion.fromString(stdlib.compilerVersion),
|
||||||
stdlib.compilerVersion
|
stdlib.compilerVersion
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.konan.library.lite
|
package org.jetbrains.kotlin.konan.library.lite
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.Assert.*
|
import org.junit.Assert.*
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ class LiteKonanDistributionTests {
|
|||||||
private companion object {
|
private companion object {
|
||||||
const val expectedVersionString = "1.2.3-release-5678"
|
const val expectedVersionString = "1.2.3-release-5678"
|
||||||
|
|
||||||
val expectedVersion: KonanVersion
|
val expectedVersion: CompilerVersion
|
||||||
get() = KonanVersion.fromString(expectedVersionString)
|
get() = CompilerVersion.fromString(expectedVersionString)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.KOTLIN_NATIVE_HOME
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.KOTLIN_NATIVE_HOME
|
||||||
import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
|
import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.jetbrains.kotlin.konan.target.HostManager
|
import org.jetbrains.kotlin.konan.target.HostManager
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
||||||
@@ -43,9 +43,9 @@ internal val Project.konanHome: String
|
|||||||
file(it).absolutePath
|
file(it).absolutePath
|
||||||
} ?: NativeCompilerDownloader(project).compilerDirectory.absolutePath
|
} ?: NativeCompilerDownloader(project).compilerDirectory.absolutePath
|
||||||
|
|
||||||
internal val Project.konanVersion: KonanVersion
|
internal val Project.konanVersion: CompilerVersion
|
||||||
get() = PropertiesProvider(this).nativeVersion?.let {
|
get() = PropertiesProvider(this).nativeVersion?.let {
|
||||||
KonanVersion.fromString(it.toString())
|
CompilerVersion.fromString(it.toString())
|
||||||
} ?: NativeCompilerDownloader.DEFAULT_KONAN_VERSION
|
} ?: NativeCompilerDownloader.DEFAULT_KONAN_VERSION
|
||||||
|
|
||||||
internal val Project.disableKonanDaemon: Boolean
|
internal val Project.disableKonanDaemon: Boolean
|
||||||
|
|||||||
+4
-7
@@ -6,18 +6,15 @@
|
|||||||
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
|
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
|
||||||
package org.jetbrains.kotlin.gradle.utils
|
package org.jetbrains.kotlin.gradle.utils
|
||||||
|
|
||||||
import org.gradle.api.Action
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.artifacts.repositories.ArtifactRepository
|
import org.gradle.api.artifacts.repositories.ArtifactRepository
|
||||||
import org.gradle.api.artifacts.repositories.IvyArtifactRepository
|
|
||||||
import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout
|
|
||||||
import org.gradle.api.file.FileTree
|
import org.gradle.api.file.FileTree
|
||||||
import org.gradle.api.logging.Logger
|
import org.gradle.api.logging.Logger
|
||||||
import org.jetbrains.kotlin.compilerRunner.KonanCompilerRunner
|
import org.jetbrains.kotlin.compilerRunner.KonanCompilerRunner
|
||||||
import org.jetbrains.kotlin.compilerRunner.konanVersion
|
import org.jetbrains.kotlin.compilerRunner.konanVersion
|
||||||
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.jetbrains.kotlin.konan.MetaVersion
|
import org.jetbrains.kotlin.konan.MetaVersion
|
||||||
import org.jetbrains.kotlin.konan.target.HostManager
|
import org.jetbrains.kotlin.konan.target.HostManager
|
||||||
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
||||||
@@ -25,12 +22,12 @@ import java.io.File
|
|||||||
|
|
||||||
class NativeCompilerDownloader(
|
class NativeCompilerDownloader(
|
||||||
val project: Project,
|
val project: Project,
|
||||||
private val compilerVersion: KonanVersion = project.konanVersion
|
private val compilerVersion: CompilerVersion = project.konanVersion
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
internal val DEFAULT_KONAN_VERSION: KonanVersion by lazy {
|
internal val DEFAULT_KONAN_VERSION: CompilerVersion by lazy {
|
||||||
KonanVersion.fromString(loadPropertyFromResources("project.properties", "kotlin.native.version"))
|
CompilerVersion.fromString(loadPropertyFromResources("project.properties", "kotlin.native.version"))
|
||||||
}
|
}
|
||||||
|
|
||||||
private const val BASE_DOWNLOAD_URL = "https://download.jetbrains.com/kotlin/native/builds"
|
private const val BASE_DOWNLOAD_URL = "https://download.jetbrains.com/kotlin/native/builds"
|
||||||
|
|||||||
+2
-3
@@ -18,8 +18,7 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSetti
|
|||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.internal.parseKotlinNativeStackTraceAsJvm
|
import org.jetbrains.kotlin.gradle.targets.native.internal.parseKotlinNativeStackTraceAsJvm
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinTest
|
import org.jetbrains.kotlin.gradle.tasks.KotlinTest
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.jetbrains.kotlin.konan.MetaVersion
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.concurrent.Callable
|
import java.util.concurrent.Callable
|
||||||
|
|
||||||
@@ -101,7 +100,7 @@ open class KotlinNativeTest : KotlinTest() {
|
|||||||
// KonanVersion doesn't provide an API to compare versions,
|
// KonanVersion doesn't provide an API to compare versions,
|
||||||
// so we have to transform it to KotlinVersion first.
|
// so we have to transform it to KotlinVersion first.
|
||||||
// Note: this check doesn't take into account the meta version (release, eap, dev).
|
// Note: this check doesn't take into account the meta version (release, eap, dev).
|
||||||
private fun KonanVersion.isAtLeast(major: Int, minor: Int, patch: Int): Boolean =
|
private fun CompilerVersion.isAtLeast(major: Int, minor: Int, patch: Int): Boolean =
|
||||||
KotlinVersion(this.major, this.minor, this.maintenance).isAtLeast(major, minor, patch)
|
KotlinVersion(this.major, this.minor, this.maintenance).isAtLeast(major, minor, patch)
|
||||||
|
|
||||||
override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec {
|
override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec {
|
||||||
|
|||||||
Reference in New Issue
Block a user