Skip to content

Commit 753cb51

Browse files
authored
Support underlying type extraction for Kotlin value classes in KSP codegen (#1404)
1 parent 37e307b commit 753cb51

File tree

4 files changed

+36
-16
lines changed
  • querydsl-examples/querydsl-example-ksp-codegen/src
  • querydsl-tooling/querydsl-ksp-codegen/src/main/kotlin/com/querydsl/ksp/codegen

4 files changed

+36
-16
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.querydsl.example.ksp
2+
3+
@JvmInline
4+
value class Email(
5+
val value: String
6+
)

querydsl-examples/querydsl-example-ksp-codegen/src/main/kotlin/com/querydsl/example/ksp/Person.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class Person(
99
@Id
1010
val id: Int,
1111
val name: String,
12+
val email: Email,
1213

1314
@OneToMany(mappedBy = "owner")
1415
val cats: List<Cat>? = null,

querydsl-examples/querydsl-example-ksp-codegen/src/test/kotlin/Tests.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import com.querydsl.example.ksp.Bear
22
import com.querydsl.example.ksp.Cat
33
import com.querydsl.example.ksp.CatType
44
import com.querydsl.example.ksp.Dog
5+
import com.querydsl.example.ksp.Email
56
import com.querydsl.example.ksp.Person
67
import com.querydsl.example.ksp.QBear
78
import com.querydsl.example.ksp.QBearSimplifiedProjection
89
import com.querydsl.example.ksp.QCat
910
import com.querydsl.example.ksp.QDog
10-
import com.querydsl.example.ksp.QGeolocation
1111
import com.querydsl.example.ksp.QMyShape
1212
import com.querydsl.example.ksp.QPerson
1313
import com.querydsl.example.ksp.QPersonClassDTO
@@ -33,7 +33,7 @@ class Tests {
3333
run {
3434
val em = emf.createEntityManager()
3535
em.transaction.begin()
36-
em.persist(Person(424, "John Smith"))
36+
em.persist(Person(424, "John Smith", Email("[email protected]")))
3737
em.transaction.commit()
3838
em.close()
3939
}
@@ -44,7 +44,7 @@ class Tests {
4444
val q = QPerson.person
4545
val person = queryFactory
4646
.selectFrom(q)
47-
.where(q.name.eq("John Smith"))
47+
.where(q.name.eq("John Smith"), q.email.eq("[email protected]"))
4848
.fetchOne()
4949
if (person == null) {
5050
fail<Any>("No person was returned")
@@ -62,7 +62,7 @@ class Tests {
6262
run {
6363
val em = emf.createEntityManager()
6464
em.transaction.begin()
65-
val catOwner = Person(425, "Percy Bysshe Catownerly")
65+
val catOwner = Person(425, "Percy Bysshe Catownerly", Email("[email protected]"))
6666
em.persist(catOwner)
6767
em.persist(Cat(103, "Samuel Taylor Cattingridge", false, "Not so fluffy", catOwner, CatType.MAINE_COON))
6868
em.transaction.commit()
@@ -132,7 +132,7 @@ class Tests {
132132
run {
133133
val em = emf.createEntityManager()
134134
em.transaction.begin()
135-
em.persist(Person(424, "John Smith"))
135+
em.persist(Person(424, "John Smith", Email("[email protected]")))
136136
em.transaction.commit()
137137
em.close()
138138
}

querydsl-tooling/querydsl-ksp-codegen/src/main/kotlin/com/querydsl/ksp/codegen/TypeExtractor.kt

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,30 @@ class TypeExtractor(
1414
private val annotations: Sequence<KSAnnotation>
1515
) {
1616
fun extract(type: KSType): QPropertyType {
17-
val declaration = type.declaration
18-
if (declaration is KSTypeAlias) {
19-
val innerType = declaration.type.resolve()
20-
return extract(innerType)
21-
} else {
22-
return userType(type)
23-
?: parameterType(type)
24-
?: simpleType(type)
25-
?: referenceType(type)
26-
?: collectionType(type)
27-
?: fallbackType(type)
17+
when (val declaration = type.declaration) {
18+
is KSClassDeclaration if declaration.modifiers.contains(Modifier.VALUE) -> {
19+
val wrappedType = declaration
20+
.primaryConstructor
21+
?.parameters
22+
?.firstOrNull()
23+
?.type
24+
?.resolve()
25+
?: throwError("Cannot resolve type: $declaration")
26+
27+
return extract(wrappedType)
28+
}
29+
is KSTypeAlias -> {
30+
val innerType = declaration.type.resolve()
31+
return extract(innerType)
32+
}
33+
else -> {
34+
return userType(type)
35+
?: parameterType(type)
36+
?: simpleType(type)
37+
?: referenceType(type)
38+
?: collectionType(type)
39+
?: fallbackType(type)
40+
}
2841
}
2942
}
3043

0 commit comments

Comments
 (0)