Skip to content

Commit 1a9f59c

Browse files
committed
type parameter...!
1 parent 62b8c6e commit 1a9f59c

File tree

9 files changed

+150
-9
lines changed

9 files changed

+150
-9
lines changed

buildSrc/src/main/kotlin/IProject.kt

Lines changed: 1 addition & 1 deletion
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.0.20"
14-
val pluginVersion = "0.9.3"
14+
val pluginVersion = "0.9.4"
1515

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

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1111
import org.jetbrains.kotlin.fir.analysis.checkers.context.MutableCheckerContext
1212
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
1313
import org.jetbrains.kotlin.fir.analysis.checkers.processOverriddenFunctions
14+
import org.jetbrains.kotlin.fir.builder.buildFunctionTypeParameter
1415
import org.jetbrains.kotlin.fir.caches.FirCache
1516
import org.jetbrains.kotlin.fir.caches.firCachesFactory
1617
import org.jetbrains.kotlin.fir.caches.getValue
1718
import org.jetbrains.kotlin.fir.collectUpperBounds
1819
import org.jetbrains.kotlin.fir.copy
1920
import org.jetbrains.kotlin.fir.declarations.*
20-
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
21-
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyAccessor
22-
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy
23-
import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameterCopy
21+
import org.jetbrains.kotlin.fir.declarations.builder.*
2422
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
2523
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
2624
import org.jetbrains.kotlin.fir.declarations.utils.isSuspend
@@ -45,6 +43,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
4543
import org.jetbrains.kotlin.fir.types.*
4644
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
4745
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
46+
import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter
4847
import org.jetbrains.kotlin.name.CallableId
4948
import org.jetbrains.kotlin.name.ClassId
5049
import org.jetbrains.kotlin.name.FqName
@@ -151,12 +150,20 @@ class SuspendTransformFirTransformer(
151150
// In the generated IR, data and dataBlocking will share an `A`, generating the error.
152151
// The error: Duplicate IR node
153152
// [IR VALIDATION] JvmIrValidationBeforeLoweringPhase: Duplicate IR node: TYPE_PARAMETER name:A index:0 variance: superTypes:[kotlin.Any?] reified:false of FUN GENERATED[...]
153+
// TODO onebot type parameters?
154154
typeParameters.replaceAll {
155155
buildTypeParameterCopy(it) {
156-
symbol = FirTypeParameterSymbol()
156+
containingDeclarationSymbol = newFunSymbol // it.containingDeclarationSymbol
157+
symbol = it.symbol // FirTypeParameterSymbol()
157158
}
158159
}
159160

161+
// valueParameters.replaceAll { vp ->
162+
// buildValueParameterCopy(vp) {
163+
// containingFunctionSymbol = newFunSymbol
164+
// }
165+
// }
166+
160167
annotations.clear()
161168
annotations.addAll(functionAnnotations)
162169
body = null

compiler/suspend-transform-plugin/src/testData/codegen/typeAttr.asm.txt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,47 @@ public class Bar : java/lang/Object {
33
}
44

55
public final class Foo$DefaultImpls : java/lang/Object {
6+
public static java.util.concurrent.CompletableFuture runAsync(Foo $this)
7+
8+
public static java.lang.Object runBlocking(Foo $this)
9+
610
public static java.util.concurrent.CompletableFuture valueAsync(Foo $this)
711

812
public static Bar valueBlocking(Foo $this)
913
}
1014

15+
final class Foo$runAsync$1 : kotlin/coroutines/jvm/internal/SuspendLambda, kotlin/jvm/functions/Function1 {
16+
int label
17+
18+
final Foo this$0
19+
20+
void <init>(Foo $receiver, kotlin.coroutines.Continuation $completion)
21+
22+
public final kotlin.coroutines.Continuation create(kotlin.coroutines.Continuation $completion)
23+
24+
public final java.lang.Object invoke(kotlin.coroutines.Continuation p1)
25+
26+
public java.lang.Object invoke(java.lang.Object p1)
27+
28+
public final java.lang.Object invokeSuspend(java.lang.Object $result)
29+
}
30+
31+
final class Foo$runBlocking$1 : kotlin/coroutines/jvm/internal/SuspendLambda, kotlin/jvm/functions/Function1 {
32+
int label
33+
34+
final Foo this$0
35+
36+
void <init>(Foo $receiver, kotlin.coroutines.Continuation $completion)
37+
38+
public final kotlin.coroutines.Continuation create(kotlin.coroutines.Continuation $completion)
39+
40+
public final java.lang.Object invoke(kotlin.coroutines.Continuation p1)
41+
42+
public java.lang.Object invoke(java.lang.Object p1)
43+
44+
public final java.lang.Object invokeSuspend(java.lang.Object $result)
45+
}
46+
1147
final class Foo$valueAsync$1 : kotlin/coroutines/jvm/internal/SuspendLambda, kotlin/jvm/functions/Function1 {
1248
int label
1349

@@ -41,6 +77,12 @@ final class Foo$valueBlocking$1 : kotlin/coroutines/jvm/internal/SuspendLambda,
4177
}
4278

4379
public abstract interface Foo : java/lang/Object {
80+
public abstract java.lang.Object run(kotlin.coroutines.Continuation p0)
81+
82+
public abstract java.util.concurrent.CompletableFuture runAsync()
83+
84+
public abstract java.lang.Object runBlocking()
85+
4486
public abstract java.lang.Object value(kotlin.coroutines.Continuation p0)
4587

4688
public abstract java.util.concurrent.CompletableFuture valueAsync()
@@ -51,6 +93,10 @@ public abstract interface Foo : java/lang/Object {
5193
public final class FooImpl : java/lang/Object, Foo {
5294
public void <init>()
5395

96+
public java.util.concurrent.CompletableFuture runAsync()
97+
98+
public java.lang.Object runBlocking()
99+
54100
public java.lang.Object value(kotlin.coroutines.Continuation $completion)
55101

56102
public java.util.concurrent.CompletableFuture valueAsync()

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

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,28 @@ FILE fqName:<root> fileName:/Main.kt
3333
overridden:
3434
public open fun hashCode (): kotlin.Int declared in <root>.Foo
3535
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
36+
FUN FAKE_OVERRIDE name:run visibility:public modality:ABSTRACT <R> ($this:<root>.Foo<<root>.Tar>) returnType:R of <root>.Foo.runBlocking [suspend,fake_override]
37+
annotations:
38+
JvmBlocking(baseName = <null>, suffix = <null>, asProperty = <null>)
39+
JvmAsync(baseName = <null>, suffix = <null>, asProperty = <null>)
40+
overridden:
41+
public abstract fun run <R> (): R of <root>.Foo.runBlocking declared in <root>.Foo
42+
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Any] reified:false
43+
$this: VALUE_PARAMETER name:<this> type:<root>.Foo<<root>.Tar>
44+
FUN FAKE_OVERRIDE name:runAsync visibility:public modality:OPEN <R> ($this:<root>.Foo<<root>.Tar>) returnType:java.util.concurrent.CompletableFuture [fake_override]
45+
annotations:
46+
Api4J
47+
overridden:
48+
public open fun runAsync <R> (): java.util.concurrent.CompletableFuture declared in <root>.Foo
49+
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Any] reified:false
50+
$this: VALUE_PARAMETER name:<this> type:<root>.Foo<<root>.Tar>
51+
FUN FAKE_OVERRIDE name:runBlocking visibility:public modality:OPEN <R> ($this:<root>.Foo<<root>.Tar>) returnType:R of <root>.FooImpl.runBlocking [fake_override]
52+
annotations:
53+
Api4J
54+
overridden:
55+
public open fun runBlocking <R> (): R of <root>.Foo.runBlocking declared in <root>.Foo
56+
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Any] reified:false
57+
$this: VALUE_PARAMETER name:<this> type:<root>.Foo<<root>.Tar>
3658
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
3759
overridden:
3860
public open fun toString (): kotlin.String declared in <root>.Foo
@@ -91,6 +113,38 @@ FILE fqName:<root> fileName:/Main.kt
91113
overridden:
92114
public open fun toString (): kotlin.String declared in kotlin.Any
93115
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
116+
FUN GENERATED[love.forte.plugin.suspendtrans.fir.SuspendTransformPluginKey] name:runAsync visibility:public modality:OPEN <R> ($this:<root>.Foo<T of <root>.Foo>) returnType:java.util.concurrent.CompletableFuture
117+
annotations:
118+
Api4J
119+
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Any] reified:false
120+
$this: VALUE_PARAMETER name:<this> type:<root>.Foo<T of <root>.Foo>
121+
BLOCK_BODY
122+
RETURN type=kotlin.Nothing from='public open fun runAsync <R> (): java.util.concurrent.CompletableFuture declared in <root>.Foo'
123+
CALL 'public final fun $runInAsync$ <T> (block: kotlin.coroutines.SuspendFunction0<T of love.forte.plugin.suspendtrans.runtime.$runInAsync$>, scope: kotlinx.coroutines.CoroutineScope?): java.util.concurrent.CompletableFuture declared in love.forte.plugin.suspendtrans.runtime' type=java.util.concurrent.CompletableFuture origin=null
124+
<T>: <none>
125+
block: FUN_EXPR type=kotlin.coroutines.SuspendFunction0<java.util.concurrent.CompletableFuture> origin=LAMBDA
126+
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> () returnType:java.util.concurrent.CompletableFuture [suspend]
127+
BLOCK_BODY
128+
RETURN type=kotlin.Nothing from='local final fun <no name provided> (): java.util.concurrent.CompletableFuture declared in <root>.Foo.runAsync'
129+
CALL 'public abstract fun run <R> (): R of <root>.Foo.runBlocking declared in <root>.Foo' type=R of <root>.Foo.runBlocking origin=null
130+
<R>: <none>
131+
$this: GET_VAR '<this>: <root>.Foo<T of <root>.Foo> declared in <root>.Foo.runAsync' type=<root>.Foo<T of <root>.Foo> origin=null
132+
FUN GENERATED[love.forte.plugin.suspendtrans.fir.SuspendTransformPluginKey] name:runBlocking visibility:public modality:OPEN <R> ($this:<root>.Foo<T of <root>.Foo>) returnType:R of <root>.Foo.runBlocking
133+
annotations:
134+
Api4J
135+
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Any] reified:false
136+
$this: VALUE_PARAMETER name:<this> type:<root>.Foo<T of <root>.Foo>
137+
BLOCK_BODY
138+
RETURN type=kotlin.Nothing from='public open fun runBlocking <R> (): R of <root>.Foo.runBlocking declared in <root>.Foo'
139+
CALL 'public final fun $runInBlocking$ <T> (block: kotlin.coroutines.SuspendFunction0<T of love.forte.plugin.suspendtrans.runtime.$runInBlocking$>): T of love.forte.plugin.suspendtrans.runtime.$runInBlocking$ declared in love.forte.plugin.suspendtrans.runtime' type=T of love.forte.plugin.suspendtrans.runtime.$runInBlocking$ origin=null
140+
<T>: <none>
141+
block: FUN_EXPR type=kotlin.coroutines.SuspendFunction0<R of <root>.Foo.runBlocking> origin=LAMBDA
142+
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> () returnType:R of <root>.Foo.runBlocking [suspend]
143+
BLOCK_BODY
144+
RETURN type=kotlin.Nothing from='local final fun <no name provided> (): R of <root>.Foo.runBlocking declared in <root>.Foo.runBlocking'
145+
CALL 'public abstract fun run <R> (): R of <root>.Foo.runBlocking declared in <root>.Foo' type=R of <root>.Foo.runBlocking origin=null
146+
<R>: <none>
147+
$this: GET_VAR '<this>: <root>.Foo<T of <root>.Foo> declared in <root>.Foo.runBlocking' type=<root>.Foo<T of <root>.Foo> origin=null
94148
FUN GENERATED[love.forte.plugin.suspendtrans.fir.SuspendTransformPluginKey] name:valueAsync visibility:public modality:OPEN <> ($this:<root>.Foo<T of <root>.Foo>) returnType:java.util.concurrent.CompletableFuture
95149
annotations:
96150
Api4J
@@ -119,6 +173,13 @@ FILE fqName:<root> fileName:/Main.kt
119173
RETURN type=kotlin.Nothing from='local final fun <no name provided> (): T of <root>.Foo declared in <root>.Foo.valueBlocking'
120174
CALL 'public abstract fun value (): T of <root>.Foo declared in <root>.Foo' type=T of <root>.Foo origin=null
121175
$this: GET_VAR '<this>: <root>.Foo<T of <root>.Foo> declared in <root>.Foo.valueBlocking' type=<root>.Foo<T of <root>.Foo> origin=null
176+
FUN name:run visibility:public modality:ABSTRACT <R> ($this:<root>.Foo<T of <root>.Foo>) returnType:R of <root>.Foo.runBlocking [suspend]
177+
annotations:
178+
JvmBlocking(baseName = <null>, suffix = <null>, asProperty = <null>)
179+
JvmAsync(baseName = <null>, suffix = <null>, asProperty = <null>)
180+
JvmSynthetic
181+
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Any] reified:false
182+
$this: VALUE_PARAMETER name:<this> type:<root>.Foo<T of <root>.Foo>
122183
FUN name:value visibility:public modality:ABSTRACT <> ($this:<root>.Foo<T of <root>.Foo>) returnType:T of <root>.Foo [suspend]
123184
annotations:
124185
JvmBlocking(baseName = <null>, suffix = <null>, asProperty = <null>)

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,16 @@ FILE: Main.kt
1414
public abstract interface Foo<out T : R|Bar|> : R|kotlin/Any| {
1515
@R|love/forte/plugin/suspendtrans/annotation/JvmBlocking|() @R|love/forte/plugin/suspendtrans/annotation/JvmAsync|() public abstract suspend fun value(): R|T|
1616

17+
@R|love/forte/plugin/suspendtrans/annotation/JvmBlocking|() @R|love/forte/plugin/suspendtrans/annotation/JvmAsync|() public abstract suspend fun <R : R|kotlin/Any|> run(): R|R|
18+
1719
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() public open fun valueAsync(): R|java/util/concurrent/CompletableFuture<out T>|
1820

1921
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() public open fun valueBlocking(): R|T|
2022

23+
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() public open fun <R : R|kotlin/Any|> runAsync(): R|java/util/concurrent/CompletableFuture<out R>|
24+
25+
@R|love/forte/plugin/suspendtrans/annotation/Api4J|() public open fun <R : R|kotlin/Any|> runBlocking(): R|R|
26+
2127
}
2228
public final class FooImpl : R|Foo<Tar>| {
2329
public constructor(): R|FooImpl| {

compiler/suspend-transform-plugin/src/testData/codegen/typeAttr.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ interface Foo<out T : Bar> {
1313
@JvmAsync
1414
suspend fun value(): T
1515

16+
@JvmBlocking
17+
@JvmAsync
18+
suspend fun <R : Any> run(): R
1619
}
1720

1821
class FooImpl : Foo<Tar> {

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ include(":runtime:suspend-transform-runtime")
2828
include(":plugins:suspend-transform-plugin-gradle")
2929

3030
//Samples
31-
//include(":tests:test-jvm")
31+
include(":tests:test-jvm")
3232
//include(":tests:test-js")

tests/test-jvm/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ buildscript {
1919
mavenCentral()
2020
}
2121
dependencies {
22-
classpath("love.forte.plugin.suspend-transform:suspend-transform-plugin-gradle:2.0.20-0.9.3")
23-
classpath("org.jetbrains.kotlin:kotlin-compiler:2.1.0-Beta1")
22+
classpath("love.forte.plugin.suspend-transform:suspend-transform-plugin-gradle:2.0.20-0.9.4")
23+
classpath("org.jetbrains.kotlin:kotlin-compiler:2.0.20")
2424
}
2525
}
2626

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package love.forte.plugin.suspendtrans.sample
2+
3+
import love.forte.plugin.suspendtrans.annotation.JvmAsync
4+
5+
interface Api<T : Any> {
6+
suspend fun run(): T
7+
}
8+
9+
interface ApiResult<T : Any>
10+
11+
/**
12+
*
13+
* @author ForteScarlet
14+
*/
15+
interface ApiExecutable {
16+
@JvmAsync
17+
fun <T : Any> execute(api: Api<T>): T // ApiResult<T>
18+
}

0 commit comments

Comments
 (0)