Skip to content

Commit e83cc59

Browse files
authored
Merge pull request github#11296 from smowton/smowton/fix/kotlin-string-literal-formatting
Kotlin: format string literals like the Java annotaton extractor
2 parents ac54da7 + cf34dbd commit e83cc59

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)