From 8f18c43f56fd5003d5bd481fde8e782ecb8fef66 Mon Sep 17 00:00:00 2001 From: ForteScarlet Date: Thu, 20 Mar 2025 22:45:05 +0800 Subject: [PATCH 1/3] Update Kotlin to v2.1.20 --- buildSrc/src/main/kotlin/IProject.kt | 2 +- .../fir/SuspendTransformFirTransformer.kt | 87 ++++++++++++------- .../ir/SuspendTransformTransformer.kt | 25 ++++-- .../runners/AbstractTestRunner.kt | 38 ++++---- gradle/libs.versions.toml | 2 +- 5 files changed, 93 insertions(+), 61 deletions(-) diff --git a/buildSrc/src/main/kotlin/IProject.kt b/buildSrc/src/main/kotlin/IProject.kt index 2546c67..d969090 100644 --- a/buildSrc/src/main/kotlin/IProject.kt +++ b/buildSrc/src/main/kotlin/IProject.kt @@ -10,7 +10,7 @@ object IProject : ProjectDetail() { const val HOMEPAGE = "https://github.com/ForteScarlet/kotlin-suspend-transform-compiler-plugin" // Remember the libs.versions.toml! - val ktVersion = "2.1.0" + val ktVersion = "2.1.20" val pluginVersion = "0.11.1" override val version: String = "$ktVersion-$pluginVersion" diff --git a/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/fir/SuspendTransformFirTransformer.kt b/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/fir/SuspendTransformFirTransformer.kt index f479e4b..b44cbf7 100644 --- a/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/fir/SuspendTransformFirTransformer.kt +++ b/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/fir/SuspendTransformFirTransformer.kt @@ -195,11 +195,13 @@ class SuspendTransformFirTransformer( } private fun List.mapToNewValueParameters( - originalTypeParameterCache: MutableList + originalTypeParameterCache: MutableList, + newContainingDeclarationSymbol: FirBasedSymbol<*> ): List { return map { vp -> buildValueParameterCopy(vp) { symbol = FirValueParameterSymbol(vp.symbol.name) + containingDeclarationSymbol = newContainingDeclarationSymbol val copiedConeType = vp.returnTypeRef.coneTypeOrNull ?.copyWithTypeParameters(originalTypeParameterCache) @@ -211,11 +213,16 @@ class SuspendTransformFirTransformer( } } - private fun FirReceiverParameter.copyToNew(originalTypeParameterCache: MutableList): FirReceiverParameter? { + private fun FirReceiverParameter.copyToNew( + originalTypeParameterCache: MutableList, + newContainingDeclarationSymbol: FirBasedSymbol<*> + ): FirReceiverParameter? { return typeRef.coneTypeOrNull ?.copyWithTypeParameters(originalTypeParameterCache) ?.let { foundCopied -> buildReceiverParameterCopy(this) { + symbol = FirReceiverParameterSymbol() + containingDeclarationSymbol = newContainingDeclarationSymbol typeRef = typeRef.withReplacedConeType(foundCopied) } } @@ -231,17 +238,28 @@ class SuspendTransformFirTransformer( } private fun FirSimpleFunctionBuilder.copyParameters() { + val newFunSymbol = symbol val originalTypeParameterCache = mutableListOf() - val newTypeParameters = typeParameters.mapToNewTypeParameters(symbol, originalTypeParameterCache) + val newTypeParameters = typeParameters.mapToNewTypeParameters(newFunSymbol, originalTypeParameterCache) typeParameters.clear() typeParameters.addAll(newTypeParameters) - val newValueParameters = valueParameters.mapToNewValueParameters(originalTypeParameterCache) + val newContextParameters = contextParameters.mapToNewValueParameters( + originalTypeParameterCache, + newFunSymbol, + ) + contextParameters.clear() + contextParameters.addAll(newContextParameters) + + val newValueParameters = valueParameters.mapToNewValueParameters( + originalTypeParameterCache, + newFunSymbol + ) valueParameters.clear() valueParameters.addAll(newValueParameters) - receiverParameter?.copyToNew(originalTypeParameterCache)?.also { + receiverParameter?.copyToNew(originalTypeParameterCache, newFunSymbol)?.also { this.receiverParameter = it } @@ -254,13 +272,18 @@ class SuspendTransformFirTransformer( private fun FirPropertyAccessorBuilder.copyParameters( originalTypeParameterCache: MutableList = mutableListOf(), - copyReturnType: Boolean = true + copyReturnType: Boolean = true, + newFunSymbol: FirBasedSymbol<*>, ) { - val newTypeParameters = typeParameters.mapToNewTypeParameters(symbol, originalTypeParameterCache) - typeParameters.clear() - typeParameters.addAll(newTypeParameters) - - val newValueParameters = valueParameters.mapToNewValueParameters(originalTypeParameterCache) + // 的确,property 哪儿来的 type parameter +// val newTypeParameters = typeParameters.mapToNewTypeParameters(symbol, originalTypeParameterCache) +// typeParameters.clear() +// typeParameters.addAll(newTypeParameters) + + val newValueParameters = valueParameters.mapToNewValueParameters( + originalTypeParameterCache, + newFunSymbol + ) valueParameters.clear() valueParameters.addAll(newValueParameters) @@ -303,10 +326,12 @@ class SuspendTransformFirTransformer( originFunc: FirSimpleFunction, originFunSymbol: FirNamedFunctionSymbol, owner: FirClassSymbol<*>, - thisContextReceivers: MutableList, +// thisContextReceivers: MutableList, + thisContextParameters: List, thisReceiverParameter: FirReceiverParameter?, newFunSymbol: FirBasedSymbol<*>, - thisValueParameters: MutableList, +// newFunSymbol: FirNamedFunctionSymbol, + thisValueParameters: List, bridgeFunSymbol: FirNamedFunctionSymbol, newFunTarget: FirFunctionTarget, transformer: Transformer @@ -347,13 +372,13 @@ class SuspendTransformFirTransformer( } } - this.contextReceiverArguments.addAll(thisContextReceivers.map { receiver -> + this.contextArguments.addAll(thisContextParameters.map { receiver -> buildThisReceiverExpression { - coneTypeOrNull = receiver.typeRef.coneTypeOrNull + coneTypeOrNull = receiver.returnTypeRef.coneTypeOrNull source = receiver.source calleeReference = buildExplicitThisReference { source = receiver.source - labelName = receiver.labelName?.asString() + // labelName = receiver.labelName?.asString() } } }) @@ -364,7 +389,8 @@ class SuspendTransformFirTransformer( coneTypeOrNull = thisReceiverParameter.typeRef.coneTypeOrNull source = thisReceiverParameter.source calleeReference = buildImplicitThisReference { - boundSymbol = newFunSymbol + boundSymbol = thisReceiverParameter.symbol + println("[${newFunSymbol}] thisReceiverParameter.symbol: ${thisReceiverParameter.symbol}") } } } @@ -596,7 +622,7 @@ class SuspendTransformFirTransformer( returnTypeRef = resolveReturnType(funData.transformer, returnTypeRef) val thisReceiverParameter = this.receiverParameter - val thisContextReceivers = this.contextReceivers + val thisContextParameters = this.contextParameters val thisValueParameters = this.valueParameters annotations.clear() @@ -606,7 +632,7 @@ class SuspendTransformFirTransformer( originFunc, originFunSymbol, owner, - thisContextReceivers, + thisContextParameters, thisReceiverParameter, newFunSymbol, thisValueParameters, @@ -713,7 +739,8 @@ class SuspendTransformFirTransformer( deprecationsProvider = UnresolvedDeprecationProvider //original.deprecationsProvider containerSource = original.containerSource dispatchReceiverType = original.dispatchReceiverType - contextReceivers.addAll(original.contextReceivers) + contextParameters.addAll(original.contextParameters) +// contextReceivers.addAll(original.contextReceivers) // annotations annotations.addAll(propertyAnnotations) typeParameters.addAll(original.typeParameters) @@ -745,19 +772,19 @@ class SuspendTransformFirTransformer( ) valueParameters.addAll(original.valueParameters) - typeParameters.addAll(original.typeParameters) - contextReceivers.addAll(original.contextReceivers) +// typeParameters.addAll(original.typeParameters) +// contextReceivers.addAll(original.contextReceivers) - copyParameters(originalTypeParameterCache, false) + copyParameters(originalTypeParameterCache, false, propertyAccessorSymbol) - val thisContextReceivers = this.contextReceivers +// val thisContextReceivers = this.contextReceivers val thisValueParameters = this.valueParameters body = generateSyntheticFunctionBody( original, originalFunSymbol, owner, - thisContextReceivers, + emptyList(), null, propertyAccessorSymbol, thisValueParameters, @@ -991,7 +1018,6 @@ class SuspendTransformFirTransformer( transformer: Transformer, returnTypeRef: FirTypeRef ): ConeKotlinType { - val transformer = transformer val returnType = transformer.transformReturnType ?: return returnTypeRef.coneType // OrNull // original.symbol.resolvedReturnType @@ -1370,12 +1396,13 @@ class SuspendTransformFirTransformer( typeArguments = typeArguments, nullable = isMarkedNullable ) - // typeArguments.forEach { projection -> - // projection.type?.copyWithTypeParameters(parameters) - // } } - return null + if (isPrimitiveType()) { + return this + } + + return classId?.createConeType(session = session, nullable = isMarkedNullable) } is ConeTypeParameterType -> { diff --git a/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/ir/SuspendTransformTransformer.kt b/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/ir/SuspendTransformTransformer.kt index c03aa9d..19f8a18 100644 --- a/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/ir/SuspendTransformTransformer.kt +++ b/compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/ir/SuspendTransformTransformer.kt @@ -22,11 +22,10 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionExpressionImpl import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol -import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.util.file -import org.jetbrains.kotlin.ir.util.isAnnotationWithEqualFqName -import org.jetbrains.kotlin.ir.util.kotlinFqName -import org.jetbrains.kotlin.ir.util.primaryConstructor +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.defaultType +import org.jetbrains.kotlin.ir.types.typeWith +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.wasm.ir.source.location.SourceLocation @@ -43,7 +42,8 @@ class SuspendTransformTransformer( // TODO What should be used in K2? private val reporter = kotlin.runCatching { // error: "This API is not supported for K2" - pluginContext.createDiagnosticReporter(PLUGIN_REPORT_ID) + pluginContext.messageCollector +// pluginContext.createDiagnosticReporter(PLUGIN_REPORT_ID) }.getOrNull() @@ -344,14 +344,14 @@ private fun IrFunction.reportLocation(): CompilerMessageSourceLocation? { return when (val sourceLocation = // getSourceLocation(runCatching { fileEntry }.getOrNull())) { getSourceLocation(declaration = symbol, file = file)) { - is SourceLocation.Location -> { + + is SourceLocation.WithFileAndLineNumberInformation -> CompilerMessageLocation.create( path = sourceLocation.file, line = sourceLocation.line, column = sourceLocation.column, lineContent = null ) - } else -> null } @@ -460,7 +460,14 @@ private fun generateTransformBodyForFunctionLambda( for (index in 1..ownerValueParameters.lastIndex) { val valueParameter = ownerValueParameters[index] val type = valueParameter.type - tryResolveCoroutineScopeValueParameter(type, context, function, transformFunctionOwner, this@irBlockBody, index) + tryResolveCoroutineScopeValueParameter( + type, + context, + function, + transformFunctionOwner, + this@irBlockBody, + index + ) } } diff --git a/compiler/suspend-transform-plugin/src/test/love/forte/plugin/suspendtrans/runners/AbstractTestRunner.kt b/compiler/suspend-transform-plugin/src/test/love/forte/plugin/suspendtrans/runners/AbstractTestRunner.kt index 9eebecd..ae18f7e 100644 --- a/compiler/suspend-transform-plugin/src/test/love/forte/plugin/suspendtrans/runners/AbstractTestRunner.kt +++ b/compiler/suspend-transform-plugin/src/test/love/forte/plugin/suspendtrans/runners/AbstractTestRunner.kt @@ -1,26 +1,21 @@ package love.forte.plugin.suspendtrans.runners import love.forte.plugin.suspendtrans.services.SuspendTransformerEnvironmentConfigurator -import org.jetbrains.kotlin.config.ApiVersion -import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.configureFirHandlersStep import org.jetbrains.kotlin.test.builders.configureJvmArtifactsHandlersStep +import org.jetbrains.kotlin.test.configuration.commonConfigurationForTest import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.FIR_PARSER import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade import org.jetbrains.kotlin.test.frontend.fir.Fir2IrResultsConverter import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade import org.jetbrains.kotlin.test.initIdeaConfiguration -import org.jetbrains.kotlin.test.model.ArtifactKinds -import org.jetbrains.kotlin.test.model.DependencyKind -import org.jetbrains.kotlin.test.model.FrontendKind -import org.jetbrains.kotlin.test.model.FrontendKinds +import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest -import org.jetbrains.kotlin.test.runners.codegen.commonConfigurationForTest import org.jetbrains.kotlin.test.services.EnvironmentBasedStandardLibrariesPathProvider import org.jetbrains.kotlin.test.services.KotlinStandardLibrariesPathProvider import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator @@ -36,32 +31,35 @@ abstract class AbstractTestRunner : AbstractKotlinCompilerTest() { } } - override fun TestConfigurationBuilder.configuration() { + override fun configure(builder: TestConfigurationBuilder) { val targetFrontend: FrontendKind<*> = FrontendKinds.FIR - globalDefaults { + builder.globalDefaults { frontend = targetFrontend targetBackend = TargetBackend.JVM_IR targetPlatform = JvmPlatforms.defaultJvmPlatform artifactKind = ArtifactKinds.Jvm dependencyKind = DependencyKind.Source - languageSettings { - languageVersion = LanguageVersion.KOTLIN_2_1 - apiVersion = ApiVersion.KOTLIN_2_1 - } + backendKind = BackendKinds.IrBackendForK1AndK2 +// this.languageVersionSettings + +// languageSettings { +// languageVersion = LanguageVersion.KOTLIN_2_1 +// apiVersion = ApiVersion.KOTLIN_2_1 +// } // languageSettings { // languageVersion = LanguageVersion.KOTLIN_1_9 // apiVersion = ApiVersion.KOTLIN_1_9 // } } - defaultDirectives { + builder.defaultDirectives { FIR_PARSER with FirParser.LightTree } when (targetFrontend) { FrontendKinds.ClassicFrontend -> { - commonConfigurationForTest( + builder.commonConfigurationForTest( FrontendKinds.ClassicFrontend, ::ClassicFrontendFacade, ::ClassicFrontend2IrConverter, @@ -69,7 +67,7 @@ abstract class AbstractTestRunner : AbstractKotlinCompilerTest() { ) // { } } FrontendKinds.FIR -> { - commonConfigurationForTest( + builder.commonConfigurationForTest( FrontendKinds.FIR, ::FirFrontendFacade, ::Fir2IrResultsConverter, @@ -85,15 +83,15 @@ abstract class AbstractTestRunner : AbstractKotlinCompilerTest() { // ::JvmIrBackendFacade // ) { } - configureHandlers() - configureFirHandlersStep { + builder.configureHandlers() + builder.configureFirHandlersStep { } - configureJvmArtifactsHandlersStep { + builder.configureJvmArtifactsHandlersStep { } - useConfigurators( + builder.useConfigurators( ::CommonEnvironmentConfigurator, // compiler flags ::JvmEnvironmentConfigurator, // jdk and kotlin runtime configuration (e.g. FULL_JDK) ::SuspendTransformerEnvironmentConfigurator, // compiler plugin configuration diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c68c0c1..d011c27 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ kotlinx-coroutines = "1.8.0" kotlinx-serialization = "1.7.1" google-auto-service = "1.0.1" # Remember the `IProject.ktVersion`! -kotlin = "2.1.0" +kotlin = "2.1.20" [libraries] From bc615314ae95fed92a900c4964ca85bca913ffae Mon Sep 17 00:00:00 2001 From: ForteScarlet Date: Thu, 20 Mar 2025 23:45:07 +0800 Subject: [PATCH 2/3] GitHub pr test CI --- .github/workflows/publish-release.yml | 9 ++-- .github/workflows/test-branch.yml | 59 +++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/test-branch.yml diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 8d5face..18a1161 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -17,6 +17,7 @@ env: IS_CI: true SIMBOT_LOCAL: false GRADLE_OPTS: "-Dfile.encoding=UTF-8" + GRADLE_VERSION: 8.10.2 jobs: test: @@ -34,7 +35,7 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 with: - gradle-version: 8.5 + gradle-version: ${{ env.GRADLE_VERSION }} - run: gradle assemble build -s publish: @@ -53,7 +54,7 @@ jobs: - name: Test and publish to sonatype uses: gradle/actions/setup-gradle@v3 with: - gradle-version: 8.5 + gradle-version: ${{ env.GRADLE_VERSION }} arguments: publishToSonatype closeAndReleaseStagingRepositories @@ -86,7 +87,7 @@ jobs: - name: Publish to gradle uses: gradle/actions/setup-gradle@v3 with: - gradle-version: 8.5 + gradle-version: ${{ env.GRADLE_VERSION }} arguments: | build publishPlugins @@ -117,7 +118,7 @@ jobs: - name: Create changelog uses: gradle/actions/setup-gradle@v3 with: - gradle-version: 8.5 + gradle-version: ${{ env.GRADLE_VERSION }} arguments: createChangelog # https://github.com/softprops/action-gh-release diff --git a/.github/workflows/test-branch.yml b/.github/workflows/test-branch.yml new file mode 100644 index 0000000..da42c8d --- /dev/null +++ b/.github/workflows/test-branch.yml @@ -0,0 +1,59 @@ +name: Test Branch +on: + pull_request: + branches: + - 'dev' + paths: + - '**.java' + - '**.kt' + - '**.kts' + - '*/src/*/kotlin/**' + - '*/src/*/java/**' + - '*/src/*/resource/**' + - 'gradle/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + IS_CI: true + GRADLE_OPTS: "-Dfile.encoding=UTF-8" + GRADLE_VERSION: 8.10.2 + +jobs: + build-test: + name: Build and test + strategy: + matrix: + os: [ macos-latest, windows-latest, ubuntu-latest ] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 11 + cache: 'gradle' + + - name: Run All Tests + uses: gradle/actions/setup-gradle@v3 + with: + gradle-version: ${{ env.GRADLE_VERSION }} + arguments: | + assemble + build + allTests + --info + --warning-mode all +# --build-cache +# -Porg.gradle.daemon=false +# -Porg.gradle.jvmargs="-Xmx4g -Xms2g -XX:MaxMetaspaceSize=1g -Dfile.encoding=UTF-8" + + - name: Upload test reports + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: test-reports-${{ matrix.os }} + path: '**/build/reports/tests' + retention-days: 7 From 171ab343a5f30fce54af8fb12b66acbcfa24b9d1 Mon Sep 17 00:00:00 2001 From: ForteScarlet Date: Thu, 20 Mar 2025 23:46:30 +0800 Subject: [PATCH 3/3] GitHub pr test CI --- .github/workflows/test-branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-branch.yml b/.github/workflows/test-branch.yml index da42c8d..7cbf82d 100644 --- a/.github/workflows/test-branch.yml +++ b/.github/workflows/test-branch.yml @@ -43,7 +43,7 @@ jobs: arguments: | assemble build - allTests + test --info --warning-mode all # --build-cache