Skip to content

Refactor and update Gradle plugin APIs and configurations #93

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 21 commits into from
Apr 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6a95c9b
Add README for suspend-transform-plugin-cli
ForteScarlet Apr 10, 2025
c60594b
new Gradle providers API
ForteScarlet Apr 11, 2025
3ce1577
improve: new Gradle plugin API
ForteScarlet Apr 11, 2025
75e1d99
切换使用新的Configuration并废弃旧的
ForteScarlet Apr 14, 2025
ce3774f
Refactor and deprecate legacy Gradle extension support
ForteScarlet Apr 14, 2025
caa480f
Refactor suspend transform configuration and tests
ForteScarlet Apr 15, 2025
fda2fdd
Where's my `.asm.txt` and `.fir.ir.txt` files?
ForteScarlet Apr 15, 2025
7dfdf74
Deprecated level to WARNING
ForteScarlet Apr 16, 2025
adf2998
Update README
ForteScarlet Apr 16, 2025
3519add
调整 TransformersContainer 内部实现
ForteScarlet Apr 16, 2025
d52b9f5
调整 TransformersContainer 内部实现
ForteScarlet Apr 16, 2025
354066e
调整 TransformersContainer 内部实现,增加部分重载函数
ForteScarlet Apr 16, 2025
83cfcb3
remove test modules
ForteScarlet Apr 16, 2025
b6c2ebd
疑似修复了某些情况下不生成合成函数或属性的问题
ForteScarlet Apr 18, 2025
c8edc3e
WARN log prefix
ForteScarlet Apr 18, 2025
e43c10e
Make the Gradle plugin buildSrc friendly
ForteScarlet Apr 19, 2025
8d3cdee
Improve the Gradle plugin's API and configuration's API.
ForteScarlet Apr 19, 2025
207a3aa
Improve the Gradle plugin's API and configuration's API.
ForteScarlet Apr 19, 2025
ce6db38
Hidden the test modules and improve something
ForteScarlet Apr 19, 2025
a387786
Fix encode test
ForteScarlet Apr 19, 2025
3a61fac
Add factory implementations for transformer and spec creation
ForteScarlet Apr 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,008 changes: 668 additions & 340 deletions README.md

Large diffs are not rendered by default.

999 changes: 503 additions & 496 deletions README_CN.md

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions buildSrc/src/main/kotlin/GradleSupportHelper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/**
* 为了让 gradle 插件可以在 buildSrc 之类的地方使用。
*/
fun org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension.configGradleBuildSrcFriendly() {
coreLibrariesVersion = "1.9.0"
compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_1_9)
languageVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_1_9)
}
}
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/IProject.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ object IProject : ProjectDetail() {

// Remember the libs.versions.toml!
val ktVersion = "2.1.20"
val pluginVersion = "0.11.1"
val pluginVersion = "0.12.0"

override val version: String = "$ktVersion-$pluginVersion"

Expand Down
6 changes: 6 additions & 0 deletions compiler/suspend-transform-plugin-cli/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# CliOption Module

TODO:将 CliOption 相关的内容独立出来,
以避免在 Gradle Plugin 中传递引用 Kotlin compiler。

see also:
33 changes: 33 additions & 0 deletions compiler/suspend-transform-plugin-cli/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
kotlin("jvm")
kotlin("plugin.serialization")
// id("com.github.gmazzo.buildconfig")
id("suspend-transform.jvm-maven-publish")
}

dependencies {
compileOnly(kotlin("stdlib"))
compileOnly(kotlin("compiler"))
api(project(":compiler:suspend-transform-plugin-configuration"))
api(libs.kotlinx.serialization.core)
api(libs.kotlinx.serialization.protobuf)

testImplementation(libs.kotlinx.serialization.json)
testImplementation(kotlin("test"))
testImplementation(kotlin("compiler"))
// testImplementation(libs.kotlinx.coroutines.core)
}

kotlin {
configGradleBuildSrcFriendly()
compilerOptions {
jvmTarget.set(JvmTarget.JVM_1_8)
freeCompilerArgs.addAll("-Xjvm-default=all")
}
}

tasks.test {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package love.forte.plugin.suspendtrans.cli

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.decodeFromHexString
import kotlinx.serialization.encodeToHexString
import kotlinx.serialization.protobuf.ProtoBuf
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration.Companion.serializer

// Cli Options for gradle plugin

@OptIn(ExperimentalSerializationApi::class)
private val SERIALIZER = ProtoBuf {
encodeDefaults = true
}

@OptIn(ExperimentalSerializationApi::class)
fun SuspendTransformConfiguration.encodeToHex(): String {
return SERIALIZER.encodeToHexString(serializer(), this)
}

@OptIn(ExperimentalSerializationApi::class)
fun decodeSuspendTransformConfigurationFromHex(hex: String): SuspendTransformConfiguration {
return SERIALIZER.decodeFromHexString(serializer(), hex)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package love.forte.plugin.suspendtrans.cli

// Cli Options for Kotlin compiler plugin
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package love.forte.plugin.suspendtrans.cli

import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption

/**
*
*
* @author ForteScarlet
*/
interface SuspendTransformCliOption {
val optionName: String
val valueDescription: String
val description: String
val required: Boolean
val allowMultipleOccurrences: Boolean
}

private data class SimpleSuspendTransformCliOption(
override val allowMultipleOccurrences: Boolean,
override val description: String,
override val optionName: String,
override val required: Boolean,
override val valueDescription: String
) : SuspendTransformCliOption

private data class AbstractCliOptionImpl(
override val allowMultipleOccurrences: Boolean,
override val description: String,
override val optionName: String,
override val required: Boolean,
override val valueDescription: String
) : AbstractCliOption, SuspendTransformCliOption

/**
* Creates an instance of [SuspendTransformCliOption] to describe and define a CLI option.
*
* @param optionName The name of the option used to identify it in the CLI.
* @param valueDescription A description of the option's value, defaults to the option name.
* @param description A textual description of the option, defaults to an empty string.
* @param required Whether this option is mandatory, defaults to not required (`false`).
* @param allowMultipleOccurrences Whether this option can appear multiple times in the CLI,
* defaults to not allowed (`false`).
* @return Returns an instance of [SuspendTransformCliOption] implemented by [SimpleSuspendTransformCliOption].
*/
fun SuspendTransformCliOption(
optionName: String,
valueDescription: String = optionName,
description: String = "",
required: Boolean = false,
allowMultipleOccurrences: Boolean = false
): SuspendTransformCliOption {
// Create and return an instance of the concrete implementation class
return SimpleSuspendTransformCliOption(
allowMultipleOccurrences = allowMultipleOccurrences,
description = description,
optionName = optionName,
required = required,
valueDescription = valueDescription
)
}

/**
* Converts the current [SuspendTransformCliOption] instance to an [AbstractCliOption].
* If the current object is already an [AbstractCliOption], it is returned directly;
* otherwise, a new instance is created and returned.
*
* @return The converted [AbstractCliOption] instance
*/
fun SuspendTransformCliOption.toAbstractCliOption(): AbstractCliOption {
return this as? AbstractCliOption ?: AbstractCliOptionImpl(
allowMultipleOccurrences = allowMultipleOccurrences,
description = description,
optionName = optionName,
required = required,
valueDescription = valueDescription
)
}



Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package love.forte.plugin.suspendtrans.cli

object SuspendTransformCliOptions {
const val CONFIGURATION = "configuration"

val CLI_CONFIGURATION = SuspendTransformCliOption(
optionName = "configuration",
valueDescription = "Configuration hex string",
description = "Configuration serialized protobuf hex string value",
required = true,
allowMultipleOccurrences = false,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package love.forte.plugin.suspendtrans.cli

import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConfigurationApi
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jsPromiseTransformer
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jvmAsyncTransformer
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jvmBlockingTransformer
import love.forte.plugin.suspendtrans.configuration.TargetPlatform
import kotlin.test.Test
import kotlin.test.assertEquals

/**
*
* @author ForteScarlet
*/
class ConfigurationSerializeTests {
@OptIn(InternalSuspendTransformConfigurationApi::class)
@Test
fun testDecode() {
assertEquals(
"",
SuspendTransformConfiguration(emptyMap()).encodeToHex()
)

val config = SuspendTransformConfiguration(
transformers = mapOf(
TargetPlatform.JVM to listOf(jvmBlockingTransformer, jvmAsyncTransformer),
TargetPlatform.JS to listOf(jsPromiseTransformer),
)
)

val hex = config.encodeToHex()

assertEquals(
"0aa807080112bd030a680a3c0a296c6f76652e666f7274652e706c7567696e2e" +
"73757370656e647472616e732e616e6e6f746174696f6e120b4a766d426c6f63" +
"6b696e67180020001208626173654e616d651a06737566666978220a61735072" +
"6f70657274792a08426c6f636b696e67300012390a266c6f76652e666f727465" +
"2e706c7567696e2e73757370656e647472616e732e72756e74696d65120f2472" +
"756e496e426c6f636b696e672420002a240a1e0a0a6b6f746c696e2e6a766d12" +
"0c4a766d53796e7468657469631800200010001800323c0a360a296c6f76652e" +
"666f7274652e706c7567696e2e73757370656e647472616e732e616e6e6f7461" +
"74696f6e1205417069344a18002000100018013801421e0a0a6b6f746c696e2e" +
"6a766d120c4a766d53796e74686574696318002000423c0a296c6f76652e666f" +
"7274652e706c7567696e2e73757370656e647472616e732e616e6e6f74617469" +
"6f6e120b4a766d426c6f636b696e671800200042390a296c6f76652e666f7274" +
"652e706c7567696e2e73757370656e647472616e732e616e6e6f746174696f6e" +
"12084a766d4173796e631800200042130a066b6f746c696e12054f7074496e18" +
"002000480012e3030a620a390a296c6f76652e666f7274652e706c7567696e2e" +
"73757370656e647472616e732e616e6e6f746174696f6e12084a766d4173796e" +
"63180020001208626173654e616d651a06737566666978220a617350726f7065" +
"7274792a054173796e63300012360a266c6f76652e666f7274652e706c756769" +
"6e2e73757370656e647472616e732e72756e74696d65120c2472756e496e4173" +
"796e63241a2d0a146a6176612e7574696c2e636f6e63757272656e741211436f" +
"6d706c657461626c654675747572651800200020012a240a1e0a0a6b6f746c69" +
"6e2e6a766d120c4a766d53796e7468657469631800200010001800323c0a360a" +
"296c6f76652e666f7274652e706c7567696e2e73757370656e647472616e732e" +
"616e6e6f746174696f6e1205417069344a18002000100018013801421e0a0a6b" +
"6f746c696e2e6a766d120c4a766d53796e74686574696318002000423c0a296c" +
"6f76652e666f7274652e706c7567696e2e73757370656e647472616e732e616e" +
"6e6f746174696f6e120b4a766d426c6f636b696e671800200042390a296c6f76" +
"652e666f7274652e706c7567696e2e73757370656e647472616e732e616e6e6f" +
"746174696f6e12084a766d4173796e631800200042130a066b6f746c696e1205" +
"4f7074496e1800200048000ad202080212cd020a630a3a0a296c6f76652e666f" +
"7274652e706c7567696e2e73757370656e647472616e732e616e6e6f74617469" +
"6f6e12094a7350726f6d697365180020001208626173654e616d651a06737566" +
"666978220a617350726f70657274792a054173796e63300012360a266c6f7665" +
"2e666f7274652e706c7567696e2e73757370656e647472616e732e72756e7469" +
"6d65120c2472756e496e4173796e63241a180a096b6f746c696e2e6a73120750" +
"726f6d697365180020002001323d0a370a296c6f76652e666f7274652e706c75" +
"67696e2e73757370656e647472616e732e616e6e6f746174696f6e1206417069" +
"344a7318002000100018013801423a0a296c6f76652e666f7274652e706c7567" +
"696e2e73757370656e647472616e732e616e6e6f746174696f6e12094a735072" +
"6f6d6973651800200042130a066b6f746c696e12054f7074496e180020004800",
hex
)

assertEquals(
config,
decodeSuspendTransformConfigurationFromHex(hex)
)
}

}
38 changes: 38 additions & 0 deletions compiler/suspend-transform-plugin-configuration/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
kotlin("jvm")
kotlin("plugin.serialization")
// id("com.github.gmazzo.buildconfig")
id("suspend-transform.jvm-maven-publish")
}

dependencies {
api(libs.kotlinx.serialization.core)
// api(libs.kotlinx.serialization.protobuf)

testImplementation(kotlin("test"))
}

kotlin {
configGradleBuildSrcFriendly()
compilerOptions {
jvmTarget.set(JvmTarget.JVM_1_8)
freeCompilerArgs.addAll("-Xjvm-default=all",)
}

}

tasks.test {
useJUnitPlatform()
}

repositories {
maven {
url = uri("https://oss.sonatype.org/content/repositories/snapshots/")
mavenContent {
snapshotsOnly()
}
}
}

Loading
Loading