From 03ebfd2278e9e8f051ce7f2786fb9a33efd2dbeb Mon Sep 17 00:00:00 2001 From: Him188 Date: Tue, 10 Aug 2021 04:20:08 +0800 Subject: [PATCH] Migrate to Kotlin 1.5.30 --- backend/codegen/build.gradle.kts | 12 +- backend/mirai-console/build.gradle.kts | 10 +- backend/mirai-console/src/util/Annotations.kt | 3 +- .../mirai-console/test/TestMiraiConosle.kt | 7 +- build.gradle.kts | 3 +- buildSrc/src/main/kotlin/Versions.kt | 135 ++++++++++++++---- docs/FrontEnd.md | 2 +- .../main/kotlin/MiraiConsoleGradlePlugin.kt | 9 +- .../src/main/kotlin/VersionConstants.kt | 4 +- .../creator/steps/PluginCoordinatesStep.kt | 6 +- 10 files changed, 134 insertions(+), 57 deletions(-) diff --git a/backend/codegen/build.gradle.kts b/backend/codegen/build.gradle.kts index 070dea7fe..a54931df1 100644 --- a/backend/codegen/build.gradle.kts +++ b/backend/codegen/build.gradle.kts @@ -16,13 +16,13 @@ plugins { kotlin { sourceSets { all { - languageSettings.useExperimentalAnnotation("kotlin.Experimental") - languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn") + languageSettings.optIn("kotlin.Experimental") + languageSettings.optIn("kotlin.RequiresOptIn") languageSettings.progressiveMode = true - languageSettings.useExperimentalAnnotation("net.mamoe.mirai.utils.MiraiInternalAPI") - languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes") - languageSettings.useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference") - languageSettings.useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts") + languageSettings.optIn("net.mamoe.mirai.utils.MiraiInternalAPI") + languageSettings.optIn("kotlin.ExperimentalUnsignedTypes") + languageSettings.optIn("kotlin.experimental.ExperimentalTypeInference") + languageSettings.optIn("kotlin.contracts.ExperimentalContracts") } } } diff --git a/backend/mirai-console/build.gradle.kts b/backend/mirai-console/build.gradle.kts index 3db66cf0f..d256b2850 100644 --- a/backend/mirai-console/build.gradle.kts +++ b/backend/mirai-console/build.gradle.kts @@ -32,15 +32,15 @@ dependencies { compileAndTestRuntime(`mirai-core-utils`) compileAndTestRuntime(`kotlin-stdlib-jdk8`) - compileAndTestRuntime(`kotlinx-atomicfu`) - compileAndTestRuntime(`kotlinx-coroutines-core`) - compileAndTestRuntime(`kotlinx-serialization-core`) - compileAndTestRuntime(`kotlinx-serialization-json`) + compileAndTestRuntime(`kotlinx-atomicfu-jvm`) + compileAndTestRuntime(`kotlinx-coroutines-core-jvm`) + compileAndTestRuntime(`kotlinx-serialization-core-jvm`) + compileAndTestRuntime(`kotlinx-serialization-json-jvm`) compileAndTestRuntime(`kotlin-reflect`) implementation(project(":mirai-console-compiler-annotations")) - smartImplementation(yamlkt) + smartImplementation(`yamlkt-jvm`) smartImplementation(`jetbrains-annotations`) smartImplementation(`caller-finder`) smartApi(`kotlinx-coroutines-jdk8`) diff --git a/backend/mirai-console/src/util/Annotations.kt b/backend/mirai-console/src/util/Annotations.kt index cfed9582e..39ae250c5 100644 --- a/backend/mirai-console/src/util/Annotations.kt +++ b/backend/mirai-console/src/util/Annotations.kt @@ -17,9 +17,8 @@ import kotlin.annotation.AnnotationTarget.* /** * 表明这个 API 是为了让 Java 使用者调用更方便. Kotlin 使用者不应该使用这些 API. */ -@Retention(AnnotationRetention.SOURCE) @RequiresOptIn(level = RequiresOptIn.Level.ERROR) -@Target(PROPERTY, FUNCTION, TYPE, CLASS) +@Target(PROPERTY, FUNCTION, CLASS) internal annotation class JavaFriendlyApi /** diff --git a/backend/mirai-console/test/TestMiraiConosle.kt b/backend/mirai-console/test/TestMiraiConosle.kt index 5e7fa50ce..4eafd89aa 100644 --- a/backend/mirai-console/test/TestMiraiConosle.kt +++ b/backend/mirai-console/test/TestMiraiConosle.kt @@ -16,12 +16,14 @@ import net.mamoe.mirai.console.data.MemoryPluginDataStorage import net.mamoe.mirai.console.data.PluginDataStorage import net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader import net.mamoe.mirai.console.plugin.loader.PluginLoader -import net.mamoe.mirai.console.util.ConsoleExperimentalApi import net.mamoe.mirai.console.util.ConsoleInput import net.mamoe.mirai.console.util.ConsoleInternalApi import net.mamoe.mirai.console.util.SemVersion import net.mamoe.mirai.message.data.Message -import net.mamoe.mirai.utils.* +import net.mamoe.mirai.utils.BotConfiguration +import net.mamoe.mirai.utils.LoginSolver +import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.PlatformLogger import java.nio.file.Path import kotlin.coroutines.Continuation import kotlin.coroutines.CoroutineContext @@ -34,7 +36,6 @@ fun initTestEnvironment() { object : MiraiConsoleImplementation { override val rootPath: Path = createTempDirectory() - @ConsoleExperimentalApi override val frontEndDescription: MiraiConsoleFrontEndDescription get() = object : MiraiConsoleFrontEndDescription { override val name: String diff --git a/build.gradle.kts b/build.gradle.kts index 1a178eec4..8f2b8787a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -162,10 +162,9 @@ fun Project.configureKotlinExperimentalUsages() { val sourceSets = kotlinSourceSets ?: return for (target in sourceSets) target.languageSettings.run { - enableLanguageFeature("InlineClasses") progressiveMode = true experimentalAnnotations.forEach { a -> - useExperimentalAnnotation(a) + optIn(a) } } } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 990c2f208..a7c810f98 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -7,64 +7,137 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ -@file:Suppress("MemberVisibilityCanBePrivate", "ObjectPropertyName", "unused") + +@file:Suppress("ObjectPropertyName", "ObjectPropertyName", "unused", "MemberVisibilityCanBePrivate") import org.gradle.api.attributes.Attribute +import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler object Versions { - const val core = "2.6.4-dev-kt15" // WARNING: This might not be up-to-date since included in mirai build. - const val console = "2.6.4-dev-kt15" - const val consoleGraphical = "0.0.7" - const val consoleTerminal = console + const val project = "2.8.0-M1" - const val kotlinCompiler = "1.5.10" - const val kotlinStdlib = "1.5.10" + const val core = "2.7.0" + const val console = project + const val consoleTerminal = project - const val kotlinIntellijPlugin = "211-1.5.20-release-284-IJ7442.40" // keep to newest as kotlinCompiler - const val intellij = "2021.1.1" // don't update easily unless you want your disk space -= 500MB + const val kotlinCompiler = "1.5.30" + const val kotlinStdlib = "1.5.30" + const val dokka = "1.4.32" - - const val coroutines = "1.5.0" - const val atomicFU = "0.16.1" - const val serialization = "1.2.1" + const val coroutines = "1.5.1" + const val atomicFU = "0.16.3" + const val serialization = "1.2.2" const val ktor = "1.5.4" - const val androidGradle = "3.6.2" + const val binaryValidator = "0.4.0" - const val blockingBridge = "1.10.3" + const val io = "0.1.16" + const val coroutinesIo = "0.1.16" - const val junit = "5.4.2" + const val blockingBridge = "1.10.6-1530.2" - @Suppress("SpellCheckingInspection") - const val yamlkt = "0.10.0" + const val androidGradlePlugin = "4.1.1" + const val android = "4.1.1.4" + const val shadow = "6.1.0" + + const val logback = "1.2.5" + const val slf4j = "1.7.32" + const val log4j = "2.14.1" + const val asm = "9.1" + const val difflib = "1.3.0" + const val netty = "4.1.63.Final" + const val bouncycastle = "1.64" + + const val junit = "5.7.2" + + // If you the versions below, you need to sync changes to mirai-console/buildSrc/src/main/kotlin/Versions.kt + + const val yamlkt = "0.10.2" const val intellijGradlePlugin = "1.1" + const val kotlinIntellijPlugin = "211-1.5.20-release-284-IJ7442.40" // keep to newest as kotlinCompiler + const val intellij = "2021.1.3" // don't update easily unless you want your disk space -= 500MB + } +@Suppress("unused") +fun kotlinx(id: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$id:$version" + +@Suppress("unused") +fun ktor(id: String, version: String = Versions.ktor) = "io.ktor:ktor-$id:$version" + + +// Why using `-jvm`? +// All target platforms are JVM. Root modules like 'coroutines-core' will be resolved to 'coroutines-common' for commonMain, +// which make IDE code analysis not working. + +val `kotlinx-coroutines-core-jvm` = kotlinx("coroutines-core-jvm", Versions.coroutines) +val `kotlinx-coroutines-jdk8` = kotlinx("coroutines-jdk8", Versions.coroutines) +val `kotlinx-coroutines-swing` = kotlinx("coroutines-swing", Versions.coroutines) +val `kotlinx-coroutines-debug` = kotlinx("coroutines-debug", Versions.coroutines) +val `kotlinx-serialization-core-jvm` = kotlinx("serialization-core-jvm", Versions.serialization) +val `kotlinx-serialization-json-jvm` = kotlinx("serialization-json-jvm", Versions.serialization) +val `kotlinx-serialization-protobuf-jvm` = kotlinx("serialization-protobuf-jvm", Versions.serialization) +const val `kotlinx-atomicfu-jvm` = "org.jetbrains.kotlinx:atomicfu-jvm:${Versions.atomicFU}" +val `kotlinx-io-jvm` = kotlinx("io-jvm", Versions.io) + +fun KotlinDependencyHandler.implementationKotlinxIoJvm() { + implementation(`kotlinx-io-jvm`) { + /* + | +--- org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16 + | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.60 -> 1.5.30 (*) + | | +--- org.jetbrains.kotlinx:atomicfu:0.14.1 + | | +--- org.jetbrains.kotlinx:atomicfu-common:0.14.1 + | | \--- org.jetbrains.kotlinx:kotlinx-io:0.1.16 + | | \--- org.jetbrains.kotlinx:atomicfu-common:0.14.1 + */ + exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-common") + exclude("org.jetbrains.kotlinx", "atomicfu") + exclude("org.jetbrains.kotlinx", "atomicfu-common") + } +} + +val `kotlinx-coroutines-io-jvm` = kotlinx("coroutines-io-jvm", Versions.coroutinesIo) + +val `ktor-serialization` = ktor("serialization", Versions.ktor) + +val `ktor-client-core-jvm` = ktor("client-core-jvm", Versions.ktor) +val `ktor-client-cio-jvm` = ktor("client-cio-jvm", Versions.ktor) +val `ktor-client-okhttp` = ktor("client-okhttp", Versions.ktor) +val `ktor-client-android` = ktor("client-android", Versions.ktor) +val `ktor-client-logging-jvm` = ktor("client-logging-jvm", Versions.ktor) +val `ktor-network-jvm` = ktor("network-jvm", Versions.ktor) +val `ktor-client-serialization-jvm` = ktor("client-serialization-jvm", Versions.ktor) + +const val `logback-classic` = "ch.qos.logback:logback-classic:" + Versions.logback + +const val `slf4j-api` = "org.slf4j:slf4j-api:" + Versions.slf4j +const val `slf4j-simple` = "org.slf4j:slf4j-simple:" + Versions.slf4j + +const val `log4j-api` = "org.apache.logging.log4j:log4j-api:" + Versions.log4j +const val `log4j-core` = "org.apache.logging.log4j:log4j-core:" + Versions.log4j +const val `log4j-slf4j-impl` = "org.apache.logging.log4j:log4j-slf4j-impl:" + Versions.log4j +const val `log4j-to-slf4j` = "org.apache.logging.log4j:log4j-to-slf4j:" + Versions.log4j + +val ATTRIBUTE_MIRAI_TARGET_PLATFORM: Attribute = Attribute.of("mirai.target.platform", String::class.java) + + const val `kotlin-compiler` = "org.jetbrains.kotlin:kotlin-compiler:${Versions.kotlinCompiler}" -const val `kotlin-stdlib` = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlinStdlib}" const val `kotlin-stdlib-jdk8` = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlinStdlib}" const val `kotlin-reflect` = "org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlinStdlib}" const val `kotlin-test` = "org.jetbrains.kotlin:kotlin-test:${Versions.kotlinStdlib}" const val `kotlin-test-junit5` = "org.jetbrains.kotlin:kotlin-test-junit5:${Versions.kotlinStdlib}" -const val `kotlinx-coroutines-core` = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutines}" -const val `kotlinx-coroutines-jdk8` = "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:${Versions.coroutines}" -const val `kotlinx-coroutines-swing` = "org.jetbrains.kotlinx:kotlinx-coroutines-swing:${Versions.coroutines}" -const val `kotlinx-serialization-core` = "org.jetbrains.kotlinx:kotlinx-serialization-core:${Versions.serialization}" -const val `kotlinx-serialization-json` = "org.jetbrains.kotlinx:kotlinx-serialization-json:${Versions.serialization}" -const val `kotlinx-serialization-protobuf` = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:${Versions.serialization}" - -const val `kotlinx-atomicfu` = "org.jetbrains.kotlinx:atomicfu:${Versions.atomicFU}" - -const val yamlkt = "net.mamoe.yamlkt:yamlkt:${Versions.yamlkt}" +const val `yamlkt-jvm` = "net.mamoe.yamlkt:yamlkt:${Versions.yamlkt}" const val `jetbrains-annotations` = "org.jetbrains:annotations:19.0.0" const val `caller-finder` = "io.github.karlatemp:caller:1.1.1" - -val ATTRIBUTE_MIRAI_TARGET_PLATFORM: Attribute = Attribute.of("mirai.target.platform", String::class.java) \ No newline at end of file +const val `android-runtime` = "com.google.android:android:${Versions.android}" +const val `netty-all` = "io.netty:netty-all:${Versions.netty}" +const val `bouncycastle` = "org.bouncycastle:bcprov-jdk15on:${Versions.bouncycastle}" \ No newline at end of file diff --git a/docs/FrontEnd.md b/docs/FrontEnd.md index e665a39f8..51bc20208 100644 --- a/docs/FrontEnd.md +++ b/docs/FrontEnd.md @@ -11,7 +11,7 @@ Mirai Console 前端开发文档。 在 `build.gradle` 或 `build.gradle.kts` 添加: ```kotlin kotlin.sourceSets.all { - languageSettings.useExperimentalAnnotation("net.mamoe.mirai.console.ConsoleFrontEndImplementation") + languageSettings.optIn("net.mamoe.mirai.console.ConsoleFrontEndImplementation") } ``` diff --git a/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt b/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt index 77e927ad7..5690f99f9 100644 --- a/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt +++ b/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt @@ -31,7 +31,12 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTarget public class MiraiConsoleGradlePlugin : Plugin { private fun KotlinSourceSet.configureSourceSet(project: Project, target: KotlinTarget) { - languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn") + try { + @Suppress("DEPRECATION") // user may use 1.4 + languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn") + } catch (e: NoSuchMethodError) { + languageSettings.optIn("kotlin.RequiresOptIn") + } dependencies { configureDependencies(project, this@configureSourceSet, target) } } @@ -81,6 +86,8 @@ public class MiraiConsoleGradlePlugin : Plugin { if (isJvm) { when (miraiExtension.useTestConsoleFrontEnd) { MiraiConsoleFrontEndKind.TERMINAL -> api("net.mamoe:mirai-console-terminal:${miraiExtension.consoleVersion}") + null -> { + } } } } diff --git a/tools/gradle-plugin/src/main/kotlin/VersionConstants.kt b/tools/gradle-plugin/src/main/kotlin/VersionConstants.kt index 917ef6cdb..61a055aff 100644 --- a/tools/gradle-plugin/src/main/kotlin/VersionConstants.kt +++ b/tools/gradle-plugin/src/main/kotlin/VersionConstants.kt @@ -10,6 +10,6 @@ package net.mamoe.mirai.console.gradle internal object VersionConstants { - const val CONSOLE_VERSION = "2.7.0" // value is written here automatically during build - const val CORE_VERSION = "2.7.0" // value is written here automatically during build + const val CONSOLE_VERSION = "2.8.0-M1" // value is written here automatically during build + const val CORE_VERSION = "2.8.0-M1" // value is written here automatically during build } \ No newline at end of file diff --git a/tools/intellij-plugin/src/creator/steps/PluginCoordinatesStep.kt b/tools/intellij-plugin/src/creator/steps/PluginCoordinatesStep.kt index 0e801bf13..0462ef0bd 100644 --- a/tools/intellij-plugin/src/creator/steps/PluginCoordinatesStep.kt +++ b/tools/intellij-plugin/src/creator/steps/PluginCoordinatesStep.kt @@ -11,10 +11,7 @@ package net.mamoe.mirai.console.intellij.creator.steps import com.intellij.ide.util.projectWizard.ModuleWizardStep -import kotlinx.coroutines.CoroutineName -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import net.mamoe.mirai.console.compiler.common.CheckerConstants.PLUGIN_ID_PATTERN import net.mamoe.mirai.console.intellij.creator.MiraiProjectModel import net.mamoe.mirai.console.intellij.creator.MiraiVersionKind @@ -90,6 +87,7 @@ class PluginCoordinatesStep( } } + @OptIn(DelicateCoroutinesApi::class) private fun updateVersionItems() { GlobalScope.launch(Dispatchers.Main + CoroutineName("updateVersionItems")) { if (!model.availableMiraiVersionsOrFail.isCompleted) return@launch