Fix this and qualified this parameter extraction

This commit is contained in:
Tamas Vajk
2021-09-23 09:24:03 +02:00
committed by Ian Lynagh
parent 575e5134bb
commit 7d8b6bac06
9 changed files with 133 additions and 8 deletions

View File

@@ -360,9 +360,6 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
}
}
c.declarations.map { extractDeclaration(it, Optional.of(id)) }
if (c.thisReceiver != null) {
logger.warnElement(Severity.ErrorSevere, "'thisReceiver' is not extracted", c)
}
return id
}
@@ -415,11 +412,22 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
private fun getValueParameterLabel(vp: IrValueParameter) : String {
@Suppress("UNCHECKED_CAST")
val parentId: Label<out DbMethod> = useDeclarationParent(vp.parent) as Label<out DbMethod>
val idx = vp.index
var idx = vp.index
if (isQualifiedThis(vp)) {
idx = -2
}
val label = "@\"params;{$parentId};$idx\""
return label
}
private fun isQualifiedThis(vp: IrValueParameter) : Boolean {
val parent = vp.parent
return vp.index == -1 &&
parent is IrFunction &&
parent.dispatchReceiverParameter == vp &&
parent.extensionReceiverParameter != null
}
fun useValueParameter(vp: IrValueParameter): Label<out DbParam> {
val label = getValueParameterLabel(vp)
val id = tw.getLabelFor<DbParam>(label)
@@ -450,12 +458,15 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
extractValueParameter(vp, id, i)
}
if (f.dispatchReceiverParameter != null) {
extractValueParameter(f.dispatchReceiverParameter!!, id, -1)
var index = -1
val extReceiver = f.extensionReceiverParameter
if (extReceiver != null) {
extractValueParameter(extReceiver, id, index--)
}
if (f.extensionReceiverParameter != null) {
extractValueParameter(f.extensionReceiverParameter!!, id, -1)
val dispReceiver = f.dispatchReceiverParameter
if (dispReceiver != null) {
extractValueParameter(dispReceiver, id, index)
}
}
@@ -701,6 +712,10 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
val typeId = useType(e.type)
val locId = tw.getLocation(e)
tw.writeExprs_thisaccess(id, typeId, parent, idx)
if (isQualifiedThis(owner)) {
// todo: add type access as child of 'id' at index 0
logger.warnElement(Severity.ErrorSevere, "TODO: Qualified this access found.", e)
}
tw.writeHasLocation(id, locId)
} else {
val id = tw.getFreshIdLabel<DbVaraccess>()

View File

@@ -4,6 +4,12 @@
| methods2.kt:7:1:10:1 | hashCode |
| methods2.kt:7:1:10:1 | toString |
| methods2.kt:8:5:9:5 | fooBarClassMethod |
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod |
| methods3.kt:5:1:7:1 | <init> |
| methods3.kt:5:1:7:1 | equals |
| methods3.kt:5:1:7:1 | hashCode |
| methods3.kt:5:1:7:1 | toString |
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod |
| methods.kt:2:1:3:1 | topLevelMethod |
| methods.kt:5:1:13:1 | <init> |
| methods.kt:5:1:13:1 | equals |

View File

@@ -0,0 +1,7 @@
package foo.bar
fun Int.fooBarTopLevelMethod(x: Int) {}
class Class3 {
fun Int.fooBarTopLevelMethod(x: Int) {}
}

View File

@@ -0,0 +1,30 @@
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | methods2.kt:4:26:4:31 | x | 0 |
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | methods2.kt:4:34:4:39 | y | 1 |
| methods2.kt:7:1:10:1 | equals | methods2.kt:7:1:10:1 | <this> | -1 |
| methods2.kt:7:1:10:1 | equals | methods2.kt:7:1:10:1 | other | 0 |
| methods2.kt:7:1:10:1 | hashCode | methods2.kt:7:1:10:1 | <this> | -1 |
| methods2.kt:7:1:10:1 | toString | methods2.kt:7:1:10:1 | <this> | -1 |
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:5:9:5 | <this> | -1 |
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:27:8:32 | x | 0 |
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:35:8:40 | y | 1 |
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:5:3:7 | <this> | -1 |
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:30:3:35 | x | 0 |
| methods3.kt:5:1:7:1 | equals | methods3.kt:5:1:7:1 | <this> | -1 |
| methods3.kt:5:1:7:1 | equals | methods3.kt:5:1:7:1 | other | 0 |
| methods3.kt:5:1:7:1 | hashCode | methods3.kt:5:1:7:1 | <this> | -1 |
| methods3.kt:5:1:7:1 | toString | methods3.kt:5:1:7:1 | <this> | -1 |
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:5:6:43 | <this> | -2 |
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:9:6:11 | <this> | -1 |
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:34:6:39 | x | 0 |
| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:20:2:25 | x | 0 |
| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:28:2:33 | y | 1 |
| methods.kt:5:1:13:1 | equals | methods.kt:5:1:13:1 | <this> | -1 |
| methods.kt:5:1:13:1 | equals | methods.kt:5:1:13:1 | other | 0 |
| methods.kt:5:1:13:1 | hashCode | methods.kt:5:1:13:1 | <this> | -1 |
| methods.kt:5:1:13:1 | toString | methods.kt:5:1:13:1 | <this> | -1 |
| methods.kt:6:5:7:5 | classMethod | methods.kt:6:5:7:5 | <this> | -1 |
| methods.kt:6:5:7:5 | classMethod | methods.kt:6:21:6:26 | x | 0 |
| methods.kt:6:5:7:5 | classMethod | methods.kt:6:29:6:34 | y | 1 |
| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:5:12:5 | <this> | -1 |
| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:28:9:33 | a | 0 |
| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:36:9:41 | b | 1 |

View File

@@ -0,0 +1,5 @@
import java
from Method m, Parameter p, int i
where m.getParameter(i) = p
select m, p, i

View File

@@ -0,0 +1,11 @@
varAcc
instAcc
| variables.kt:21:11:21:15 | this |
| variables.kt:24:9:24:8 | this |
| variables.kt:25:9:25:8 | this |
| variables.kt:26:9:26:12 | this |
| variables.kt:27:9:27:12 | this |
| variables.kt:28:9:28:12 | this |
| variables.kt:31:9:31:15 | this |
| variables.kt:32:9:32:15 | this |
instAccQualifier

View File

@@ -0,0 +1,7 @@
import java
query predicate varAcc(VarAccess va) { any() }
query predicate instAcc(InstanceAccess ia) { any() }
query predicate instAccQualifier(InstanceAccess ia, Expr e) { ia.getQualifier() = e }

View File

@@ -1,5 +1,26 @@
| variables.kt:2:1:8:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:2:1:8:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:2:1:8:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:2:1:8:1 | other | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:3:5:3:21 | prop | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
| variables.kt:5:5:7:5 | <this> | variables.kt:2:1:8:1 | Foo | file://:0:0:0:0 | <none> |
| variables.kt:5:20:5:29 | param | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
| variables.kt:6:9:6:25 | int local | file://:0:0:0:0 | int | variables.kt:6:21:6:25 | ... + ... |
| variables.kt:10:1:10:21 | topLevel | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
| variables.kt:12:1:15:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:12:1:15:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:12:1:15:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:12:1:15:1 | other | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:13:5:13:15 | <this> | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
| variables.kt:14:5:14:15 | <this> | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
| variables.kt:16:1:34:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:16:1:34:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:16:1:34:1 | <this> | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:16:1:34:1 | other | file://:0:0:0:0 | Any | file://:0:0:0:0 | <none> |
| variables.kt:16:11:16:18 | o | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
| variables.kt:16:11:16:18 | o | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
| variables.kt:17:5:17:15 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
| variables.kt:18:5:18:15 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
| variables.kt:20:5:22:5 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
| variables.kt:23:5:33:5 | <this> | variables.kt:16:1:34:1 | C2 | file://:0:0:0:0 | <none> |
| variables.kt:23:9:23:10 | <this> | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |

View File

@@ -9,3 +9,26 @@ class Foo {
val topLevel: Int = 1
class C1 {
fun f1() {}
fun f2() {}
}
class C2 (val o:C1) {
fun f1() {}
fun f3() {}
fun f4() {
o.ext();
}
fun C1.ext() {
f1() // calls method defined in C1 class
f2()
f3()
this.f1() // extensionReceiverParameter
this.f2() // extensionReceiverParameter
// calls method defined in C2 class
this@C2.f1() // dispatchReceiverParameter
this@C2.f3() // dispatchReceiverParameter
}
}