Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b26044b

Browse files
tamasvajkigfoo
authored andcommitted
Change extension receiver this access to be a parameter access
1 parent 21f6867 commit b26044b

9 files changed

Lines changed: 67 additions & 31 deletions

File tree

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,7 +2247,7 @@ open class KotlinFileExtractor(
22472247
is IrGetValue -> {
22482248
val exprParent = parent.expr(e, callable)
22492249
val owner = e.symbol.owner
2250-
if (owner is IrValueParameter && owner.index == -1) {
2250+
if (owner is IrValueParameter && owner.index == -1 && !owner.isExtensionReceiver()) {
22512251
val id = tw.getFreshIdLabel<DbThisaccess>()
22522252
val type = useType(e.type)
22532253
val locId = tw.getLocation(e)
@@ -2294,7 +2294,10 @@ open class KotlinFileExtractor(
22942294
tw.writeCallableEnclosingExpr(id, callable)
22952295
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
22962296

2297-
val vId = useValueDeclaration(owner)
2297+
val vId = if (owner is IrValueParameter && owner.isExtensionReceiver())
2298+
useValueParameter(owner, useFunction(owner.parent as IrFunction))
2299+
else
2300+
useValueDeclaration(owner)
22982301
tw.writeVariableBinding(id, vId)
22992302
}
23002303
}
@@ -2570,6 +2573,11 @@ open class KotlinFileExtractor(
25702573
}
25712574
}
25722575

2576+
private fun IrValueParameter.isExtensionReceiver(): Boolean {
2577+
val parentFun = parent as? IrFunction ?: return false
2578+
return parentFun.extensionReceiverParameter == this
2579+
}
2580+
25732581
private open inner class GeneratedClassHelper(protected val locId: Label<DbLocation>, protected val ids: GeneratedClassLabels) {
25742582

25752583
protected fun writeExpressionMetadataToTrapFile(id: Label<out DbExpr>, callable: Label<out DbCallable>, stmt: Label<out DbStmt>) {

java/ql/lib/semmle/code/java/Expr.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,6 +1860,21 @@ class VarAccess extends Expr, @varaccess {
18601860
override string getAPrimaryQlClass() { result = "VarAccess" }
18611861
}
18621862

1863+
/**
1864+
* An access to an extension receiver parameter. This is a parameter access that takes the form of `this` in Kotlin.
1865+
*/
1866+
class ExtensionReceiverAccess extends VarAccess {
1867+
ExtensionReceiverAccess() {
1868+
exists(Parameter p |
1869+
this.getVariable() = p and p.getPosition() = 0 and p.getCallable() instanceof ExtensionMethod
1870+
)
1871+
}
1872+
1873+
override string getAPrimaryQlClass() { result = "ExtensionReceiverAccess" }
1874+
1875+
override string toString() { result = "this" }
1876+
}
1877+
18631878
/**
18641879
* An l-value is a write access to a variable, which occurs as the destination of an assignment.
18651880
*/

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ delegatedProperties.kt:
2525
# 87| -2: [TypeAccess] Integer
2626
# 87| -1: [TypeAccess] PropertyReferenceDelegatesKt
2727
# 87| 0: [VarAccess] extDelegated$delegate
28-
# 1| 1: [ThisAccess] this
28+
# 1| 1: [ExtensionReceiverAccess] this
2929
# 87| 2: [PropertyRefExpr] ...::...
3030
# 87| -4: [AnonymousClass] new KMutableProperty1<MyClass,Integer>(...) { ... }
3131
# 87| 1: [Constructor]
@@ -60,7 +60,7 @@ delegatedProperties.kt:
6060
# 87| -2: [TypeAccess] Integer
6161
# 87| -1: [TypeAccess] PropertyReferenceDelegatesKt
6262
# 87| 0: [VarAccess] extDelegated$delegate
63-
# 1| 1: [ThisAccess] this
63+
# 1| 1: [ExtensionReceiverAccess] this
6464
# 87| 2: [PropertyRefExpr] ...::...
6565
# 87| -4: [AnonymousClass] new KMutableProperty1<MyClass,Integer>(...) { ... }
6666
# 87| 1: [Constructor]
@@ -2800,7 +2800,7 @@ funcExprs.kt:
28002800
# 26| 5: [BlockStmt] { ... }
28012801
# 26| 0: [ReturnStmt] return ...
28022802
# 26| 0: [AddExpr] ... + ...
2803-
# 26| 0: [ThisAccess] this
2803+
# 26| 0: [ExtensionReceiverAccess] this
28042804
# 26| 1: [VarAccess] a
28052805
# 26| -3: [TypeAccess] Function2<Integer,Integer,Integer>
28062806
# 26| 0: [TypeAccess] Integer
@@ -4019,7 +4019,7 @@ samConversion.kt:
40194019
# 7| 0: [ReturnStmt] return ...
40204020
# 7| 0: [MethodAccess] invoke(...)
40214021
# 7| -1: [VarAccess] <fn>
4022-
# 7| 0: [VarAccess] <this>
4022+
# 7| 0: [ExtensionReceiverAccess] this
40234023
# 7| 1: [VarAccess] i
40244024
# 7| -3: [TypeAccess] InterfaceFnExt1
40254025
# 7| 0: [LambdaExpr] ...->...
@@ -4034,7 +4034,7 @@ samConversion.kt:
40344034
# 7| 5: [BlockStmt] { ... }
40354035
# 7| 0: [ReturnStmt] return ...
40364036
# 7| 0: [ValueEQExpr] ... (value equals) ...
4037-
# 7| 0: [ThisAccess] this
4037+
# 7| 0: [ExtensionReceiverAccess] this
40384038
# 7| 1: [StringLiteral]
40394039
# 7| -3: [TypeAccess] Function2<String,Integer,Boolean>
40404040
# 7| 0: [TypeAccess] String

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | ThisAccess |
2626
| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | ThisAccess |
2727
| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:79:18:79:38 | getMax | ThisAccess |
28-
| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:87:31:87:46 | getExtDelegated | ThisAccess |
29-
| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:87:31:87:46 | setExtDelegated | ThisAccess |
28+
| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:87:31:87:46 | getExtDelegated | ExtensionReceiverAccess |
29+
| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:87:31:87:46 | setExtDelegated | ExtensionReceiverAccess |
3030
| delegatedProperties.kt:6:24:9:9 | ...::... | delegatedProperties.kt:6:24:9:9 | <get-prop1> | PropertyRefExpr |
3131
| delegatedProperties.kt:6:24:9:9 | <get-prop1>(...) | delegatedProperties.kt:6:24:9:9 | get | MethodAccess |
3232
| delegatedProperties.kt:6:24:9:9 | Integer | delegatedProperties.kt:6:24:9:9 | <get-prop1> | TypeAccess |
@@ -1446,7 +1446,7 @@
14461446
| funcExprs.kt:26:28:26:44 | Integer | funcExprs.kt:15:1:46:1 | call | TypeAccess |
14471447
| funcExprs.kt:26:28:26:44 | Integer | funcExprs.kt:15:1:46:1 | call | TypeAccess |
14481448
| funcExprs.kt:26:28:26:44 | Integer | funcExprs.kt:15:1:46:1 | call | TypeAccess |
1449-
| funcExprs.kt:26:35:26:38 | this | funcExprs.kt:26:28:26:44 | invoke | ThisAccess |
1449+
| funcExprs.kt:26:35:26:38 | this | funcExprs.kt:26:28:26:44 | invoke | ExtensionReceiverAccess |
14501450
| funcExprs.kt:26:35:26:42 | ... + ... | funcExprs.kt:26:28:26:44 | invoke | AddExpr |
14511451
| funcExprs.kt:26:42:26:42 | a | funcExprs.kt:26:28:26:44 | invoke | VarAccess |
14521452
| funcExprs.kt:27:5:27:51 | functionExpression4(...) | funcExprs.kt:15:1:46:1 | call | MethodAccess |
@@ -2154,7 +2154,6 @@
21542154
| samConversion.kt:7:13:7:46 | ...=... | samConversion.kt:7:13:7:46 | | AssignExpr |
21552155
| samConversion.kt:7:13:7:46 | <fn> | samConversion.kt:7:13:7:46 | | VarAccess |
21562156
| samConversion.kt:7:13:7:46 | <fn> | samConversion.kt:27:5:27:35 | ext | VarAccess |
2157-
| samConversion.kt:7:13:7:46 | <this> | samConversion.kt:27:5:27:35 | ext | VarAccess |
21582157
| samConversion.kt:7:13:7:46 | Boolean | file://:0:0:0:0 | <none> | TypeAccess |
21592158
| samConversion.kt:7:13:7:46 | Function2<String,Integer,Boolean> | file://:0:0:0:0 | <none> | TypeAccess |
21602159
| samConversion.kt:7:13:7:46 | Integer | file://:0:0:0:0 | <none> | TypeAccess |
@@ -2165,13 +2164,14 @@
21652164
| samConversion.kt:7:13:7:46 | invoke(...) | samConversion.kt:27:5:27:35 | ext | MethodAccess |
21662165
| samConversion.kt:7:13:7:46 | new (...) | samConversion.kt:1:1:14:1 | main | ClassInstanceExpr |
21672166
| samConversion.kt:7:13:7:46 | this | samConversion.kt:7:13:7:46 | | ThisAccess |
2167+
| samConversion.kt:7:13:7:46 | this | samConversion.kt:27:5:27:35 | ext | ExtensionReceiverAccess |
21682168
| samConversion.kt:7:13:7:46 | this.<fn> | samConversion.kt:7:13:7:46 | | VarAccess |
21692169
| samConversion.kt:7:29:7:46 | ...->... | samConversion.kt:1:1:14:1 | main | LambdaExpr |
21702170
| samConversion.kt:7:29:7:46 | Boolean | samConversion.kt:1:1:14:1 | main | TypeAccess |
21712171
| samConversion.kt:7:29:7:46 | Function2<String,Integer,Boolean> | samConversion.kt:1:1:14:1 | main | TypeAccess |
21722172
| samConversion.kt:7:29:7:46 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess |
21732173
| samConversion.kt:7:29:7:46 | String | samConversion.kt:1:1:14:1 | main | TypeAccess |
2174-
| samConversion.kt:7:36:7:39 | this | samConversion.kt:7:29:7:46 | invoke | ThisAccess |
2174+
| samConversion.kt:7:36:7:39 | this | samConversion.kt:7:29:7:46 | invoke | ExtensionReceiverAccess |
21752175
| samConversion.kt:7:36:7:45 | ... (value equals) ... | samConversion.kt:7:29:7:46 | invoke | ValueEQExpr |
21762176
| samConversion.kt:7:44:7:45 | | samConversion.kt:7:29:7:46 | invoke | StringLiteral |
21772177
| samConversion.kt:9:5:13:6 | x | samConversion.kt:1:1:14:1 | main | LocalVariableDeclExpr |

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ reflection.kt:
77
# 47| 5: [BlockStmt] { ... }
88
# 47| 0: [ReturnStmt] return ...
99
# 47| 0: [MethodAccess] get(...)
10-
# 47| -1: [ThisAccess] this
10+
# 47| -1: [ExtensionReceiverAccess] this
1111
# 47| 0: [SubExpr] ... - ...
1212
# 47| 0: [MethodAccess] getLength(...)
13-
# 47| -1: [ThisAccess] this
13+
# 47| -1: [ExtensionReceiverAccess] this
1414
# 47| 1: [IntegerLiteral] 1
1515
# 49| 2: [Method] fn2
1616
# 49| 5: [BlockStmt] { ... }
@@ -69,14 +69,14 @@ reflection.kt:
6969
# 54| 5: [BlockStmt] { ... }
7070
# 54| 0: [ReturnStmt] return ...
7171
# 54| 0: [MethodAccess] toString(...)
72-
# 54| -1: [ThisAccess] this
72+
# 54| -1: [ExtensionReceiverAccess] this
7373
# 56| 4: [ExtensionMethod] ext2
7474
#-----| 4: (Parameters)
7575
# 56| 0: [Parameter] <this>
7676
# 56| 5: [BlockStmt] { ... }
7777
# 56| 0: [ReturnStmt] return ...
7878
# 56| 0: [MethodAccess] toString(...)
79-
# 56| -1: [ThisAccess] this
79+
# 56| -1: [ExtensionReceiverAccess] this
8080
# 94| 5: [Method] fn
8181
#-----| 2: (Generic Parameters)
8282
# 94| 0: [TypeVariable] T

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1+
extensionReceiverAcc
2+
| this.kt:10:42:10:45 | this |
3+
| this.kt:11:42:11:70 | this |
4+
| this.kt:13:53:13:56 | this |
5+
| this.kt:14:46:14:74 | this |
6+
| this.kt:15:53:15:87 | this |
7+
| this.kt:20:42:20:45 | this |
8+
| this.kt:29:38:29:41 | this |
9+
| this.kt:32:38:32:54 | this |
10+
#select
111
| this.kt:5:29:5:32 | this | file://:0:0:0:0 | <none> |
212
| this.kt:6:29:6:38 | this | file://:0:0:0:0 | <none> |
313
| this.kt:7:29:7:38 | Outer.this | this.kt:7:29:7:38 | Outer |
4-
| this.kt:10:42:10:45 | this | file://:0:0:0:0 | <none> |
5-
| this.kt:11:42:11:70 | this | file://:0:0:0:0 | <none> |
6-
| this.kt:13:53:13:56 | this | file://:0:0:0:0 | <none> |
7-
| this.kt:14:46:14:74 | this | file://:0:0:0:0 | <none> |
8-
| this.kt:15:53:15:87 | this | file://:0:0:0:0 | <none> |
9-
| this.kt:20:42:20:45 | this | file://:0:0:0:0 | <none> |
1014
| this.kt:24:34:24:37 | this | file://:0:0:0:0 | <none> |
11-
| this.kt:29:38:29:41 | this | file://:0:0:0:0 | <none> |
1215
| this.kt:30:29:30:38 | Inner.this | this.kt:30:29:30:38 | Inner |
1316
| this.kt:31:29:31:38 | Outer.this | this.kt:31:29:31:38 | Outer |
14-
| this.kt:32:38:32:54 | this | file://:0:0:0:0 | <none> |
1517
| this.kt:37:13:37:22 | Outer.this | this.kt:37:13:37:22 | Outer |
1618
| this.kt:38:13:38:22 | this | file://:0:0:0:0 | <none> |
1719
| this.kt:39:13:39:30 | Outer.this | this.kt:39:13:39:30 | Outer |

java/ql/test/kotlin/library-tests/this/this.ql

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,33 @@ newtype TMaybeElement =
66

77
class MaybeElement extends TMaybeElement {
88
abstract string toString();
9+
910
abstract Location getLocation();
1011
}
1112

1213
class YesMaybeElement extends MaybeElement {
1314
Element e;
1415

1516
YesMaybeElement() { this = TElement(e) }
17+
1618
override string toString() { result = e.toString() }
19+
1720
override Location getLocation() { result = e.getLocation() }
1821
}
1922

2023
class NoMaybeElement extends MaybeElement {
2124
NoMaybeElement() { this = TNoElement() }
2225

2326
override string toString() { result = "<none>" }
27+
2428
override Location getLocation() { none() }
2529
}
2630

2731
MaybeElement qualifier(ThisAccess t) {
28-
if exists(t.getQualifier())
29-
then result = TElement(t.getQualifier())
30-
else result = TNoElement()
32+
if exists(t.getQualifier()) then result = TElement(t.getQualifier()) else result = TNoElement()
3133
}
3234

3335
from ThisAccess t
3436
select t, qualifier(t)
37+
38+
query predicate extensionReceiverAcc(ExtensionReceiverAccess va) { any() }

java/ql/test/kotlin/library-tests/variables/variableAccesses.expected

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,21 @@ varAcc
66
| variables.kt:16:11:16:18 | o |
77
| variables.kt:16:11:16:18 | o |
88
| variables.kt:16:11:16:18 | this.o |
9+
| variables.kt:24:9:24:9 | this |
10+
| variables.kt:25:9:25:9 | this |
11+
| variables.kt:27:9:27:12 | this |
12+
| variables.kt:28:9:28:12 | this |
13+
extensionReceiverAcc
14+
| variables.kt:24:9:24:9 | this |
15+
| variables.kt:25:9:25:9 | this |
16+
| variables.kt:27:9:27:12 | this |
17+
| variables.kt:28:9:28:12 | this |
918
instAcc
1019
| variables.kt:3:5:3:21 | this |
1120
| variables.kt:16:11:16:18 | this |
1221
| variables.kt:21:9:21:9 | this |
1322
| variables.kt:21:11:21:15 | this |
14-
| variables.kt:24:9:24:9 | this |
15-
| variables.kt:25:9:25:9 | this |
1623
| variables.kt:26:9:26:12 | C2.this |
17-
| variables.kt:27:9:27:12 | this |
18-
| variables.kt:28:9:28:12 | this |
1924
| variables.kt:31:9:31:15 | C2.this |
2025
| variables.kt:32:9:32:15 | C2.this |
2126
| variables.kt:41:13:41:16 | this |

java/ql/test/kotlin/library-tests/variables/variableAccesses.ql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import java
22

33
query predicate varAcc(VarAccess va) { any() }
44

5+
query predicate extensionReceiverAcc(ExtensionReceiverAccess va) { any() }
6+
57
query predicate instAcc(InstanceAccess ia) { any() }
68

79
query predicate instAccQualifier(InstanceAccess ia, Expr e) { ia.getQualifier() = e }

0 commit comments

Comments
 (0)