Skip to content

Commit 2e70394

Browse files
committed
Add markName support for JVM and JS annotations in synthetic function generation and testing
1 parent dfde47b commit 2e70394

File tree

4 files changed

+73
-25
lines changed

4 files changed

+73
-25
lines changed

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

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,17 @@ object SuspendTransformConfigurations {
405405
//endregion
406406

407407
//region JVM Defaults
408+
409+
/**
410+
* The `kotlin.jvm.JvmName`.
411+
* @since 0.13.0
412+
*/
413+
@JvmStatic
414+
val jvmNameAnnotationClassInfo = ClassInfo(
415+
packageName = KOTLIN_JVM,
416+
className = "JvmName"
417+
)
418+
408419
@JvmStatic
409420
val jvmSyntheticClassInfo = ClassInfo(
410421
packageName = KOTLIN_JVM,
@@ -426,7 +437,12 @@ object SuspendTransformConfigurations {
426437
@JvmStatic
427438
val jvmBlockingAnnotationInfo = MarkAnnotation(
428439
classInfo = jvmBlockingMarkAnnotationClassInfo,
429-
defaultSuffix = "Blocking"
440+
defaultSuffix = "Blocking",
441+
markNameProperty = MarkNameProperty(
442+
propertyName = "markName",
443+
annotation = jvmNameAnnotationClassInfo,
444+
annotationMarkNamePropertyName = "name"
445+
)
430446
)
431447

432448
@JvmStatic
@@ -444,17 +460,12 @@ object SuspendTransformConfigurations {
444460
@JvmStatic
445461
val jvmAsyncAnnotationInfo = MarkAnnotation(
446462
classInfo = jvmAsyncMarkAnnotationClassInfo,
447-
defaultSuffix = "Async"
448-
)
449-
450-
/**
451-
* The `kotlin.jvm.JvmName`.
452-
* @since 0.13.0
453-
*/
454-
@JvmStatic
455-
val jvmNameAnnotationClassInfo = ClassInfo(
456-
packageName = KOTLIN_JVM,
457-
className = "JvmName"
463+
defaultSuffix = "Async",
464+
markNameProperty = MarkNameProperty(
465+
propertyName = "markName",
466+
annotation = jvmNameAnnotationClassInfo,
467+
annotationMarkNamePropertyName = "name"
468+
)
458469
)
459470

460471
@JvmStatic
@@ -508,6 +519,17 @@ object SuspendTransformConfigurations {
508519
//endregion
509520

510521
//region JS Defaults
522+
523+
/**
524+
* The `kotlin.js.JsName`.
525+
* @since 0.13.0
526+
*/
527+
@JvmStatic
528+
val jsNameAnnotationClassInfo = ClassInfo(
529+
packageName = KOTLIN_JS,
530+
className = "JsName"
531+
)
532+
511533
@JvmStatic
512534
val kotlinJsExportClassInfo = ClassInfo(
513535
packageName = KOTLIN_JS,
@@ -535,17 +557,12 @@ object SuspendTransformConfigurations {
535557
@JvmStatic
536558
val jsAsyncAnnotationInfo = MarkAnnotation(
537559
classInfo = jsAsyncMarkAnnotationClassInfo,
538-
defaultSuffix = "Async"
539-
)
540-
541-
/**
542-
* The `kotlin.js.JsName`.
543-
* @since 0.13.0
544-
*/
545-
@JvmStatic
546-
val jsNameAnnotationClassInfo = ClassInfo(
547-
packageName = KOTLIN_JS,
548-
className = "JsName"
560+
defaultSuffix = "Async",
561+
markNameProperty = MarkNameProperty(
562+
propertyName = "markName",
563+
annotation = jsNameAnnotationClassInfo,
564+
annotationMarkNamePropertyName = "name"
565+
)
549566
)
550567

551568
@JvmStatic

compiler/suspend-transform-plugin/src/test/love/forte/plugin/suspendtrans/runners/AbstractTestRunner.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import love.forte.plugin.suspendtrans.services.SuspendTransformerEnvironmentConf
44
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
55
import org.jetbrains.kotlin.test.FirParser
66
import org.jetbrains.kotlin.test.TargetBackend
7+
import org.jetbrains.kotlin.test.backend.handlers.AsmLikeInstructionListingHandler
8+
import org.jetbrains.kotlin.test.backend.handlers.BytecodeListingHandler
79
import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade
810
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
911
import org.jetbrains.kotlin.test.builders.configureFirHandlersStep
1012
import org.jetbrains.kotlin.test.builders.configureJvmArtifactsHandlersStep
1113
import org.jetbrains.kotlin.test.configuration.commonConfigurationForJvmTest
14+
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.CHECK_ASM_LIKE_INSTRUCTIONS
1215
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.FIR_PARSER
1316
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter
1417
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
@@ -56,6 +59,7 @@ abstract class AbstractTestRunner : AbstractKotlinCompilerTest() {
5659

5760
builder.defaultDirectives {
5861
FIR_PARSER with FirParser.LightTree
62+
+CHECK_ASM_LIKE_INSTRUCTIONS
5963
}
6064

6165
when (targetFrontend) {
@@ -90,7 +94,12 @@ abstract class AbstractTestRunner : AbstractKotlinCompilerTest() {
9094

9195
}
9296

97+
// We need to explicitly configure JVM artifacts handlers to generate .asm files
9398
builder.configureJvmArtifactsHandlersStep {
99+
useHandlers(
100+
::BytecodeListingHandler,
101+
::AsmLikeInstructionListingHandler
102+
)
94103
}
95104

96105
builder.useConfigurators(

compiler/suspend-transform-plugin/src/testData/codegen/markName.fir.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ FILE: Main.kt
88
^foo String(foo)
99
}
1010

11-
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() public final fun fooBlocking(): R|kotlin/String| {
11+
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() @R|kotlin/jvm/JvmName|(name = String(foo)) public final fun fooBlocking(): R|kotlin/String| {
1212
^fooBlocking R|love/forte/plugin/suspendtrans/runtime/$runInBlocking$|(suspend fun <anonymous>(): R|kotlin/String| <inline=Unknown> {
1313
^ this@R|/Foo|.R|/Foo.foo|()
1414
}
1515
)
1616
}
1717

18-
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() public final fun fooAsync(): R|java/util/concurrent/CompletableFuture<out kotlin/String>| {
18+
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() @R|kotlin/jvm/JvmName|(name = String(foo)) public final fun fooAsync(): R|java/util/concurrent/CompletableFuture<out kotlin/String>| {
1919
^fooAsync R|love/forte/plugin/suspendtrans/runtime/$runInAsync$|(suspend fun <anonymous>(): R|kotlin/String| <inline=Unknown> {
2020
^ this@R|/Foo|.R|/Foo.foo|()
2121
}

runtime/suspend-transform-annotation/src/jsMain/kotlin/love.forte.plugin.suspendtrans/annotation/SuspendTransformAnnotationJs.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,26 @@ public actual annotation class JsPromise(
1414
actual val baseName: String,
1515
actual val suffix: String,
1616
actual val asProperty: Boolean,
17+
18+
/**
19+
* The name of [@JsName][kotlin.js.JsName].
20+
* Valid when not empty.
21+
*
22+
* If [markName] is valid, [@JsName][kotlin.js.JsName] will be annotated on the generated function.
23+
*
24+
* For example:
25+
*
26+
* ```Kotlin
27+
* @JsPromise(markName = "markName_foo")
28+
* suspend fun foo(): String = "..."
29+
*
30+
* // The generated fun:
31+
* @JsName(name = "markName_foo")
32+
* fun fooAsync(): Promise<out String> = runAsync { foo() }
33+
* ```
34+
*
35+
*
36+
* @since 0.13.0
37+
*/
38+
actual val markName: String = "",
1739
)

0 commit comments

Comments
 (0)