mirror of
https://github.com/github/codeql.git
synced 2026-05-03 04:39:29 +02:00
Fix this and qualified this parameter extraction
This commit is contained in:
@@ -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>()
|
||||
|
||||
@@ -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 |
|
||||
|
||||
7
java/ql/test/kotlin/library-tests/methods/methods3.kt
Normal file
7
java/ql/test/kotlin/library-tests/methods/methods3.kt
Normal file
@@ -0,0 +1,7 @@
|
||||
package foo.bar
|
||||
|
||||
fun Int.fooBarTopLevelMethod(x: Int) {}
|
||||
|
||||
class Class3 {
|
||||
fun Int.fooBarTopLevelMethod(x: Int) {}
|
||||
}
|
||||
@@ -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 |
|
||||
5
java/ql/test/kotlin/library-tests/methods/parameters.ql
Normal file
5
java/ql/test/kotlin/library-tests/methods/parameters.ql
Normal file
@@ -0,0 +1,5 @@
|
||||
import java
|
||||
|
||||
from Method m, Parameter p, int i
|
||||
where m.getParameter(i) = p
|
||||
select m, p, i
|
||||
@@ -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
|
||||
@@ -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 }
|
||||
@@ -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> |
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user