Skip to content

Commit 5b3175b

Browse files
authored
Merge pull request #93 from ForteScarlet/improve-cli-options
Refactor and update Gradle plugin APIs and configurations
2 parents 5763a14 + 3a61fac commit 5b3175b

File tree

52 files changed

+3675
-2183
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+3675
-2183
lines changed

README.md

+668-340
Large diffs are not rendered by default.

README_CN.md

+503-496
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* 为了让 gradle 插件可以在 buildSrc 之类的地方使用。
3+
*/
4+
fun org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension.configGradleBuildSrcFriendly() {
5+
coreLibrariesVersion = "1.9.0"
6+
compilerOptions {
7+
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_1_9)
8+
languageVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_1_9)
9+
}
10+
}

buildSrc/src/main/kotlin/IProject.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ object IProject : ProjectDetail() {
1111

1212
// Remember the libs.versions.toml!
1313
val ktVersion = "2.1.20"
14-
val pluginVersion = "0.11.1"
14+
val pluginVersion = "0.12.0"
1515

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

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# CliOption Module
2+
3+
TODO:将 CliOption 相关的内容独立出来,
4+
以避免在 Gradle Plugin 中传递引用 Kotlin compiler。
5+
6+
see also:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2+
3+
plugins {
4+
kotlin("jvm")
5+
kotlin("plugin.serialization")
6+
// id("com.github.gmazzo.buildconfig")
7+
id("suspend-transform.jvm-maven-publish")
8+
}
9+
10+
dependencies {
11+
compileOnly(kotlin("stdlib"))
12+
compileOnly(kotlin("compiler"))
13+
api(project(":compiler:suspend-transform-plugin-configuration"))
14+
api(libs.kotlinx.serialization.core)
15+
api(libs.kotlinx.serialization.protobuf)
16+
17+
testImplementation(libs.kotlinx.serialization.json)
18+
testImplementation(kotlin("test"))
19+
testImplementation(kotlin("compiler"))
20+
// testImplementation(libs.kotlinx.coroutines.core)
21+
}
22+
23+
kotlin {
24+
configGradleBuildSrcFriendly()
25+
compilerOptions {
26+
jvmTarget.set(JvmTarget.JVM_1_8)
27+
freeCompilerArgs.addAll("-Xjvm-default=all")
28+
}
29+
}
30+
31+
tasks.test {
32+
useJUnitPlatform()
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package love.forte.plugin.suspendtrans.cli
2+
3+
import kotlinx.serialization.ExperimentalSerializationApi
4+
import kotlinx.serialization.decodeFromHexString
5+
import kotlinx.serialization.encodeToHexString
6+
import kotlinx.serialization.protobuf.ProtoBuf
7+
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration
8+
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration.Companion.serializer
9+
10+
// Cli Options for gradle plugin
11+
12+
@OptIn(ExperimentalSerializationApi::class)
13+
private val SERIALIZER = ProtoBuf {
14+
encodeDefaults = true
15+
}
16+
17+
@OptIn(ExperimentalSerializationApi::class)
18+
fun SuspendTransformConfiguration.encodeToHex(): String {
19+
return SERIALIZER.encodeToHexString(serializer(), this)
20+
}
21+
22+
@OptIn(ExperimentalSerializationApi::class)
23+
fun decodeSuspendTransformConfigurationFromHex(hex: String): SuspendTransformConfiguration {
24+
return SERIALIZER.decodeFromHexString(serializer(), hex)
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package love.forte.plugin.suspendtrans.cli
2+
3+
// Cli Options for Kotlin compiler plugin
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package love.forte.plugin.suspendtrans.cli
2+
3+
import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption
4+
5+
/**
6+
*
7+
*
8+
* @author ForteScarlet
9+
*/
10+
interface SuspendTransformCliOption {
11+
val optionName: String
12+
val valueDescription: String
13+
val description: String
14+
val required: Boolean
15+
val allowMultipleOccurrences: Boolean
16+
}
17+
18+
private data class SimpleSuspendTransformCliOption(
19+
override val allowMultipleOccurrences: Boolean,
20+
override val description: String,
21+
override val optionName: String,
22+
override val required: Boolean,
23+
override val valueDescription: String
24+
) : SuspendTransformCliOption
25+
26+
private data class AbstractCliOptionImpl(
27+
override val allowMultipleOccurrences: Boolean,
28+
override val description: String,
29+
override val optionName: String,
30+
override val required: Boolean,
31+
override val valueDescription: String
32+
) : AbstractCliOption, SuspendTransformCliOption
33+
34+
/**
35+
* Creates an instance of [SuspendTransformCliOption] to describe and define a CLI option.
36+
*
37+
* @param optionName The name of the option used to identify it in the CLI.
38+
* @param valueDescription A description of the option's value, defaults to the option name.
39+
* @param description A textual description of the option, defaults to an empty string.
40+
* @param required Whether this option is mandatory, defaults to not required (`false`).
41+
* @param allowMultipleOccurrences Whether this option can appear multiple times in the CLI,
42+
* defaults to not allowed (`false`).
43+
* @return Returns an instance of [SuspendTransformCliOption] implemented by [SimpleSuspendTransformCliOption].
44+
*/
45+
fun SuspendTransformCliOption(
46+
optionName: String,
47+
valueDescription: String = optionName,
48+
description: String = "",
49+
required: Boolean = false,
50+
allowMultipleOccurrences: Boolean = false
51+
): SuspendTransformCliOption {
52+
// Create and return an instance of the concrete implementation class
53+
return SimpleSuspendTransformCliOption(
54+
allowMultipleOccurrences = allowMultipleOccurrences,
55+
description = description,
56+
optionName = optionName,
57+
required = required,
58+
valueDescription = valueDescription
59+
)
60+
}
61+
62+
/**
63+
* Converts the current [SuspendTransformCliOption] instance to an [AbstractCliOption].
64+
* If the current object is already an [AbstractCliOption], it is returned directly;
65+
* otherwise, a new instance is created and returned.
66+
*
67+
* @return The converted [AbstractCliOption] instance
68+
*/
69+
fun SuspendTransformCliOption.toAbstractCliOption(): AbstractCliOption {
70+
return this as? AbstractCliOption ?: AbstractCliOptionImpl(
71+
allowMultipleOccurrences = allowMultipleOccurrences,
72+
description = description,
73+
optionName = optionName,
74+
required = required,
75+
valueDescription = valueDescription
76+
)
77+
}
78+
79+
80+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package love.forte.plugin.suspendtrans.cli
2+
3+
object SuspendTransformCliOptions {
4+
const val CONFIGURATION = "configuration"
5+
6+
val CLI_CONFIGURATION = SuspendTransformCliOption(
7+
optionName = "configuration",
8+
valueDescription = "Configuration hex string",
9+
description = "Configuration serialized protobuf hex string value",
10+
required = true,
11+
allowMultipleOccurrences = false,
12+
)
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package love.forte.plugin.suspendtrans.cli
2+
3+
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConfigurationApi
4+
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration
5+
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jsPromiseTransformer
6+
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jvmAsyncTransformer
7+
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jvmBlockingTransformer
8+
import love.forte.plugin.suspendtrans.configuration.TargetPlatform
9+
import kotlin.test.Test
10+
import kotlin.test.assertEquals
11+
12+
/**
13+
*
14+
* @author ForteScarlet
15+
*/
16+
class ConfigurationSerializeTests {
17+
@OptIn(InternalSuspendTransformConfigurationApi::class)
18+
@Test
19+
fun testDecode() {
20+
assertEquals(
21+
"",
22+
SuspendTransformConfiguration(emptyMap()).encodeToHex()
23+
)
24+
25+
val config = SuspendTransformConfiguration(
26+
transformers = mapOf(
27+
TargetPlatform.JVM to listOf(jvmBlockingTransformer, jvmAsyncTransformer),
28+
TargetPlatform.JS to listOf(jsPromiseTransformer),
29+
)
30+
)
31+
32+
val hex = config.encodeToHex()
33+
34+
assertEquals(
35+
"0aa807080112bd030a680a3c0a296c6f76652e666f7274652e706c7567696e2e" +
36+
"73757370656e647472616e732e616e6e6f746174696f6e120b4a766d426c6f63" +
37+
"6b696e67180020001208626173654e616d651a06737566666978220a61735072" +
38+
"6f70657274792a08426c6f636b696e67300012390a266c6f76652e666f727465" +
39+
"2e706c7567696e2e73757370656e647472616e732e72756e74696d65120f2472" +
40+
"756e496e426c6f636b696e672420002a240a1e0a0a6b6f746c696e2e6a766d12" +
41+
"0c4a766d53796e7468657469631800200010001800323c0a360a296c6f76652e" +
42+
"666f7274652e706c7567696e2e73757370656e647472616e732e616e6e6f7461" +
43+
"74696f6e1205417069344a18002000100018013801421e0a0a6b6f746c696e2e" +
44+
"6a766d120c4a766d53796e74686574696318002000423c0a296c6f76652e666f" +
45+
"7274652e706c7567696e2e73757370656e647472616e732e616e6e6f74617469" +
46+
"6f6e120b4a766d426c6f636b696e671800200042390a296c6f76652e666f7274" +
47+
"652e706c7567696e2e73757370656e647472616e732e616e6e6f746174696f6e" +
48+
"12084a766d4173796e631800200042130a066b6f746c696e12054f7074496e18" +
49+
"002000480012e3030a620a390a296c6f76652e666f7274652e706c7567696e2e" +
50+
"73757370656e647472616e732e616e6e6f746174696f6e12084a766d4173796e" +
51+
"63180020001208626173654e616d651a06737566666978220a617350726f7065" +
52+
"7274792a054173796e63300012360a266c6f76652e666f7274652e706c756769" +
53+
"6e2e73757370656e647472616e732e72756e74696d65120c2472756e496e4173" +
54+
"796e63241a2d0a146a6176612e7574696c2e636f6e63757272656e741211436f" +
55+
"6d706c657461626c654675747572651800200020012a240a1e0a0a6b6f746c69" +
56+
"6e2e6a766d120c4a766d53796e7468657469631800200010001800323c0a360a" +
57+
"296c6f76652e666f7274652e706c7567696e2e73757370656e647472616e732e" +
58+
"616e6e6f746174696f6e1205417069344a18002000100018013801421e0a0a6b" +
59+
"6f746c696e2e6a766d120c4a766d53796e74686574696318002000423c0a296c" +
60+
"6f76652e666f7274652e706c7567696e2e73757370656e647472616e732e616e" +
61+
"6e6f746174696f6e120b4a766d426c6f636b696e671800200042390a296c6f76" +
62+
"652e666f7274652e706c7567696e2e73757370656e647472616e732e616e6e6f" +
63+
"746174696f6e12084a766d4173796e631800200042130a066b6f746c696e1205" +
64+
"4f7074496e1800200048000ad202080212cd020a630a3a0a296c6f76652e666f" +
65+
"7274652e706c7567696e2e73757370656e647472616e732e616e6e6f74617469" +
66+
"6f6e12094a7350726f6d697365180020001208626173654e616d651a06737566" +
67+
"666978220a617350726f70657274792a054173796e63300012360a266c6f7665" +
68+
"2e666f7274652e706c7567696e2e73757370656e647472616e732e72756e7469" +
69+
"6d65120c2472756e496e4173796e63241a180a096b6f746c696e2e6a73120750" +
70+
"726f6d697365180020002001323d0a370a296c6f76652e666f7274652e706c75" +
71+
"67696e2e73757370656e647472616e732e616e6e6f746174696f6e1206417069" +
72+
"344a7318002000100018013801423a0a296c6f76652e666f7274652e706c7567" +
73+
"696e2e73757370656e647472616e732e616e6e6f746174696f6e12094a735072" +
74+
"6f6d6973651800200042130a066b6f746c696e12054f7074496e180020004800",
75+
hex
76+
)
77+
78+
assertEquals(
79+
config,
80+
decodeSuspendTransformConfigurationFromHex(hex)
81+
)
82+
}
83+
84+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2+
3+
plugins {
4+
kotlin("jvm")
5+
kotlin("plugin.serialization")
6+
// id("com.github.gmazzo.buildconfig")
7+
id("suspend-transform.jvm-maven-publish")
8+
}
9+
10+
dependencies {
11+
api(libs.kotlinx.serialization.core)
12+
// api(libs.kotlinx.serialization.protobuf)
13+
14+
testImplementation(kotlin("test"))
15+
}
16+
17+
kotlin {
18+
configGradleBuildSrcFriendly()
19+
compilerOptions {
20+
jvmTarget.set(JvmTarget.JVM_1_8)
21+
freeCompilerArgs.addAll("-Xjvm-default=all",)
22+
}
23+
24+
}
25+
26+
tasks.test {
27+
useJUnitPlatform()
28+
}
29+
30+
repositories {
31+
maven {
32+
url = uri("https://oss.sonatype.org/content/repositories/snapshots/")
33+
mavenContent {
34+
snapshotsOnly()
35+
}
36+
}
37+
}
38+

0 commit comments

Comments
 (0)