Skip to content

Commit 486e8fe

Browse files
Kotlin: test context parameter extraction
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent e4084d7 commit 486e8fe

5 files changed

Lines changed: 55 additions & 0 deletions

File tree

java/ql/test-kotlin2/library-tests/context-parameters/DB-CHECK.expected

Whitespace-only changes.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
parameters
2+
| test.kt:8:1:8:45 | logged | test.kt:7:9:7:22 | logger | 0 | Logger |
3+
| test.kt:8:1:8:45 | logged | test.kt:8:12:8:24 | value | 1 | String |
4+
| test.kt:12:5:12:28 | getLogged | test.kt:10:9:10:22 | logger | 1 | Logger |
5+
| test.kt:12:5:12:28 | getLogged | test.kt:11:5:11:10 | <this> | 0 | String |
6+
calls
7+
| test.kt:15:5:15:21 | logged(...) | test.kt:14:43:16:1 | invoke | test.kt:8:1:8:45 | logged | test.kt:15:5:15:21 | TestKt | 2 |
8+
| test.kt:15:5:15:28 | getLogged(...) | test.kt:14:43:16:1 | invoke | test.kt:12:5:12:28 | getLogged | test.kt:15:5:15:28 | TestKt | 2 |
9+
arguments
10+
| test.kt:15:5:15:21 | logged(...) | 0 | test.kt:0:0:0:0 | p0 |
11+
| test.kt:15:5:15:21 | logged(...) | 1 | test.kt:15:12:15:20 | "message" |
12+
| test.kt:15:5:15:28 | getLogged(...) | 0 | test.kt:15:5:15:21 | logged(...) |
13+
| test.kt:15:5:15:28 | getLogged(...) | 1 | test.kt:0:0:0:0 | p0 |
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// codeql-extractor-kotlin-options: -language-version 2.4 -Xcontext-parameters
2+
3+
class Logger {
4+
fun log(value: String) = value
5+
}
6+
7+
context(logger: Logger)
8+
fun logged(value: String) = logger.log(value)
9+
10+
context(logger: Logger)
11+
val String.logged: String
12+
get() = logger.log(this)
13+
14+
fun use(logger: Logger) = context(logger) {
15+
logged("message").logged
16+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java
2+
3+
predicate isContextCallable(Callable c) { c.getName() = ["logged", "getLogged"] }
4+
5+
query predicate parameters(Callable callable, Parameter parameter, int index, string parameterType) {
6+
isContextCallable(callable) and
7+
parameter = callable.getParameter(index) and
8+
parameterType = parameter.getType().toString()
9+
}
10+
11+
query predicate calls(
12+
MethodCall call, Callable caller, Method target, Expr qualifier, int argumentCount
13+
) {
14+
caller.fromSource() and
15+
call.getEnclosingCallable() = caller and
16+
target = call.getMethod() and
17+
isContextCallable(target) and
18+
qualifier = call.getQualifier() and
19+
argumentCount = call.getNumArgument()
20+
}
21+
22+
query predicate arguments(MethodCall call, int index, Expr argument) {
23+
isContextCallable(call.getMethod()) and
24+
argument = call.getArgument(index)
25+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
test.ql

0 commit comments

Comments
 (0)