Skip to content

Commit 8d3cdee

Browse files
committed
Improve the Gradle plugin's API and configuration's API.
1 parent e43c10e commit 8d3cdee

File tree

7 files changed

+72
-46
lines changed

7 files changed

+72
-46
lines changed

compiler/suspend-transform-plugin-cli/src/test/kotlin/love/forte/plugin/suspendtrans/cli/ConfigurationSerializeTests.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package love.forte.plugin.suspendtrans.cli
22

3-
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConstructorApi
3+
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConfigurationApi
44
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration
55
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jsPromiseTransformer
66
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jvmAsyncTransformer
@@ -14,13 +14,12 @@ import kotlin.test.assertEquals
1414
* @author ForteScarlet
1515
*/
1616
class ConfigurationSerializeTests {
17-
@OptIn(InternalSuspendTransformConstructorApi::class)
17+
@OptIn(InternalSuspendTransformConfigurationApi::class)
1818
@Test
1919
fun testDecode() {
20-
assertEquals("0801", SuspendTransformConfiguration(true, emptyMap()).encodeToHex())
20+
assertEquals("0801", SuspendTransformConfiguration(emptyMap()).encodeToHex())
2121

2222
val config = SuspendTransformConfiguration(
23-
enabled = true,
2423
transformers = mapOf(
2524
TargetPlatform.JVM to listOf(jvmBlockingTransformer, jvmAsyncTransformer),
2625
TargetPlatform.JS to listOf(jsPromiseTransformer),

compiler/suspend-transform-plugin-configuration/src/main/kotlin/love/forte/plugin/suspendtrans/configuration/SuspendTransformConfiguration.kt

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import kotlinx.serialization.Serializable
77
// 虽然序列化行为是内部的,但是还是应该尽可能避免出现字段的顺序错乱或删改。
88

99
@RequiresOptIn(
10-
"This is an internal suspend transform config api. " +
10+
"This is an internal suspend transform configuration's api. " +
1111
"It may be changed in the future without notice.", RequiresOptIn.Level.ERROR
1212
)
13-
annotation class InternalSuspendTransformConstructorApi
13+
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR)
14+
annotation class InternalSuspendTransformConfigurationApi
1415

1516
@Serializable
16-
class FunctionInfo @InternalSuspendTransformConstructorApi constructor(
17+
class FunctionInfo @InternalSuspendTransformConfigurationApi constructor(
1718
val packageName: String,
1819
val functionName: String
1920
) {
@@ -39,7 +40,7 @@ class FunctionInfo @InternalSuspendTransformConstructorApi constructor(
3940
}
4041

4142
@Serializable
42-
class ClassInfo @InternalSuspendTransformConstructorApi constructor(
43+
class ClassInfo @InternalSuspendTransformConfigurationApi constructor(
4344
val packageName: String,
4445
val className: String,
4546
val local: Boolean = false,
@@ -79,7 +80,7 @@ enum class TargetPlatform {
7980
* 用于标记的注解信息.
8081
*/
8182
@Serializable
82-
class MarkAnnotation @InternalSuspendTransformConstructorApi constructor(
83+
class MarkAnnotation @InternalSuspendTransformConfigurationApi constructor(
8384
/**
8485
* 注解类信息
8586
*/
@@ -135,7 +136,7 @@ class MarkAnnotation @InternalSuspendTransformConstructorApi constructor(
135136
}
136137

137138
@Serializable
138-
class IncludeAnnotation @InternalSuspendTransformConstructorApi constructor(
139+
class IncludeAnnotation @InternalSuspendTransformConfigurationApi constructor(
139140
val classInfo: ClassInfo,
140141
val repeatable: Boolean = false,
141142
/**
@@ -169,7 +170,7 @@ class IncludeAnnotation @InternalSuspendTransformConstructorApi constructor(
169170
}
170171

171172
@Serializable
172-
class Transformer @InternalSuspendTransformConstructorApi constructor(
173+
class Transformer @InternalSuspendTransformConfigurationApi constructor(
173174
/**
174175
* 函数上的某种标记。
175176
*/
@@ -280,38 +281,40 @@ class Transformer @InternalSuspendTransformConstructorApi constructor(
280281
* 可序列化的配置信息。
281282
*/
282283
@Serializable
283-
class SuspendTransformConfiguration @InternalSuspendTransformConstructorApi constructor(
284-
val enabled: Boolean,
284+
class SuspendTransformConfiguration @InternalSuspendTransformConfigurationApi constructor(
285+
/**
286+
* The transformers.
287+
*
288+
* Note: This `Map` cannot be empty.
289+
* The `List` values cannot be empty.
290+
*/
285291
val transformers: Map<TargetPlatform, List<Transformer>>
286292
) {
293+
294+
override fun toString(): String {
295+
return "SuspendTransformConfiguration(transformers=$transformers)"
296+
}
297+
287298
override fun equals(other: Any?): Boolean {
288299
if (this === other) return true
289300
if (other !is SuspendTransformConfiguration) return false
290301

291-
if (enabled != other.enabled) return false
292302
if (transformers != other.transformers) return false
293303

294304
return true
295305
}
296306

297307
override fun hashCode(): Int {
298-
var result = enabled.hashCode()
299-
result = 31 * result + transformers.hashCode()
300-
return result
301-
}
302-
303-
override fun toString(): String {
304-
return "SuspendTransformConfiguration(enabled=$enabled, transformers=$transformers)"
308+
return transformers.hashCode()
305309
}
306310
}
307311

308312
/**
309313
* Merge both
310314
*/
311-
@InternalSuspendTransformConstructorApi
315+
@InternalSuspendTransformConfigurationApi
312316
operator fun SuspendTransformConfiguration.plus(other: SuspendTransformConfiguration): SuspendTransformConfiguration {
313317
return SuspendTransformConfiguration(
314-
enabled = enabled && other.enabled,
315318
transformers = transformers.toMutableMap().apply {
316319
other.transformers.forEach { (platform, transformers) ->
317320
compute(platform) { _, old ->
@@ -325,7 +328,7 @@ operator fun SuspendTransformConfiguration.plus(other: SuspendTransformConfigura
325328
/**
326329
* Some constants for configuration.
327330
*/
328-
@OptIn(InternalSuspendTransformConstructorApi::class)
331+
@OptIn(InternalSuspendTransformConfigurationApi::class)
329332
object SuspendTransformConfigurations {
330333
private const val KOTLIN = "kotlin"
331334
private const val KOTLIN_JVM = "kotlin.jvm"

compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/SuspendTransformCommandLineProcessor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import BuildConfig
44
import love.forte.plugin.suspendtrans.cli.SuspendTransformCliOptions
55
import love.forte.plugin.suspendtrans.cli.decodeSuspendTransformConfigurationFromHex
66
import love.forte.plugin.suspendtrans.cli.toAbstractCliOption
7-
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConstructorApi
7+
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConfigurationApi
88
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration
99
import love.forte.plugin.suspendtrans.configuration.plus
1010
import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption
@@ -25,7 +25,7 @@ class SuspendTransformCommandLineProcessor : CommandLineProcessor {
2525
override val pluginOptions: Collection<AbstractCliOption> =
2626
listOf(SuspendTransformCliOptions.CLI_CONFIGURATION.toAbstractCliOption())
2727

28-
@OptIn(InternalSuspendTransformConstructorApi::class)
28+
@OptIn(InternalSuspendTransformConfigurationApi::class)
2929
override fun processOption(
3030
option: AbstractCliOption,
3131
value: String,

compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/SuspendTransformComponentRegistrar.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package love.forte.plugin.suspendtrans
22

3-
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConstructorApi
3+
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConfigurationApi
44
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration
55
import love.forte.plugin.suspendtrans.fir.SuspendTransformFirExtensionRegistrar
66
import love.forte.plugin.suspendtrans.ir.SuspendTransformIrGenerationExtension
@@ -60,11 +60,11 @@ class SuspendTransformComponentRegistrar : CompilerPluginRegistrar() {
6060
// // }
6161
// }
6262

63-
@OptIn(InternalSuspendTransformConstructorApi::class)
63+
@OptIn(InternalSuspendTransformConfigurationApi::class)
6464
private fun CompilerConfiguration.resolveToSuspendTransformConfiguration(): SuspendTransformConfiguration {
6565
return get(
6666
SuspendTransformCommandLineProcessor.CONFIGURATION_KEY,
67-
SuspendTransformConfiguration(true, mutableMapOf())
67+
SuspendTransformConfiguration(mutableMapOf())
6868
)
6969
// return SuspendTransformConfiguration().apply {
7070
// enabled = compilerConfiguration.get(SuspendTransformCommandLineProcessor.ENABLED, true)

compiler/suspend-transform-plugin/src/test/love/forte/plugin/suspendtrans/services/SuspendTransformerEnvironmentConfigurator.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package love.forte.plugin.suspendtrans.services
22

33
import love.forte.plugin.suspendtrans.SuspendTransformComponentRegistrar
4-
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConstructorApi
4+
import love.forte.plugin.suspendtrans.configuration.InternalSuspendTransformConfigurationApi
55
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jsPromiseTransformer
66
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jvmAsyncTransformer
77
import love.forte.plugin.suspendtrans.configuration.SuspendTransformConfigurations.jvmBlockingTransformer
@@ -23,13 +23,12 @@ import java.io.File
2323
*/
2424
class SuspendTransformerEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) {
2525

26-
@OptIn(ExperimentalCompilerApi::class, InternalSuspendTransformConstructorApi::class)
26+
@OptIn(ExperimentalCompilerApi::class, InternalSuspendTransformConfigurationApi::class)
2727
override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions(
2828
module: TestModule,
2929
configuration: CompilerConfiguration
3030
) {
3131
val testConfiguration = love.forte.plugin.suspendtrans.configuration.SuspendTransformConfiguration(
32-
enabled = true,
3332
transformers = mapOf(
3433
TargetPlatform.JS to listOf(jsPromiseTransformer),
3534
TargetPlatform.JVM to listOf(jvmBlockingTransformer, jvmAsyncTransformer)

plugins/suspend-transform-plugin-gradle/src/main/kotlin/love/forte/plugin/suspendtrans/gradle/SuspendTransformGradlePlugin.kt

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ open class SuspendTransformGradlePlugin : KotlinCompilerPluginSupportPlugin {
8080
project.logger.debug("Apply suspend transform plugin to compilation {}, target: {}", kotlinCompilation, target)
8181

8282
val extension = resolveExtension(project)
83-
return project.provider { extension.toSubpluginOptions(target, project) }
83+
return extension.toSubpluginOptionsProvider(target, project)
8484
}
8585

8686
private fun resolveExtension(project: Project): SuspendTransformPluginExtension {
@@ -196,7 +196,7 @@ private fun DeprecatedTargetPlatform.toTarget(): TargetPlatform {
196196
}
197197
}
198198

199-
@OptIn(InternalSuspendTransformConstructorApi::class)
199+
@OptIn(InternalSuspendTransformConfigurationApi::class)
200200
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION")
201201
private fun DeprecatedTransformer.toTransformer(): Transformer {
202202
return Transformer(
@@ -212,7 +212,7 @@ private fun DeprecatedTransformer.toTransformer(): Transformer {
212212
)
213213
}
214214

215-
@OptIn(InternalSuspendTransformConstructorApi::class)
215+
@OptIn(InternalSuspendTransformConfigurationApi::class)
216216
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION")
217217
private fun DeprecatedMarkAnnotation.toMarkAnnotation(): MarkAnnotation {
218218
return MarkAnnotation(
@@ -225,7 +225,7 @@ private fun DeprecatedMarkAnnotation.toMarkAnnotation(): MarkAnnotation {
225225
)
226226
}
227227

228-
@OptIn(InternalSuspendTransformConstructorApi::class)
228+
@OptIn(InternalSuspendTransformConfigurationApi::class)
229229
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION")
230230
private fun DeprecatedFunctionInfo.toFunctionInfo(): FunctionInfo {
231231
return FunctionInfo(
@@ -234,7 +234,7 @@ private fun DeprecatedFunctionInfo.toFunctionInfo(): FunctionInfo {
234234
)
235235
}
236236

237-
@OptIn(InternalSuspendTransformConstructorApi::class)
237+
@OptIn(InternalSuspendTransformConfigurationApi::class)
238238
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION")
239239
private fun DeprecatedClassInfo.toClassInfo(): ClassInfo {
240240
return ClassInfo(
@@ -245,7 +245,7 @@ private fun DeprecatedClassInfo.toClassInfo(): ClassInfo {
245245
)
246246
}
247247

248-
@OptIn(InternalSuspendTransformConstructorApi::class)
248+
@OptIn(InternalSuspendTransformConfigurationApi::class)
249249
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION")
250250
private fun DeprecatedIncludeAnnotation.toIncludeAnnotation(): IncludeAnnotation {
251251
return IncludeAnnotation(
@@ -262,7 +262,7 @@ private fun SuspendTransformPluginExtension.toSubpluginOptions(
262262
// If not enabled or transformer is empty.
263263
val cliConfig = SuspendTransformCliOptions.CLI_CONFIGURATION
264264
val configuration = toConfiguration()
265-
return if (configuration.enabled && configuration.transformers.isNotEmpty()) {
265+
return if (configuration.transformers.isNotEmpty()) {
266266
if (project.logger.isInfoEnabled) {
267267
val count = configuration.transformers.values.sumOf { it.size }
268268
project.logger.debug("The suspend transform is enabled with {} transformer(s) for {}", count, target)
@@ -274,6 +274,30 @@ private fun SuspendTransformPluginExtension.toSubpluginOptions(
274274
}
275275
}
276276

277+
private fun SuspendTransformPluginExtension.toSubpluginOptionsProvider(
278+
target: KotlinTarget,
279+
project: Project
280+
): Provider<List<SubpluginOption>> {
281+
return enabled
282+
.map { isEnabled ->
283+
if (!isEnabled) {
284+
project.logger.debug("The suspend transform is disabled for {}.", target)
285+
return@map emptyList()
286+
}
287+
288+
val configuration = toConfiguration()
289+
val transformers = configuration.transformers
290+
if (transformers.isEmpty()) {
291+
project.logger.debug("The suspend transform is enabled but transformers are empty for {}.", target)
292+
return@map emptyList()
293+
}
294+
295+
val cliConfig = SuspendTransformCliOptions.CLI_CONFIGURATION
296+
listOf(SubpluginOption(cliConfig.optionName, configuration.encodeToHex()))
297+
}
298+
299+
}
300+
277301
private fun Project.configureDependencies() {
278302
fun Project.include(platform: Platform, conf: SuspendTransformPluginExtension) {
279303
if (!conf.enabled.get()) {

plugins/suspend-transform-plugin-gradle/src/main/kotlin/love/forte/plugin/suspendtrans/gradle/SuspendTransformPluginExtension.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,11 @@ abstract class SuspendTransformPluginExtension
285285
}
286286
}
287287

288-
@OptIn(InternalSuspendTransformConstructorApi::class, ExperimentalTransformersContainerApi::class)
288+
@OptIn(InternalSuspendTransformConfigurationApi::class, ExperimentalTransformersContainerApi::class)
289289
internal fun SuspendTransformPluginExtension.toConfiguration(): SuspendTransformConfiguration {
290290
return SuspendTransformConfiguration(
291-
enabled = enabled.getOrElse(true),
291+
// 此处 Map 可能为 空,但是 List 不会有空的。
292+
// 后续在使用的时候只需要判断一下 transformers 本身是不是空即可。
292293
transformers = buildMap {
293294
transformers._containers.forEach { targetPlatform, transformerListProperty ->
294295
val list = transformerListProperty
@@ -740,7 +741,7 @@ abstract class IncludeAnnotationSpec
740741
}
741742
}
742743

743-
@OptIn(InternalSuspendTransformConstructorApi::class)
744+
@OptIn(InternalSuspendTransformConfigurationApi::class)
744745
internal fun TransformerSpec.toTransformer(): Transformer {
745746
return Transformer(
746747
markAnnotation = markAnnotation.get().toMarkAnnotation(),
@@ -756,7 +757,7 @@ internal fun TransformerSpec.toTransformer(): Transformer {
756757
)
757758
}
758759

759-
@OptIn(InternalSuspendTransformConstructorApi::class)
760+
@OptIn(InternalSuspendTransformConfigurationApi::class)
760761
internal fun MarkAnnotationSpec.toMarkAnnotation(): MarkAnnotation {
761762
return MarkAnnotation(
762763
classInfo = classInfo.get().toClassInfo(),
@@ -768,7 +769,7 @@ internal fun MarkAnnotationSpec.toMarkAnnotation(): MarkAnnotation {
768769
)
769770
}
770771

771-
@OptIn(InternalSuspendTransformConstructorApi::class)
772+
@OptIn(InternalSuspendTransformConfigurationApi::class)
772773
internal fun ClassInfoSpec.toClassInfo(): ClassInfo {
773774
return ClassInfo(
774775
packageName = packageName.get(),
@@ -778,15 +779,15 @@ internal fun ClassInfoSpec.toClassInfo(): ClassInfo {
778779
)
779780
}
780781

781-
@OptIn(InternalSuspendTransformConstructorApi::class)
782+
@OptIn(InternalSuspendTransformConfigurationApi::class)
782783
internal fun FunctionInfoSpec.toFunctionInfo(): FunctionInfo {
783784
return FunctionInfo(
784785
packageName = packageName.get(),
785786
functionName = functionName.get()
786787
)
787788
}
788789

789-
@OptIn(InternalSuspendTransformConstructorApi::class)
790+
@OptIn(InternalSuspendTransformConfigurationApi::class)
790791
internal fun IncludeAnnotationSpec.toIncludeAnnotation(): IncludeAnnotation {
791792
return IncludeAnnotation(
792793
classInfo = classInfo.get().toClassInfo(),

0 commit comments

Comments
 (0)