diff --git a/symbol-processing-aa-embeddable/build.gradle.kts b/symbol-processing-aa-embeddable/build.gradle.kts index bc6b13960d..0311dc3a49 100644 --- a/symbol-processing-aa-embeddable/build.gradle.kts +++ b/symbol-processing-aa-embeddable/build.gradle.kts @@ -4,7 +4,6 @@ import java.util.zip.ZipFile evaluationDependsOn(":kotlin-analysis-api") -val kotlinBaseVersion: String by project val signingKey: String? by project val signingPassword: String? by project @@ -68,6 +67,7 @@ tasks.withType { relocate(f, t) } mergeServiceFiles() + exclude("META-INF/compiler.version") // All bundled dependencies should be renamed. doLast { @@ -203,3 +203,30 @@ signing { useInMemoryPgpKeys(signingKey, signingPassword) sign(extensions.getByType().publications) } + +abstract class WriteVersionSrcTask @Inject constructor( + @get:Input val kotlinVersion: String, + @get:OutputDirectory val outputResDir: File +) : DefaultTask() { + @TaskAction + fun generate() { + val metaInfDir = File(outputResDir, "META-INF") + metaInfDir.mkdirs() + File(metaInfDir, "ksp.compiler.version").writeText(kotlinVersion) + } +} + +val kspVersionDir = File(project.buildDir, "generated/ksp-versions/META-INF") +val writeVersionSrcTask = tasks.register( + "generateKSPVersions", + aaKotlinBaseVersion, + kspVersionDir +) + +kotlin { + sourceSets { + main { + resources.srcDir(writeVersionSrcTask.map { it.outputResDir }) + } + } +} diff --git a/symbol-processing-aa-embeddable/src/main/java/org/jetbrains/kotlin/config/KotlinCompilerVersion.java b/symbol-processing-aa-embeddable/src/main/java/org/jetbrains/kotlin/config/KotlinCompilerVersion.java new file mode 100644 index 0000000000..5dc7125207 --- /dev/null +++ b/symbol-processing-aa-embeddable/src/main/java/org/jetbrains/kotlin/config/KotlinCompilerVersion.java @@ -0,0 +1,62 @@ +/* + * Copyright 2010-2020 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.config; + +import org.jetbrains.annotations.Nullable; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class KotlinCompilerVersion { + public static final String VERSION_FILE_PATH = "/META-INF/ksp.compiler.version"; + public static final String VERSION; + + // True if the latest stable language version supported by this compiler has not yet been released. + // Binaries produced by this compiler with that language version (or any future language version) are going to be marked + // as "pre-release" and will not be loaded by release versions of the compiler. + // Change this value before and after every major release + private static final boolean IS_PRE_RELEASE = true; + + public static final String TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY = "kotlin.test.is.pre.release"; + + public static boolean isPreRelease() { + String overridden = System.getProperty(TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY); + if (overridden != null) { + return Boolean.parseBoolean(overridden); + } + + return IS_PRE_RELEASE; + } + + /** + * @return version of this compiler, or `null` if it isn't known (if VERSION is "@snapshot@") + */ + @Nullable + public static String getVersion() { + return VERSION.equals("@snapshot@") ? null : VERSION; + } + + @SuppressWarnings({"TryFinallyCanBeTryWithResources", "ConstantConditions"}) + private static String loadKotlinCompilerVersion() throws IOException { + BufferedReader versionReader = new BufferedReader( + new InputStreamReader(KotlinCompilerVersion.class.getResourceAsStream(VERSION_FILE_PATH))); + try { + return versionReader.readLine(); + } finally { + versionReader.close(); + } + } + + static { + try { + VERSION = loadKotlinCompilerVersion(); + } + catch (IOException e) { + throw new IllegalStateException("Failed to read compiler version from " + VERSION_FILE_PATH); + } + } +}