Skip to content

Commit cf34dbd

Browse files
committed
Kotlin: format string literals like the Java annotaton extractor
Java's regular strings are formatted as they appear in source, but we don't easily have this information available in Kotlin. During annotation extraction however it guesses a source rendering because the source is not necessarily available. By formatting to match the annotation extractor, we prepare to ensure consistency with a Java database when extracting annotations as seen by Kotlin.
1 parent ac54da7 commit cf34dbd

File tree

35 files changed

+320
-299
lines changed

35 files changed

+320
-299
lines changed

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3395,6 +3395,23 @@ open class KotlinFileExtractor(
33953395
extractExprContext(it, locId, callable, enclosingStmt)
33963396
}
33973397

3398+
private fun escapeCharForQuotedLiteral(c: Char) =
3399+
when (c) {
3400+
'\r' -> "\\r"
3401+
'\n' -> "\\n"
3402+
'\t' -> "\\t"
3403+
'\\' -> "\\\\"
3404+
'"' -> "\\\""
3405+
else -> c.toString()
3406+
}
3407+
3408+
// Render a string literal as it might occur in Kotlin source. Note this is a reasonable guess; the real source
3409+
// could use other escape sequences to describe the same String. Importantly, this is the same guess the Java
3410+
// extractor makes regarding string literals occurring within annotations, which we need to coincide with to ensure
3411+
// database consistency.
3412+
private fun toQuotedLiteral(s: String) =
3413+
s.toCharArray().joinToString(separator = "", prefix = "\"", postfix = "\"") { c -> escapeCharForQuotedLiteral(c) }
3414+
33983415
private fun extractExpression(e: IrExpression, callable: Label<out DbCallable>, parent: StmtExprParent) {
33993416
with("expression", e) {
34003417
when(e) {
@@ -3602,7 +3619,7 @@ open class KotlinFileExtractor(
36023619
tw.writeExprs_stringliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
36033620
tw.writeExprsKotlinType(id, type.kotlinResult.id)
36043621
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
3605-
tw.writeNamestrings(v.toString(), v.toString(), id)
3622+
tw.writeNamestrings(toQuotedLiteral(v.toString()), v.toString(), id)
36063623
}
36073624
v == null -> {
36083625
extractNull(e.type, tw.getLocation(e), exprParent.parent, exprParent.idx, callable, exprParent.enclosingStmt)

java/ql/integration-tests/all-platforms/kotlin/gradle_kotlinx_serialization/PrintAst.expected

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,15 @@ app/src/main/kotlin/testProject/App.kt:
180180
# 0| 5: [BlockStmt] { ... }
181181
# 0| 0: [ReturnStmt] return ...
182182
# 0| 0: [StringTemplateExpr] "..."
183-
# 0| 0: [StringLiteral] Project(
184-
# 0| 1: [StringLiteral] name=
183+
# 0| 0: [StringLiteral] "Project("
184+
# 0| 1: [StringLiteral] "name="
185185
# 0| 2: [VarAccess] this.name
186186
# 0| -1: [ThisAccess] this
187-
# 0| 3: [StringLiteral] ,
188-
# 0| 4: [StringLiteral] language=
187+
# 0| 3: [StringLiteral] ", "
188+
# 0| 4: [StringLiteral] "language="
189189
# 0| 5: [VarAccess] this.language
190190
# 0| -1: [ThisAccess] this
191-
# 0| 6: [StringLiteral] )
191+
# 0| 6: [StringLiteral] ")"
192192
# 0| 9: [Method] write$Self
193193
# 0| 3: [TypeAccess] Unit
194194
#-----| 4: (Parameters)
@@ -405,19 +405,19 @@ app/src/main/kotlin/testProject/App.kt:
405405
# 7| 1: [LocalVariableDeclExpr] tmp0_serialDesc
406406
# 7| 0: [ClassInstanceExpr] new PluginGeneratedSerialDescriptor(...)
407407
# 7| -3: [TypeAccess] PluginGeneratedSerialDescriptor
408-
# 7| 0: [StringLiteral] testProject.Project
408+
# 7| 0: [StringLiteral] "testProject.Project"
409409
# 7| 1: [ThisAccess] $serializer.this
410410
# 7| 0: [TypeAccess] $serializer
411411
# 7| 2: [IntegerLiteral] 2
412412
# 7| 1: [ExprStmt] <Expr>;
413413
# 7| 0: [MethodAccess] addElement(...)
414414
# 7| -1: [VarAccess] tmp0_serialDesc
415-
# 7| 0: [StringLiteral] name
415+
# 7| 0: [StringLiteral] "name"
416416
# 7| 1: [BooleanLiteral] false
417417
# 7| 2: [ExprStmt] <Expr>;
418418
# 7| 0: [MethodAccess] addElement(...)
419419
# 7| -1: [VarAccess] tmp0_serialDesc
420-
# 7| 0: [StringLiteral] language
420+
# 7| 0: [StringLiteral] "language"
421421
# 7| 1: [BooleanLiteral] false
422422
# 7| 3: [ExprStmt] <Expr>;
423423
# 7| 0: [AssignExpr] ...=...
@@ -520,7 +520,7 @@ app/src/main/kotlin/testProject/App.kt:
520520
# 14| 0: [VarAccess] X.this.id
521521
# 14| -1: [ThisAccess] X.this
522522
# 14| 0: [TypeAccess] X
523-
# 16| 1: [StringLiteral] X
523+
# 16| 1: [StringLiteral] "X"
524524
# 14| 1: [WhenBranch] ... -> ...
525525
# 14| 0: [BooleanLiteral] true
526526
# 14| 1: [ExprStmt] <Expr>;
@@ -556,7 +556,7 @@ app/src/main/kotlin/testProject/App.kt:
556556
# 14| 0: [ValueNEExpr] ... (value not-equals) ...
557557
# 14| 0: [MethodAccess] getId(...)
558558
# 14| -1: [VarAccess] self
559-
# 16| 1: [StringLiteral] X
559+
# 16| 1: [StringLiteral] "X"
560560
# 14| 1: [ExprStmt] <Expr>;
561561
# 14| 0: [MethodAccess] encodeStringElement(...)
562562
# 14| -1: [VarAccess] output
@@ -720,14 +720,14 @@ app/src/main/kotlin/testProject/App.kt:
720720
# 14| 1: [LocalVariableDeclExpr] tmp0_serialDesc
721721
# 14| 0: [ClassInstanceExpr] new PluginGeneratedSerialDescriptor(...)
722722
# 14| -3: [TypeAccess] PluginGeneratedSerialDescriptor
723-
# 14| 0: [StringLiteral] testProject.X
723+
# 14| 0: [StringLiteral] "testProject.X"
724724
# 14| 1: [ThisAccess] $serializer.this
725725
# 14| 0: [TypeAccess] $serializer
726726
# 14| 2: [IntegerLiteral] 1
727727
# 14| 1: [ExprStmt] <Expr>;
728728
# 14| 0: [MethodAccess] addElement(...)
729729
# 14| -1: [VarAccess] tmp0_serialDesc
730-
# 14| 0: [StringLiteral] id
730+
# 14| 0: [StringLiteral] "id"
731731
# 14| 1: [BooleanLiteral] true
732732
# 14| 2: [ExprStmt] <Expr>;
733733
# 14| 0: [AssignExpr] ...=...
@@ -764,7 +764,7 @@ app/src/main/kotlin/testProject/App.kt:
764764
# 16| 0: [VarAccess] id
765765
# 16| 6: [FieldDeclaration] String id;
766766
# 16| -1: [TypeAccess] String
767-
# 16| 0: [StringLiteral] X
767+
# 16| 0: [StringLiteral] "X"
768768
# 16| 7: [Method] getId
769769
# 16| 3: [TypeAccess] String
770770
# 16| 5: [BlockStmt] { ... }
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
edges
22
| hasFields.kt:5:5:5:34 | constField : String | ReadsFields.java:5:10:5:29 | HasFields.constField |
3-
| hasFields.kt:5:28:5:34 | taint : String | hasFields.kt:5:5:5:34 | constField : String |
3+
| hasFields.kt:5:28:5:34 | "taint" : String | hasFields.kt:5:5:5:34 | constField : String |
44
| hasFields.kt:7:5:7:38 | lateinitField : String | ReadsFields.java:6:10:6:32 | HasFields.lateinitField |
55
| hasFields.kt:7:14:7:38 | <set-?> : String | hasFields.kt:7:5:7:38 | lateinitField : String |
66
| hasFields.kt:7:14:7:38 | <set-?> : String | hasFields.kt:7:14:7:38 | <set-?> : String |
77
| hasFields.kt:9:5:9:50 | jvmFieldAnnotatedField : String | ReadsFields.java:7:10:7:41 | HasFields.jvmFieldAnnotatedField |
8-
| hasFields.kt:9:44:9:50 | taint : String | hasFields.kt:9:5:9:50 | jvmFieldAnnotatedField : String |
9-
| hasFields.kt:14:22:14:26 | taint : String | hasFields.kt:7:14:7:38 | <set-?> : String |
8+
| hasFields.kt:9:44:9:50 | "taint" : String | hasFields.kt:9:5:9:50 | jvmFieldAnnotatedField : String |
9+
| hasFields.kt:14:22:14:26 | "taint" : String | hasFields.kt:7:14:7:38 | <set-?> : String |
1010
nodes
1111
| ReadsFields.java:5:10:5:29 | HasFields.constField | semmle.label | HasFields.constField |
1212
| ReadsFields.java:6:10:6:32 | HasFields.lateinitField | semmle.label | HasFields.lateinitField |
1313
| ReadsFields.java:7:10:7:41 | HasFields.jvmFieldAnnotatedField | semmle.label | HasFields.jvmFieldAnnotatedField |
1414
| hasFields.kt:5:5:5:34 | constField : String | semmle.label | constField : String |
15-
| hasFields.kt:5:28:5:34 | taint : String | semmle.label | taint : String |
15+
| hasFields.kt:5:28:5:34 | "taint" : String | semmle.label | "taint" : String |
1616
| hasFields.kt:7:5:7:38 | lateinitField : String | semmle.label | lateinitField : String |
1717
| hasFields.kt:7:14:7:38 | <set-?> : String | semmle.label | <set-?> : String |
1818
| hasFields.kt:7:14:7:38 | <set-?> : String | semmle.label | <set-?> : String |
1919
| hasFields.kt:9:5:9:50 | jvmFieldAnnotatedField : String | semmle.label | jvmFieldAnnotatedField : String |
20-
| hasFields.kt:9:44:9:50 | taint : String | semmle.label | taint : String |
21-
| hasFields.kt:14:22:14:26 | taint : String | semmle.label | taint : String |
20+
| hasFields.kt:9:44:9:50 | "taint" : String | semmle.label | "taint" : String |
21+
| hasFields.kt:14:22:14:26 | "taint" : String | semmle.label | "taint" : String |
2222
subpaths
2323
#select
24-
| hasFields.kt:5:28:5:34 | taint : String | hasFields.kt:5:28:5:34 | taint : String | ReadsFields.java:5:10:5:29 | HasFields.constField | flow path |
25-
| hasFields.kt:9:44:9:50 | taint : String | hasFields.kt:9:44:9:50 | taint : String | ReadsFields.java:7:10:7:41 | HasFields.jvmFieldAnnotatedField | flow path |
26-
| hasFields.kt:14:22:14:26 | taint : String | hasFields.kt:14:22:14:26 | taint : String | ReadsFields.java:6:10:6:32 | HasFields.lateinitField | flow path |
24+
| hasFields.kt:5:28:5:34 | "taint" : String | hasFields.kt:5:28:5:34 | "taint" : String | ReadsFields.java:5:10:5:29 | HasFields.constField | flow path |
25+
| hasFields.kt:9:44:9:50 | "taint" : String | hasFields.kt:9:44:9:50 | "taint" : String | ReadsFields.java:7:10:7:41 | HasFields.jvmFieldAnnotatedField | flow path |
26+
| hasFields.kt:14:22:14:26 | "taint" : String | hasFields.kt:14:22:14:26 | "taint" : String | ReadsFields.java:6:10:6:32 | HasFields.lateinitField | flow path |

java/ql/integration-tests/all-platforms/kotlin/nested_generic_types/test.expected

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ callArgs
7676
| KotlinUser.kt:10:34:10:65 | new InnerGeneric<String>(...) | KotlinUser.kt:10:14:10:32 | new OuterGeneric<Integer>(...) | -2 |
7777
| KotlinUser.kt:10:34:10:65 | new InnerGeneric<String>(...) | KotlinUser.kt:10:34:10:65 | InnerGeneric<String> | -3 |
7878
| KotlinUser.kt:10:34:10:65 | new InnerGeneric<String>(...) | KotlinUser.kt:10:47:10:49 | a | 0 |
79-
| KotlinUser.kt:10:34:10:65 | new InnerGeneric<String>(...) | KotlinUser.kt:10:53:10:63 | hello world | 1 |
79+
| KotlinUser.kt:10:34:10:65 | new InnerGeneric<String>(...) | KotlinUser.kt:10:53:10:63 | "hello world" | 1 |
8080
| KotlinUser.kt:11:13:11:31 | new OuterGeneric<Integer>(...) | KotlinUser.kt:11:13:11:31 | OuterGeneric<Integer> | -3 |
8181
| KotlinUser.kt:11:33:11:49 | new InnerNotGeneric<>(...) | KotlinUser.kt:11:13:11:31 | new OuterGeneric<Integer>(...) | -2 |
8282
| KotlinUser.kt:11:33:11:49 | new InnerNotGeneric<>(...) | KotlinUser.kt:11:33:11:49 | InnerNotGeneric<> | -3 |
@@ -88,10 +88,10 @@ callArgs
8888
| KotlinUser.kt:13:31:13:52 | new InnerGeneric<String>(...) | KotlinUser.kt:13:31:13:52 | InnerGeneric<String> | -3 |
8989
| KotlinUser.kt:14:26:14:63 | new InnerStaticGeneric<String>(...) | KotlinUser.kt:14:26:14:63 | InnerStaticGeneric<String> | -3 |
9090
| KotlinUser.kt:14:26:14:63 | new InnerStaticGeneric<String>(...) | KotlinUser.kt:14:45:14:47 | a | 0 |
91-
| KotlinUser.kt:14:26:14:63 | new InnerStaticGeneric<String>(...) | KotlinUser.kt:14:51:14:61 | hello world | 1 |
91+
| KotlinUser.kt:14:26:14:63 | new InnerStaticGeneric<String>(...) | KotlinUser.kt:14:51:14:61 | "hello world" | 1 |
9292
| KotlinUser.kt:15:13:15:39 | new OuterManyParams<Integer,String>(...) | KotlinUser.kt:15:13:15:39 | OuterManyParams<Integer,String> | -3 |
9393
| KotlinUser.kt:15:13:15:39 | new OuterManyParams<Integer,String>(...) | KotlinUser.kt:15:29:15:29 | 1 | 0 |
94-
| KotlinUser.kt:15:13:15:39 | new OuterManyParams<Integer,String>(...) | KotlinUser.kt:15:33:15:37 | hello | 1 |
94+
| KotlinUser.kt:15:13:15:39 | new OuterManyParams<Integer,String>(...) | KotlinUser.kt:15:33:15:37 | "hello" | 1 |
9595
| KotlinUser.kt:15:41:15:67 | new MiddleManyParams<Float,Double>(...) | KotlinUser.kt:15:13:15:39 | new OuterManyParams<Integer,String>(...) | -2 |
9696
| KotlinUser.kt:15:41:15:67 | new MiddleManyParams<Float,Double>(...) | KotlinUser.kt:15:41:15:67 | MiddleManyParams<Float,Double> | -3 |
9797
| KotlinUser.kt:15:41:15:67 | new MiddleManyParams<Float,Double>(...) | KotlinUser.kt:15:58:15:61 | 1.0 | 0 |
@@ -103,23 +103,23 @@ callArgs
103103
| KotlinUser.kt:15:89:15:99 | shortValue(...) | KotlinUser.kt:15:89:15:89 | 1 | -1 |
104104
| KotlinUser.kt:17:19:17:44 | returnsecond(...) | KotlinUser.kt:17:19:17:19 | a | -1 |
105105
| KotlinUser.kt:17:19:17:44 | returnsecond(...) | KotlinUser.kt:17:34:17:34 | 0 | 0 |
106-
| KotlinUser.kt:17:19:17:44 | returnsecond(...) | KotlinUser.kt:17:38:17:42 | hello | 1 |
106+
| KotlinUser.kt:17:19:17:44 | returnsecond(...) | KotlinUser.kt:17:38:17:42 | "hello" | 1 |
107107
| KotlinUser.kt:18:20:18:50 | returnsecond(...) | KotlinUser.kt:18:20:18:20 | a | -1 |
108108
| KotlinUser.kt:18:20:18:50 | returnsecond(...) | KotlinUser.kt:18:20:18:50 | Character | -2 |
109109
| KotlinUser.kt:18:20:18:50 | returnsecond(...) | KotlinUser.kt:18:35:18:35 | 0 | 0 |
110-
| KotlinUser.kt:18:20:18:50 | returnsecond(...) | KotlinUser.kt:18:39:18:43 | hello | 1 |
110+
| KotlinUser.kt:18:20:18:50 | returnsecond(...) | KotlinUser.kt:18:39:18:43 | "hello" | 1 |
111111
| KotlinUser.kt:18:20:18:50 | returnsecond(...) | KotlinUser.kt:18:47:18:49 | a | 2 |
112112
| KotlinUser.kt:19:19:19:31 | identity(...) | KotlinUser.kt:19:19:19:19 | b | -1 |
113113
| KotlinUser.kt:19:19:19:31 | identity(...) | KotlinUser.kt:19:30:19:30 | 5 | 0 |
114114
| KotlinUser.kt:20:20:20:39 | identity(...) | KotlinUser.kt:20:20:20:21 | b2 | -1 |
115-
| KotlinUser.kt:20:20:20:39 | identity(...) | KotlinUser.kt:20:33:20:37 | hello | 0 |
115+
| KotlinUser.kt:20:20:20:39 | identity(...) | KotlinUser.kt:20:33:20:37 | "hello" | 0 |
116116
| KotlinUser.kt:21:19:21:37 | identity(...) | KotlinUser.kt:21:19:21:19 | c | -1 |
117-
| KotlinUser.kt:21:19:21:37 | identity(...) | KotlinUser.kt:21:31:21:35 | world | 0 |
117+
| KotlinUser.kt:21:19:21:37 | identity(...) | KotlinUser.kt:21:31:21:35 | "world" | 0 |
118118
| KotlinUser.kt:22:19:22:39 | identity(...) | KotlinUser.kt:22:19:22:19 | d | -1 |
119-
| KotlinUser.kt:22:19:22:39 | identity(...) | KotlinUser.kt:22:31:22:37 | goodbye | 0 |
119+
| KotlinUser.kt:22:19:22:39 | identity(...) | KotlinUser.kt:22:31:22:37 | "goodbye" | 0 |
120120
| KotlinUser.kt:23:19:23:71 | returnSixth(...) | KotlinUser.kt:23:19:23:19 | e | -1 |
121121
| KotlinUser.kt:23:19:23:71 | returnSixth(...) | KotlinUser.kt:23:33:23:33 | 1 | 0 |
122-
| KotlinUser.kt:23:19:23:71 | returnSixth(...) | KotlinUser.kt:23:37:23:41 | hello | 1 |
122+
| KotlinUser.kt:23:19:23:71 | returnSixth(...) | KotlinUser.kt:23:37:23:41 | "hello" | 1 |
123123
| KotlinUser.kt:23:19:23:71 | returnSixth(...) | KotlinUser.kt:23:45:23:48 | 1.0 | 2 |
124124
| KotlinUser.kt:23:19:23:71 | returnSixth(...) | KotlinUser.kt:23:51:23:53 | 1.0 | 3 |
125125
| KotlinUser.kt:23:19:23:71 | returnSixth(...) | KotlinUser.kt:23:56:23:57 | 1 | 4 |

java/ql/integration-tests/linux-only/kotlin/custom_plugin/PrintAst.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ d.kt:
5050
# 1| 1: [Class] D
5151
# 0| 2: [FieldDeclaration] String bar;
5252
# 0| -1: [TypeAccess] String
53-
# 0| 0: [StringLiteral] Foobar
53+
# 0| 0: [StringLiteral] "Foobar"
5454
# 1| 3: [Constructor] D
5555
# 1| 5: [BlockStmt] { ... }
5656
# 1| 0: [SuperConstructorInvocationStmt] super(...)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| d.kt:0:0:0:0 | bar | d.kt:0:0:0:0 | Foobar |
1+
| d.kt:0:0:0:0 | bar | d.kt:0:0:0:0 | "Foobar" |

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,14 @@ classes.kt:
138138
# 39| 0: [ExprStmt] <Expr>;
139139
# 39| 0: [MethodAccess] f(...)
140140
# 39| -1: [TypeAccess] ClassesKt
141-
# 39| 0: [StringLiteral] init1
141+
# 39| 0: [StringLiteral] "init1"
142142
# 42| 1: [ExprStmt] <Expr>;
143143
# 42| 0: [KtInitializerAssignExpr] ...=...
144144
# 42| 0: [VarAccess] x
145145
# 45| 2: [ExprStmt] <Expr>;
146146
# 45| 0: [MethodAccess] f(...)
147147
# 45| -1: [TypeAccess] ClassesKt
148-
# 45| 0: [StringLiteral] init2
148+
# 45| 0: [StringLiteral] "init2"
149149
# 36| 2: [ExprStmt] <Expr>;
150150
# 36| 0: [MethodAccess] f(...)
151151
# 36| -1: [TypeAccess] ClassesKt
@@ -1119,7 +1119,7 @@ local_anonymous.kt:
11191119
# 40| 1: [BlockStmt] { ... }
11201120
# 42| 0: [LocalVariableDeclStmt] var ...;
11211121
# 42| 1: [LocalVariableDeclExpr] answer
1122-
# 42| 0: [StringLiteral] 42
1122+
# 42| 0: [StringLiteral] "42"
11231123
# 40| 1: [ExprStmt] <Expr>;
11241124
# 40| 0: [ClassInstanceExpr] new (...)
11251125
# 40| -3: [TypeAccess] Interface2

java/ql/test/kotlin/library-tests/collection-literals/PrintAst.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ test.kt:
3939
# 1| 0: [VarAccess] p0
4040
# 0| 1: [ArrayCreationExpr] new String[]
4141
# 0| -2: [ArrayInit] {...}
42-
# 0| 0: [StringLiteral] hello
43-
# 0| 1: [StringLiteral] world
42+
# 0| 0: [StringLiteral] "hello"
43+
# 0| 1: [StringLiteral] "world"
4444
# 0| -1: [TypeAccess] String
4545
# 0| 0: [IntegerLiteral] 2
4646
# 1| 1: [IfStmt] if (...)

java/ql/test/kotlin/library-tests/controlflow/basic/bbStmts.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,15 +155,15 @@
155155
| Test.kt:105:5:109:5 | <Expr>; | 5 | Test.kt:105:9:105:17 | ... (value not-equals) ... |
156156
| Test.kt:105:20:107:5 | { ... } | 0 | Test.kt:105:20:107:5 | { ... } |
157157
| Test.kt:105:20:107:5 | { ... } | 1 | Test.kt:106:9:106:29 | <Expr>; |
158-
| Test.kt:105:20:107:5 | { ... } | 2 | Test.kt:106:18:106:27 | x not null |
158+
| Test.kt:105:20:107:5 | { ... } | 2 | Test.kt:106:18:106:27 | "x not null" |
159159
| Test.kt:105:20:107:5 | { ... } | 3 | Test.kt:106:9:106:29 | println(...) |
160160
| Test.kt:107:16:109:5 | ... -> ... | 0 | Test.kt:107:16:109:5 | ... -> ... |
161161
| Test.kt:107:16:109:5 | ... -> ... | 1 | Test.kt:107:16:107:16 | y |
162162
| Test.kt:107:16:109:5 | ... -> ... | 2 | Test.kt:107:21:107:24 | null |
163163
| Test.kt:107:16:109:5 | ... -> ... | 3 | Test.kt:107:16:107:24 | ... (value not-equals) ... |
164164
| Test.kt:107:27:109:5 | { ... } | 0 | Test.kt:107:27:109:5 | { ... } |
165165
| Test.kt:107:27:109:5 | { ... } | 1 | Test.kt:108:9:108:29 | <Expr>; |
166-
| Test.kt:107:27:109:5 | { ... } | 2 | Test.kt:108:18:108:27 | y not null |
166+
| Test.kt:107:27:109:5 | { ... } | 2 | Test.kt:108:18:108:27 | "y not null" |
167167
| Test.kt:107:27:109:5 | { ... } | 3 | Test.kt:108:9:108:29 | println(...) |
168168
| Test.kt:112:1:116:1 | fn | 0 | Test.kt:112:1:116:1 | fn |
169169
| Test.kt:112:32:116:1 | { ... } | 0 | Test.kt:112:32:116:1 | { ... } |

0 commit comments

Comments
 (0)