Skip to content

Commit 2f436c8

Browse files
authored
Merge pull request github#9357 from smowton/smowton/fix/extension-properties-backing-fields
Kotlin: Disambiguate the names and trap labels of backing fields of extension properties
2 parents cc42f2f + 6ea87cd commit 2f436c8

File tree

8 files changed

+43
-9
lines changed

8 files changed

+43
-9
lines changed

java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,8 @@ open class KotlinFileExtractor(
759759
with("field", f) {
760760
DeclarationStackAdjuster(f).use {
761761
declarationStack.push(f)
762-
return extractField(useField(f), f.name.asString(), f.type, parentId, tw.getLocation(f), f.visibility, f, isExternalDeclaration(f), f.isFinal)
762+
val fNameSuffix = getExtensionReceiverType(f)?.let { it.classFqName?.asString()?.replace(".", "$$") } ?: ""
763+
return extractField(useField(f), "${f.name.asString()}$fNameSuffix", f.type, parentId, tw.getLocation(f), f.visibility, f, isExternalDeclaration(f), f.isFinal)
763764
}
764765
}
765766
}

java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1269,6 +1269,7 @@ open class KotlinUsesExtractor(
12691269

12701270
fun useValueParameter(vp: IrValueParameter, parent: Label<out DbCallable>?): Label<out DbParam> =
12711271
tw.getLabelFor(getValueParameterLabel(vp, parent))
1272+
12721273
fun isDirectlyExposedCompanionObjectField(f: IrField) =
12731274
f.hasAnnotation(FqName("kotlin.jvm.JvmField")) ||
12741275
f.correspondingPropertySymbol?.owner?.let {
@@ -1283,9 +1284,20 @@ open class KotlinUsesExtractor(
12831284
null
12841285
} ?: f.parent
12851286

1287+
// Gets a field's corresponding property's extension receiver type, if any
1288+
fun getExtensionReceiverType(f: IrField) =
1289+
f.correspondingPropertySymbol?.owner?.let {
1290+
(it.getter ?: it.setter)?.extensionReceiverParameter?.type
1291+
}
1292+
12861293
fun getFieldLabel(f: IrField): String {
12871294
val parentId = useDeclarationParent(getFieldParent(f), false)
1288-
return "@\"field;{$parentId};${f.name.asString()}\""
1295+
// Distinguish backing fields of properties based on their extension receiver type;
1296+
// otherwise two extension properties declared in the same enclosing context will get
1297+
// clashing trap labels. These are always private, so we can just make up a label without
1298+
// worrying about their names as seen from Java.
1299+
val extensionPropertyDiscriminator = getExtensionReceiverType(f)?.let { "extension;${useType(it)}" } ?: ""
1300+
return "@\"field;{$parentId};${extensionPropertyDiscriminator}${f.name.asString()}\""
12891301
}
12901302

12911303
fun useField(f: IrField): Label<out DbField> =
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
| |
2+
| <clinit> |
3+
| A |
4+
| B |
5+
| get |
6+
| getX |
7+
| invoke |
8+
| x$delegatepackagename$$subpackagename$$A |
9+
| x$delegatepackagename$$subpackagename$$B |
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package packagename.subpackagename
2+
3+
public class A { }
4+
public class B { }
5+
6+
val A.x : String by lazy { "HelloA" }
7+
val B.x : String by lazy { "HelloB" }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import java
2+
3+
from Class c
4+
where c.fromSource()
5+
select c.getAMember().toString()

java/ql/test/kotlin/library-tests/exprs/PrintAst.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ delegatedProperties.kt:
3131
# 87| 0: [MethodAccess] getValue(...)
3232
# 87| -2: [TypeAccess] Integer
3333
# 87| -1: [TypeAccess] PropertyReferenceDelegatesKt
34-
# 87| 0: [VarAccess] DelegatedPropertiesKt.extDelegated$delegate
34+
# 87| 0: [VarAccess] DelegatedPropertiesKt.extDelegated$delegateMyClass
3535
# 87| -1: [TypeAccess] DelegatedPropertiesKt
3636
# 1| 1: [ExtensionReceiverAccess] this
3737
# 87| 2: [PropertyRefExpr] ...::...
@@ -80,7 +80,7 @@ delegatedProperties.kt:
8080
# 87| 0: [MethodAccess] setValue(...)
8181
# 87| -2: [TypeAccess] Integer
8282
# 87| -1: [TypeAccess] PropertyReferenceDelegatesKt
83-
# 87| 0: [VarAccess] DelegatedPropertiesKt.extDelegated$delegate
83+
# 87| 0: [VarAccess] DelegatedPropertiesKt.extDelegated$delegateMyClass
8484
# 87| -1: [TypeAccess] DelegatedPropertiesKt
8585
# 1| 1: [ExtensionReceiverAccess] this
8686
# 87| 2: [PropertyRefExpr] ...::...
@@ -118,7 +118,7 @@ delegatedProperties.kt:
118118
# 87| 0: [TypeAccess] MyClass
119119
# 87| 1: [TypeAccess] Integer
120120
# 87| 3: [VarAccess] <set-?>
121-
# 87| 5: [FieldDeclaration] KMutableProperty0<Integer> extDelegated$delegate;
121+
# 87| 5: [FieldDeclaration] KMutableProperty0<Integer> extDelegated$delegateMyClass;
122122
# 87| -1: [TypeAccess] KMutableProperty0<Integer>
123123
# 87| 0: [TypeAccess] Integer
124124
# 87| 0: [PropertyRefExpr] ...::...

java/ql/test/kotlin/library-tests/exprs/delegatedProperties.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ delegatedProperties
1616
| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedToTopLevel | non-local | delegatedProperties.kt:77:34:77:49 | delegatedToTopLevel$delegate | delegatedProperties.kt:77:37:77:49 | ...::... |
1717
| delegatedProperties.kt:79:5:79:38 | max | max | non-local | delegatedProperties.kt:79:18:79:38 | max$delegate | delegatedProperties.kt:79:21:79:38 | ...::... |
1818
| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedToMember3 | local | delegatedProperties.kt:82:37:82:54 | KMutableProperty0<Integer> delegatedToMember3$delegate | delegatedProperties.kt:82:40:82:54 | ...::... |
19-
| delegatedProperties.kt:87:1:87:46 | extDelegated | extDelegated | non-local | delegatedProperties.kt:87:31:87:46 | extDelegated$delegate | delegatedProperties.kt:87:34:87:46 | ...::... |
19+
| delegatedProperties.kt:87:1:87:46 | extDelegated | extDelegated | non-local | delegatedProperties.kt:87:31:87:46 | extDelegated$delegateMyClass | delegatedProperties.kt:87:34:87:46 | ...::... |
2020
delegatedPropertyTypes
2121
| delegatedProperties.kt:6:9:9:9 | prop1 | file://:0:0:0:0 | int | file://<external>/Lazy.class:0:0:0:0 | Lazy<Integer> |
2222
| delegatedProperties.kt:19:9:19:51 | varResource1 | file://:0:0:0:0 | int | delegatedProperties.kt:45:1:51:1 | ResourceDelegate |

java/ql/test/kotlin/library-tests/exprs/exprs.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -830,9 +830,9 @@
830830
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | set | TypeAccess |
831831
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | set | TypeAccess |
832832
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess |
833-
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegate | delegatedProperties.kt:0:0:0:0 | <clinit> | VarAccess |
834-
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegate | delegatedProperties.kt:87:31:87:46 | getExtDelegated | VarAccess |
835-
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegate | delegatedProperties.kt:87:31:87:46 | setExtDelegated | VarAccess |
833+
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegateMyClass | delegatedProperties.kt:0:0:0:0 | <clinit> | VarAccess |
834+
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegateMyClass | delegatedProperties.kt:87:31:87:46 | getExtDelegated | VarAccess |
835+
| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegateMyClass | delegatedProperties.kt:87:31:87:46 | setExtDelegated | VarAccess |
836836
| delegatedProperties.kt:87:31:87:46 | Integer | delegatedProperties.kt:87:31:87:46 | getExtDelegated | TypeAccess |
837837
| delegatedProperties.kt:87:31:87:46 | Integer | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess |
838838
| delegatedProperties.kt:87:31:87:46 | Integer | file://:0:0:0:0 | <none> | TypeAccess |

0 commit comments

Comments
 (0)