Skip to content

Commit d1493dc

Browse files
yigitneetopia
authored andcommitted
return primary constructor in declarations for KSClassDeclarationImpl
PR #275 made different class declaration backends more consistent by adding constructor into declarations and making getConstructors return based on that. Unfortunately, it missed primary constructor, causing missing constructors to be returned OR even worse, return an empty constructor instead of the primary constructor. This PR fixes that issue and also extends the test case to cover it. Fixes: #279
1 parent 3381bac commit d1493dc

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSClassDeclarationImpl.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,13 @@ class KSClassDeclarationImpl private constructor(val ktClassOrObject: KtClassOrO
6060
val propertiesFromConstructor = primaryConstructor?.parameters
6161
?.filter { it.isVar || it.isVal }
6262
?.map { KSPropertyDeclarationParameterImpl.getCached((it as KSValueParameterImpl).ktParameter) } ?: emptyList()
63-
val result = ktClassOrObject.declarations.getKSDeclarations().toMutableList()
63+
val result = ktClassOrObject.declarations.getKSDeclarations().toMutableList<KSDeclaration>()
6464
result.addAll(propertiesFromConstructor)
65+
primaryConstructor?.let { primaryConstructor: KSDeclaration ->
66+
if (!result.contains(primaryConstructor)) {
67+
result.add(primaryConstructor)
68+
}
69+
}
6570
if (classKind != ClassKind.INTERFACE) {
6671
// check if we need to add a synthetic constructor
6772
val hasConstructor = result.any {

compiler-plugin/testData/api/constructorDeclarations.kt

+66
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,32 @@
5454
// <init>(): lib.AbstractKotlinClassWithMultipleConstructors1
5555
// <init>(kotlin.Int): lib.AbstractKotlinClassWithMultipleConstructors1
5656
// <init>(kotlin.String): lib.AbstractKotlinClassWithMultipleConstructors1
57+
// class: AbstractKotlinClassWithMultipleConstructors2
58+
// <init>(kotlin.Float): AbstractKotlinClassWithMultipleConstructors2
59+
// <init>(kotlin.Int): AbstractKotlinClassWithMultipleConstructors2
60+
// <init>(kotlin.String): AbstractKotlinClassWithMultipleConstructors2
61+
// class: lib.AbstractKotlinClassWithMultipleConstructors2
62+
// <init>(kotlin.Float): lib.AbstractKotlinClassWithMultipleConstructors2
63+
// <init>(kotlin.Int): lib.AbstractKotlinClassWithMultipleConstructors2
64+
// <init>(kotlin.String): lib.AbstractKotlinClassWithMultipleConstructors2
65+
// class: AbstractKotlinClassWithPrimaryConstructor
66+
// <init>(kotlin.Int): AbstractKotlinClassWithPrimaryConstructor
67+
// class: lib.AbstractKotlinClassWithPrimaryConstructor
68+
// <init>(kotlin.Int): lib.AbstractKotlinClassWithPrimaryConstructor
5769
// class: AbstractKotlinClassWithoutExplicitConstructor
5870
// <init>(): AbstractKotlinClassWithoutExplicitConstructor
5971
// class: lib.AbstractKotlinClassWithoutExplicitConstructor
6072
// <init>(): lib.AbstractKotlinClassWithoutExplicitConstructor
73+
// class: DataClass
74+
// <init>(kotlin.Int,kotlin.String): DataClass
75+
// class: lib.DataClass
76+
// <init>(kotlin.Int,kotlin.String): lib.DataClass
77+
// class: DataClassWithSecondaryConstructor
78+
// <init>(kotlin.Int): DataClassWithSecondaryConstructor
79+
// <init>(kotlin.Int,kotlin.String): DataClassWithSecondaryConstructor
80+
// class: lib.DataClassWithSecondaryConstructor
81+
// <init>(kotlin.Int): lib.DataClassWithSecondaryConstructor
82+
// <init>(kotlin.Int,kotlin.String): lib.DataClassWithSecondaryConstructor
6183
// class: JavaAnnotation
6284
// <init>(): JavaAnnotation
6385
// class: lib.JavaAnnotation
@@ -108,10 +130,22 @@
108130
// <init>(): lib.KotlinClassWithMultipleConstructors1
109131
// <init>(kotlin.Int): lib.KotlinClassWithMultipleConstructors1
110132
// <init>(kotlin.String): lib.KotlinClassWithMultipleConstructors1
133+
// class: KotlinClassWithMultipleConstructors2
134+
// <init>(kotlin.Float): KotlinClassWithMultipleConstructors2
135+
// <init>(kotlin.Int): KotlinClassWithMultipleConstructors2
136+
// <init>(kotlin.String): KotlinClassWithMultipleConstructors2
137+
// class: lib.KotlinClassWithMultipleConstructors2
138+
// <init>(kotlin.Float): lib.KotlinClassWithMultipleConstructors2
139+
// <init>(kotlin.Int): lib.KotlinClassWithMultipleConstructors2
140+
// <init>(kotlin.String): lib.KotlinClassWithMultipleConstructors2
111141
// class: KotlinClassWithNamedCompanion
112142
// <init>(): KotlinClassWithNamedCompanion
113143
// class: lib.KotlinClassWithNamedCompanion
114144
// <init>(): lib.KotlinClassWithNamedCompanion
145+
// class: KotlinClassWithPrimaryConstructor
146+
// <init>(kotlin.Int): KotlinClassWithPrimaryConstructor
147+
// class: lib.KotlinClassWithPrimaryConstructor
148+
// <init>(kotlin.Int): lib.KotlinClassWithPrimaryConstructor
115149
// class: KotlinClassWithoutExplicitConstructor
116150
// <init>(): KotlinClassWithoutExplicitConstructor
117151
// class: lib.KotlinClassWithoutExplicitConstructor
@@ -181,6 +215,8 @@ interface KotlinInterface {}
181215
class KotlinClassWithoutExplicitConstructor {
182216
}
183217
class KotlinClassWithExplicitEmptyConstructor() {}
218+
class KotlinClassWithPrimaryConstructor(x:Int) {
219+
}
184220
class KotlinClassWithExplicitConstructor {
185221
constructor(x:Int) {}
186222
}
@@ -189,8 +225,14 @@ class KotlinClassWithMultipleConstructors1 {
189225
constructor(y:Int): this() {}
190226
constructor(x: String) : this() {}
191227
}
228+
class KotlinClassWithMultipleConstructors2(z:Float) {
229+
constructor(y:Int): this(0f) {}
230+
constructor(x: String) : this(0f) {}
231+
}
192232
abstract class AbstractKotlinClassWithoutExplicitConstructor {
193233
}
234+
abstract class AbstractKotlinClassWithPrimaryConstructor(x:Int) {
235+
}
194236
abstract class AbstractKotlinClassWithExplicitEmptyConstructor() {}
195237
abstract class AbstractKotlinClassWithExplicitConstructor {
196238
constructor(x:Int) {}
@@ -200,6 +242,10 @@ abstract class AbstractKotlinClassWithMultipleConstructors1 {
200242
constructor(y:Int): this() {}
201243
constructor(x: String) : this() {}
202244
}
245+
abstract class AbstractKotlinClassWithMultipleConstructors2(z:Float) {
246+
constructor(y:Int): this(0f) {}
247+
constructor(x: String) : this(0f) {}
248+
}
203249
annotation class KotlinAnnotation
204250
object KotlinObject {}
205251
class KotlinClassWithCompanion {
@@ -208,6 +254,10 @@ class KotlinClassWithCompanion {
208254
class KotlinClassWithNamedCompanion {
209255
companion object MyCompanion
210256
}
257+
data class DataClass(val x:Int, var y:String)
258+
data class DataClassWithSecondaryConstructor(val x:Int, val y:String) {
259+
constructor(x:Int) : this(x, "")
260+
}
211261
// MODULE: main(lib)
212262
// FILE: JavaInterface.java
213263
interface JavaInterface {
@@ -254,6 +304,8 @@ interface KotlinInterface {}
254304
class KotlinClassWithoutExplicitConstructor {
255305
}
256306
class KotlinClassWithExplicitEmptyConstructor() {}
307+
class KotlinClassWithPrimaryConstructor(x:Int) {
308+
}
257309
class KotlinClassWithExplicitConstructor {
258310
constructor(x:Int) {}
259311
}
@@ -262,8 +314,14 @@ class KotlinClassWithMultipleConstructors1 {
262314
constructor(y:Int): this() {}
263315
constructor(x: String) : this() {}
264316
}
317+
class KotlinClassWithMultipleConstructors2(z:Float) {
318+
constructor(y:Int): this(0f) {}
319+
constructor(x: String) : this(0f) {}
320+
}
265321
abstract class AbstractKotlinClassWithoutExplicitConstructor {
266322
}
323+
abstract class AbstractKotlinClassWithPrimaryConstructor(x:Int) {
324+
}
267325
abstract class AbstractKotlinClassWithExplicitEmptyConstructor() {}
268326
abstract class AbstractKotlinClassWithExplicitConstructor {
269327
constructor(x:Int) {}
@@ -273,11 +331,19 @@ abstract class AbstractKotlinClassWithMultipleConstructors1 {
273331
constructor(y:Int): this() {}
274332
constructor(x: String) : this() {}
275333
}
334+
abstract class AbstractKotlinClassWithMultipleConstructors2(z:Float) {
335+
constructor(y:Int): this(0f) {}
336+
constructor(x: String) : this(0f) {}
337+
}
276338
annotation class KotlinAnnotation
277339
object KotlinObject {}
278340
class KotlinClassWithCompanion {
279341
companion object
280342
}
281343
class KotlinClassWithNamedCompanion {
282344
companion object MyCompanion
345+
}
346+
data class DataClass(val x:Int, var y:String)
347+
data class DataClassWithSecondaryConstructor(val x:Int, val y:String) {
348+
constructor(x:Int) : this(x, "")
283349
}

0 commit comments

Comments
 (0)