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

Skip to content

Commit 7d8b6ba

Browse files
tamasvajkigfoo
authored andcommitted
Fix this and qualified this parameter extraction
1 parent 575e513 commit 7d8b6ba

9 files changed

Lines changed: 133 additions & 8 deletions

File tree

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

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,6 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
360360
}
361361
}
362362
c.declarations.map { extractDeclaration(it, Optional.of(id)) }
363-
if (c.thisReceiver != null) {
364-
logger.warnElement(Severity.ErrorSevere, "'thisReceiver' is not extracted", c)
365-
}
366363
return id
367364
}
368365

@@ -415,11 +412,22 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
415412
private fun getValueParameterLabel(vp: IrValueParameter) : String {
416413
@Suppress("UNCHECKED_CAST")
417414
val parentId: Label<out DbMethod> = useDeclarationParent(vp.parent) as Label<out DbMethod>
418-
val idx = vp.index
415+
var idx = vp.index
416+
if (isQualifiedThis(vp)) {
417+
idx = -2
418+
}
419419
val label = "@\"params;{$parentId};$idx\""
420420
return label
421421
}
422422

423+
private fun isQualifiedThis(vp: IrValueParameter) : Boolean {
424+
val parent = vp.parent
425+
return vp.index == -1 &&
426+
parent is IrFunction &&
427+
parent.dispatchReceiverParameter == vp &&
428+
parent.extensionReceiverParameter != null
429+
}
430+
423431
fun useValueParameter(vp: IrValueParameter): Label<out DbParam> {
424432
val label = getValueParameterLabel(vp)
425433
val id = tw.getLabelFor<DbParam>(label)
@@ -450,12 +458,15 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
450458
extractValueParameter(vp, id, i)
451459
}
452460

453-
if (f.dispatchReceiverParameter != null) {
454-
extractValueParameter(f.dispatchReceiverParameter!!, id, -1)
461+
var index = -1
462+
val extReceiver = f.extensionReceiverParameter
463+
if (extReceiver != null) {
464+
extractValueParameter(extReceiver, id, index--)
455465
}
456466

457-
if (f.extensionReceiverParameter != null) {
458-
extractValueParameter(f.extensionReceiverParameter!!, id, -1)
467+
val dispReceiver = f.dispatchReceiverParameter
468+
if (dispReceiver != null) {
469+
extractValueParameter(dispReceiver, id, index)
459470
}
460471
}
461472

@@ -701,6 +712,10 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
701712
val typeId = useType(e.type)
702713
val locId = tw.getLocation(e)
703714
tw.writeExprs_thisaccess(id, typeId, parent, idx)
715+
if (isQualifiedThis(owner)) {
716+
// todo: add type access as child of 'id' at index 0
717+
logger.warnElement(Severity.ErrorSevere, "TODO: Qualified this access found.", e)
718+
}
704719
tw.writeHasLocation(id, locId)
705720
} else {
706721
val id = tw.getFreshIdLabel<DbVaraccess>()

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
| methods2.kt:7:1:10:1 | hashCode |
55
| methods2.kt:7:1:10:1 | toString |
66
| methods2.kt:8:5:9:5 | fooBarClassMethod |
7+
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod |
8+
| methods3.kt:5:1:7:1 | <init> |
9+
| methods3.kt:5:1:7:1 | equals |
10+
| methods3.kt:5:1:7:1 | hashCode |
11+
| methods3.kt:5:1:7:1 | toString |
12+
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod |
713
| methods.kt:2:1:3:1 | topLevelMethod |
814
| methods.kt:5:1:13:1 | <init> |
915
| methods.kt:5:1:13:1 | equals |
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package foo.bar
2+
3+
fun Int.fooBarTopLevelMethod(x: Int) {}
4+
5+
class Class3 {
6+
fun Int.fooBarTopLevelMethod(x: Int) {}
7+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | methods2.kt:4:26:4:31 | x | 0 |
2+
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | methods2.kt:4:34:4:39 | y | 1 |
3+
| methods2.kt:7:1:10:1 | equals | methods2.kt:7:1:10:1 | <this> | -1 |
4+
| methods2.kt:7:1:10:1 | equals | methods2.kt:7:1:10:1 | other | 0 |
5+
| methods2.kt:7:1:10:1 | hashCode | methods2.kt:7:1:10:1 | <this> | -1 |
6+
| methods2.kt:7:1:10:1 | toString | methods2.kt:7:1:10:1 | <this> | -1 |
7+
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:5:9:5 | <this> | -1 |
8+
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:27:8:32 | x | 0 |
9+
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:35:8:40 | y | 1 |
10+
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:5:3:7 | <this> | -1 |
11+
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:30:3:35 | x | 0 |
12+
| methods3.kt:5:1:7:1 | equals | methods3.kt:5:1:7:1 | <this> | -1 |
13+
| methods3.kt:5:1:7:1 | equals | methods3.kt:5:1:7:1 | other | 0 |
14+
| methods3.kt:5:1:7:1 | hashCode | methods3.kt:5:1:7:1 | <this> | -1 |
15+
| methods3.kt:5:1:7:1 | toString | methods3.kt:5:1:7:1 | <this> | -1 |
16+
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:5:6:43 | <this> | -2 |
17+
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:9:6:11 | <this> | -1 |
18+
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:34:6:39 | x | 0 |
19+
| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:20:2:25 | x | 0 |
20+
| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:28:2:33 | y | 1 |
21+
| methods.kt:5:1:13:1 | equals | methods.kt:5:1:13:1 | <this> | -1 |
22+
| methods.kt:5:1:13:1 | equals | methods.kt:5:1:13:1 | other | 0 |
23+
| methods.kt:5:1:13:1 | hashCode | methods.kt:5:1:13:1 | <this> | -1 |
24+
| methods.kt:5:1:13:1 | toString | methods.kt:5:1:13:1 | <this> | -1 |
25+
| methods.kt:6:5:7:5 | classMethod | methods.kt:6:5:7:5 | <this> | -1 |
26+
| methods.kt:6:5:7:5 | classMethod | methods.kt:6:21:6:26 | x | 0 |
27+
| methods.kt:6:5:7:5 | classMethod | methods.kt:6:29:6:34 | y | 1 |
28+
| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:5:12:5 | <this> | -1 |
29+
| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:28:9:33 | a | 0 |
30+
| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:36:9:41 | b | 1 |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import java
2+
3+
from Method m, Parameter p, int i
4+
where m.getParameter(i) = p
5+
select m, p, i
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
varAcc
2+
instAcc
3+
| variables.kt:21:11:21:15 | this |
4+
| variables.kt:24:9:24:8 | this |
5+
| variables.kt:25:9:25:8 | this |
6+
| variables.kt:26:9:26:12 | this |
7+
| variables.kt:27:9:27:12 | this |
8+
| variables.kt:28:9:28:12 | this |
9+
| variables.kt:31:9:31:15 | this |
10+
| variables.kt:32:9:32:15 | this |
11+
instAccQualifier
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import java
2+
3+
query predicate varAcc(VarAccess va) { any() }
4+
5+
query predicate instAcc(InstanceAccess ia) { any() }
6+
7+
query predicate instAccQualifier(InstanceAccess ia, Expr e) { ia.getQualifier() = e }
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
1+
| variables.kt:2:1:8:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
2+
| variables.kt:2:1:8:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
3+
| variables.kt:2:1:8:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
14
| variables.kt:2:1:8:1 | other | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
25
| variables.kt:3:5:3:21 | prop | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
6+
| variables.kt:5:5:7:5 | <this> | variables.kt:2:1:8:1 | Foo | file://:0:0:0:0 | <none> |
37
| variables.kt:5:20:5:29 | param | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
48
| variables.kt:6:9:6:25 | int local | file://:0:0:0:0 | int | variables.kt:6:21:6:25 | ... + ... |
59
| variables.kt:10:1:10:21 | topLevel | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
10+
| variables.kt:12:1:15:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
11+
| variables.kt:12:1:15:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
12+
| variables.kt:12:1:15:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
13+
| variables.kt:12:1:15:1 | other | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
14+
| variables.kt:13:5:13:15 | <this> | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
15+
| variables.kt:14:5:14:15 | <this> | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
16+
| variables.kt:16:1:34:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
17+
| variables.kt:16:1:34:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
18+
| variables.kt:16:1:34:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
19+
| variables.kt:16:1:34:1 | other | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
20+
| variables.kt:16:11:16:18 | o | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
21+
| variables.kt:16:11:16:18 | o | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
22+
| variables.kt:17:5:17:15 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
23+
| variables.kt:18:5:18:15 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
24+
| variables.kt:20:5:22:5 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
25+
| variables.kt:23:5:33:5 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
26+
| variables.kt:23:9:23:10 | <this> | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,26 @@ class Foo {
99

1010
val topLevel: Int = 1
1111

12+
class C1 {
13+
fun f1() {}
14+
fun f2() {}
15+
}
16+
class C2 (val o:C1) {
17+
fun f1() {}
18+
fun f3() {}
19+
20+
fun f4() {
21+
o.ext();
22+
}
23+
fun C1.ext() {
24+
f1() // calls method defined in C1 class
25+
f2()
26+
f3()
27+
this.f1() // extensionReceiverParameter
28+
this.f2() // extensionReceiverParameter
29+
30+
// calls method defined in C2 class
31+
this@C2.f1() // dispatchReceiverParameter
32+
this@C2.f3() // dispatchReceiverParameter
33+
}
34+
}

0 commit comments

Comments
 (0)