Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 21af31f

Browse files
tamasvajkigfoo
authored andcommitted
CFG changes for non-null operator + some tests
1 parent de13741 commit 21af31f

9 files changed

Lines changed: 185 additions & 10 deletions

File tree

java/ql/lib/semmle/code/java/ControlFlowGraph.qll

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ private module ControlFlowGraphImpl {
163163
* Bind `t` to an exception type that may be thrown during execution of `n`,
164164
* either because `n` is a `throw` statement, or because it is a call
165165
* that may throw an exception, or because it is a cast and a
166-
* `ClassCastException` is expected.
166+
* `ClassCastException` is expected, or because it is a Kotlin not-null check
167+
* and a `NullPointerException` is expected.
167168
*/
168169
private predicate mayThrow(ControlFlowNode n, ThrowableType t) {
169170
t = n.(ThrowStmt).getThrownExceptionType()
@@ -179,6 +180,11 @@ private module ControlFlowGraphImpl {
179180
t instanceof TypeClassCastException and
180181
uncheckedExceptionFromCatch(n, t)
181182
)
183+
or
184+
exists(NotNullExpr nn | nn = n |
185+
t instanceof TypeNullPointerException and
186+
uncheckedExceptionFromCatch(n, t)
187+
)
182188
}
183189

184190
/**
@@ -304,12 +310,12 @@ private module ControlFlowGraphImpl {
304310
or
305311
exists(ConditionalStmt condstmt | condstmt.getCondition() = b)
306312
or
307-
exists(WhenBranch whenbranch |
308-
whenbranch.getCondition() = b)
313+
exists(WhenBranch whenbranch | whenbranch.getCondition() = b)
309314
or
310315
exists(WhenExpr whenexpr |
311316
inBooleanContext(whenexpr) and
312-
whenexpr.getBranch(_).getAResult() = b)
317+
whenexpr.getBranch(_).getAResult() = b
318+
)
313319
}
314320

315321
/**
@@ -419,7 +425,9 @@ private module ControlFlowGraphImpl {
419425
exists(WhenExpr whenexpr | whenexpr = result |
420426
whenexpr.getBranch(_).isElseBranch() and
421427
forex(WhenBranch whenbranch | whenbranch = whenexpr.getBranch(_) |
422-
whenbranch.getRhs() = nonReturningStmt()))
428+
whenbranch.getRhs() = nonReturningStmt()
429+
)
430+
)
423431
}
424432

425433
/**
@@ -947,9 +955,10 @@ private module ControlFlowGraphImpl {
947955
or
948956
// If our last branch condition is false then we are done
949957
exists(int i |
950-
last(whenexpr.getBranch(i), last, BooleanCompletion(false, _)) and
951-
completion = NormalCompletion() and
952-
not exists(whenexpr.getBranch(i + 1)))
958+
last(whenexpr.getBranch(i), last, BooleanCompletion(false, _)) and
959+
completion = NormalCompletion() and
960+
not exists(whenexpr.getBranch(i + 1))
961+
)
953962
or
954963
// Any branch getting an abnormal completion is propogated
955964
last(whenexpr.getBranch(_), last, completion) and
@@ -1249,13 +1258,15 @@ private module ControlFlowGraphImpl {
12491258
or
12501259
// When expressions:
12511260
exists(WhenExpr whenexpr | n = whenexpr |
1252-
n = whenexpr and result = first(whenexpr.getBranch(0)) and
1261+
n = whenexpr and
1262+
result = first(whenexpr.getBranch(0)) and
12531263
completion = NormalCompletion()
12541264
or
12551265
exists(int i |
12561266
last(whenexpr.getBranch(i), n, completion) and
12571267
completion = BooleanCompletion(false, _) and
1258-
result = first(whenexpr.getBranch(i + 1)))
1268+
result = first(whenexpr.getBranch(i + 1))
1269+
)
12591270
)
12601271
or
12611272
// When branches:

java/ql/lib/semmle/code/java/JDK.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ class TypeClassCastException extends Class {
104104
TypeClassCastException() { this.hasQualifiedName("java.lang", "ClassCastException") }
105105
}
106106

107+
/** The class `java.lang.NullPointerException`. */
108+
class TypeNullPointerException extends Class {
109+
TypeNullPointerException() { this.hasQualifiedName("java.lang", "NullPointerException") }
110+
}
111+
107112
/**
108113
* The class `java.lang.Class`.
109114
*

java/ql/test/kotlin/library-tests/controlflow/basic/Test.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,21 @@ TODO
7878
return
7979
}
8080
}
81+
82+
fun t1(o: Any): Int {
83+
try {
84+
val x = o as Int
85+
return 1
86+
} catch (e: ClassCastException) {
87+
return 2
88+
}
89+
}
90+
91+
fun t2(o: Any?): Int {
92+
try {
93+
val x = o!!
94+
return 1
95+
} catch (e: NullPointerException) {
96+
return 2
97+
}
98+
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,23 @@
105105
| Test.kt:43:3:43:3 | <Expr>; | 9 | Test.kt:78:3:78:8 | INSTANCE |
106106
| Test.kt:43:3:43:3 | <Expr>; | 10 | Test.kt:78:3:78:8 | return ... |
107107
| Test.kt:43:3:43:3 | <Expr>; | 11 | Test.kt:4:2:79:2 | test |
108+
| Test.kt:82:1:89:1 | t1 | 0 | Test.kt:82:1:89:1 | t1 |
109+
| Test.kt:82:21:89:1 | { ... } | 0 | Test.kt:82:21:89:1 | { ... } |
110+
| Test.kt:82:21:89:1 | { ... } | 1 | Test.kt:83:2:88:2 | try ... |
111+
| Test.kt:82:21:89:1 | { ... } | 2 | Test.kt:83:6:86:2 | { ... } |
112+
| Test.kt:82:21:89:1 | { ... } | 3 | Test.kt:84:3:84:18 | var ...; |
113+
| Test.kt:82:21:89:1 | { ... } | 4 | Test.kt:84:11:84:11 | o |
114+
| Test.kt:82:21:89:1 | { ... } | 5 | Test.kt:84:11:84:18 | (...)... |
115+
| Test.kt:84:3:84:18 | x | 0 | Test.kt:84:3:84:18 | x |
116+
| Test.kt:84:3:84:18 | x | 1 | Test.kt:85:10:85:10 | 1 |
117+
| Test.kt:84:3:84:18 | x | 2 | Test.kt:85:3:85:10 | return ... |
118+
| Test.kt:91:1:98:1 | t2 | 0 | Test.kt:91:1:98:1 | t2 |
119+
| Test.kt:91:22:98:1 | { ... } | 0 | Test.kt:91:22:98:1 | { ... } |
120+
| Test.kt:91:22:98:1 | { ... } | 1 | Test.kt:92:2:97:2 | try ... |
121+
| Test.kt:91:22:98:1 | { ... } | 2 | Test.kt:92:6:95:2 | { ... } |
122+
| Test.kt:91:22:98:1 | { ... } | 3 | Test.kt:93:3:93:13 | var ...; |
123+
| Test.kt:91:22:98:1 | { ... } | 4 | Test.kt:93:11:93:11 | o |
124+
| Test.kt:91:22:98:1 | { ... } | 5 | Test.kt:93:12:93:13 | ...!! |
125+
| Test.kt:93:3:93:13 | x | 0 | Test.kt:93:3:93:13 | x |
126+
| Test.kt:93:3:93:13 | x | 1 | Test.kt:94:10:94:10 | 1 |
127+
| Test.kt:93:3:93:13 | x | 2 | Test.kt:94:3:94:10 | return ... |

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,9 @@
1414
| Test.kt:35:3:35:3 | <Expr>; | Test.kt:43:3:43:3 | <Expr>; |
1515
| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } |
1616
| Test.kt:38:9:38:9 | x | Test.kt:43:3:43:3 | <Expr>; |
17+
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | t1 |
18+
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x |
19+
| Test.kt:82:21:89:1 | { ... } | file://:0:0:0:0 | catch (...) |
20+
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | t2 |
21+
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
22+
| Test.kt:91:22:98:1 | { ... } | file://:0:0:0:0 | catch (...) |

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,11 @@
77
| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } |
88
| Test.kt:38:9:38:9 | x | Test.kt:43:3:43:3 | <Expr>; |
99
| Test.kt:38:16:41:3 | { ... } | Test.kt:38:9:38:9 | x |
10+
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x |
11+
| Test.kt:82:21:89:1 | { ... } | file://:0:0:0:0 | catch (...) |
12+
| Test.kt:84:3:84:18 | x | Test.kt:82:1:89:1 | t1 |
13+
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
14+
| Test.kt:91:22:98:1 | { ... } | file://:0:0:0:0 | catch (...) |
15+
| Test.kt:93:3:93:13 | x | Test.kt:91:1:98:1 | t2 |
16+
| file://:0:0:0:0 | catch (...) | Test.kt:82:1:89:1 | t1 |
17+
| file://:0:0:0:0 | catch (...) | Test.kt:91:1:98:1 | t2 |

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,42 @@
130130
| Test.kt:77:7:77:8 | 40 | IntegerLiteral | Test.kt:77:3:77:3 | ...=... | AssignExpr |
131131
| Test.kt:78:3:78:8 | INSTANCE | VarAccess | Test.kt:78:3:78:8 | return ... | ReturnStmt |
132132
| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | test | Method |
133+
| Test.kt:82:1:89:1 | t1 | Method | file://:0:0:0:0 | <none> | <none> |
134+
| Test.kt:82:8:82:13 | o | Parameter | file://:0:0:0:0 | <none> | <none> |
135+
| Test.kt:82:21:89:1 | { ... } | BlockStmt | Test.kt:83:2:88:2 | try ... | TryStmt |
136+
| Test.kt:83:2:88:2 | try ... | TryStmt | Test.kt:83:6:86:2 | { ... } | BlockStmt |
137+
| Test.kt:83:6:86:2 | { ... } | BlockStmt | Test.kt:84:3:84:18 | var ...; | LocalVariableDeclStmt |
138+
| Test.kt:84:3:84:18 | int x | LocalVariableDecl | file://:0:0:0:0 | <none> | <none> |
139+
| Test.kt:84:3:84:18 | var ...; | LocalVariableDeclStmt | Test.kt:84:11:84:11 | o | VarAccess |
140+
| Test.kt:84:3:84:18 | x | LocalVariableDeclExpr | Test.kt:85:10:85:10 | 1 | IntegerLiteral |
141+
| Test.kt:84:11:84:11 | o | VarAccess | Test.kt:84:11:84:18 | (...)... | CastExpr |
142+
| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:84:3:84:18 | x | LocalVariableDeclExpr |
143+
| Test.kt:84:11:84:18 | (...)... | CastExpr | file://:0:0:0:0 | catch (...) | CatchClause |
144+
| Test.kt:84:11:84:18 | int | TypeAccess | file://:0:0:0:0 | <none> | <none> |
145+
| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | t1 | Method |
146+
| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt |
147+
| Test.kt:86:11:86:31 | ClassCastException | TypeAccess | file://:0:0:0:0 | <none> | <none> |
148+
| Test.kt:86:11:86:31 | ClassCastException e | LocalVariableDecl | file://:0:0:0:0 | <none> | <none> |
149+
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt |
150+
| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral |
151+
| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | t1 | Method |
152+
| Test.kt:87:10:87:10 | 2 | IntegerLiteral | Test.kt:87:3:87:10 | return ... | ReturnStmt |
153+
| Test.kt:91:1:98:1 | t2 | Method | file://:0:0:0:0 | <none> | <none> |
154+
| Test.kt:91:8:91:14 | o | Parameter | file://:0:0:0:0 | <none> | <none> |
155+
| Test.kt:91:22:98:1 | { ... } | BlockStmt | Test.kt:92:2:97:2 | try ... | TryStmt |
156+
| Test.kt:92:2:97:2 | try ... | TryStmt | Test.kt:92:6:95:2 | { ... } | BlockStmt |
157+
| Test.kt:92:6:95:2 | { ... } | BlockStmt | Test.kt:93:3:93:13 | var ...; | LocalVariableDeclStmt |
158+
| Test.kt:93:3:93:13 | Object x | LocalVariableDecl | file://:0:0:0:0 | <none> | <none> |
159+
| Test.kt:93:3:93:13 | var ...; | LocalVariableDeclStmt | Test.kt:93:11:93:11 | o | VarAccess |
160+
| Test.kt:93:3:93:13 | x | LocalVariableDeclExpr | Test.kt:94:10:94:10 | 1 | IntegerLiteral |
161+
| Test.kt:93:11:93:11 | o | VarAccess | Test.kt:93:12:93:13 | ...!! | NotNullExpr |
162+
| Test.kt:93:12:93:13 | ...!! | NotNullExpr | Test.kt:93:3:93:13 | x | LocalVariableDeclExpr |
163+
| Test.kt:93:12:93:13 | ...!! | NotNullExpr | file://:0:0:0:0 | catch (...) | CatchClause |
164+
| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | t2 | Method |
165+
| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt |
166+
| Test.kt:95:11:95:33 | NullPointerException | TypeAccess | file://:0:0:0:0 | <none> | <none> |
167+
| Test.kt:95:11:95:33 | NullPointerException e | LocalVariableDecl | file://:0:0:0:0 | <none> | <none> |
168+
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt |
169+
| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral |
170+
| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | t2 | Method |
171+
| Test.kt:96:10:96:10 | 2 | IntegerLiteral | Test.kt:96:3:96:10 | return ... | ReturnStmt |

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,5 +368,55 @@
368368
| Test.kt:73:3:73:3 | <Expr>; | Test.kt:77:3:77:3 | <Expr>; |
369369
| Test.kt:73:3:73:3 | <Expr>; | Test.kt:78:3:78:8 | return ... |
370370
| Test.kt:77:3:77:3 | <Expr>; | Test.kt:78:3:78:8 | return ... |
371+
| Test.kt:82:21:89:1 | { ... } | Test.kt:83:2:88:2 | try ... |
372+
| Test.kt:82:21:89:1 | { ... } | Test.kt:83:6:86:2 | { ... } |
373+
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | var ...; |
374+
| Test.kt:82:21:89:1 | { ... } | Test.kt:85:3:85:10 | return ... |
375+
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:34:88:2 | { ... } |
376+
| Test.kt:82:21:89:1 | { ... } | Test.kt:87:3:87:10 | return ... |
377+
| Test.kt:82:21:89:1 | { ... } | file://:0:0:0:0 | catch (...) |
378+
| Test.kt:83:2:88:2 | try ... | Test.kt:83:6:86:2 | { ... } |
379+
| Test.kt:83:2:88:2 | try ... | Test.kt:84:3:84:18 | var ...; |
380+
| Test.kt:83:2:88:2 | try ... | Test.kt:85:3:85:10 | return ... |
381+
| Test.kt:83:2:88:2 | try ... | Test.kt:86:34:88:2 | { ... } |
382+
| Test.kt:83:2:88:2 | try ... | Test.kt:87:3:87:10 | return ... |
383+
| Test.kt:83:2:88:2 | try ... | file://:0:0:0:0 | catch (...) |
384+
| Test.kt:83:6:86:2 | { ... } | Test.kt:84:3:84:18 | var ...; |
385+
| Test.kt:83:6:86:2 | { ... } | Test.kt:85:3:85:10 | return ... |
386+
| Test.kt:83:6:86:2 | { ... } | Test.kt:86:34:88:2 | { ... } |
387+
| Test.kt:83:6:86:2 | { ... } | Test.kt:87:3:87:10 | return ... |
388+
| Test.kt:83:6:86:2 | { ... } | file://:0:0:0:0 | catch (...) |
389+
| Test.kt:84:3:84:18 | var ...; | Test.kt:85:3:85:10 | return ... |
390+
| Test.kt:84:3:84:18 | var ...; | Test.kt:86:34:88:2 | { ... } |
391+
| Test.kt:84:3:84:18 | var ...; | Test.kt:87:3:87:10 | return ... |
392+
| Test.kt:84:3:84:18 | var ...; | file://:0:0:0:0 | catch (...) |
393+
| Test.kt:86:34:88:2 | { ... } | Test.kt:87:3:87:10 | return ... |
394+
| Test.kt:91:22:98:1 | { ... } | Test.kt:92:2:97:2 | try ... |
395+
| Test.kt:91:22:98:1 | { ... } | Test.kt:92:6:95:2 | { ... } |
396+
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | var ...; |
397+
| Test.kt:91:22:98:1 | { ... } | Test.kt:94:3:94:10 | return ... |
398+
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:36:97:2 | { ... } |
399+
| Test.kt:91:22:98:1 | { ... } | Test.kt:96:3:96:10 | return ... |
400+
| Test.kt:91:22:98:1 | { ... } | file://:0:0:0:0 | catch (...) |
401+
| Test.kt:92:2:97:2 | try ... | Test.kt:92:6:95:2 | { ... } |
402+
| Test.kt:92:2:97:2 | try ... | Test.kt:93:3:93:13 | var ...; |
403+
| Test.kt:92:2:97:2 | try ... | Test.kt:94:3:94:10 | return ... |
404+
| Test.kt:92:2:97:2 | try ... | Test.kt:95:36:97:2 | { ... } |
405+
| Test.kt:92:2:97:2 | try ... | Test.kt:96:3:96:10 | return ... |
406+
| Test.kt:92:2:97:2 | try ... | file://:0:0:0:0 | catch (...) |
407+
| Test.kt:92:6:95:2 | { ... } | Test.kt:93:3:93:13 | var ...; |
408+
| Test.kt:92:6:95:2 | { ... } | Test.kt:94:3:94:10 | return ... |
409+
| Test.kt:92:6:95:2 | { ... } | Test.kt:95:36:97:2 | { ... } |
410+
| Test.kt:92:6:95:2 | { ... } | Test.kt:96:3:96:10 | return ... |
411+
| Test.kt:92:6:95:2 | { ... } | file://:0:0:0:0 | catch (...) |
412+
| Test.kt:93:3:93:13 | var ...; | Test.kt:94:3:94:10 | return ... |
413+
| Test.kt:93:3:93:13 | var ...; | Test.kt:95:36:97:2 | { ... } |
414+
| Test.kt:93:3:93:13 | var ...; | Test.kt:96:3:96:10 | return ... |
415+
| Test.kt:93:3:93:13 | var ...; | file://:0:0:0:0 | catch (...) |
416+
| Test.kt:95:36:97:2 | { ... } | Test.kt:96:3:96:10 | return ... |
417+
| file://:0:0:0:0 | catch (...) | Test.kt:86:34:88:2 | { ... } |
418+
| file://:0:0:0:0 | catch (...) | Test.kt:87:3:87:10 | return ... |
419+
| file://:0:0:0:0 | catch (...) | Test.kt:95:36:97:2 | { ... } |
420+
| file://:0:0:0:0 | catch (...) | Test.kt:96:3:96:10 | return ... |
371421
| file://:0:0:0:0 | var ...; | Test.kt:40:4:40:4 | <Expr>; |
372422
| file://:0:0:0:0 | var ...; | Test.kt:40:4:40:6 | <Expr>; |

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,24 @@
280280
| Test.kt:78:3:78:8 | return ... | Test.kt:73:3:73:3 | <Expr>; |
281281
| Test.kt:78:3:78:8 | return ... | Test.kt:77:3:77:3 | <Expr>; |
282282
| Test.kt:78:3:78:8 | return ... | file://:0:0:0:0 | var ...; |
283+
| Test.kt:83:2:88:2 | try ... | Test.kt:82:21:89:1 | { ... } |
284+
| Test.kt:83:6:86:2 | { ... } | Test.kt:82:21:89:1 | { ... } |
285+
| Test.kt:83:6:86:2 | { ... } | Test.kt:83:2:88:2 | try ... |
286+
| Test.kt:84:3:84:18 | var ...; | Test.kt:82:21:89:1 | { ... } |
287+
| Test.kt:84:3:84:18 | var ...; | Test.kt:83:2:88:2 | try ... |
288+
| Test.kt:84:3:84:18 | var ...; | Test.kt:83:6:86:2 | { ... } |
289+
| Test.kt:86:34:88:2 | { ... } | file://:0:0:0:0 | catch (...) |
290+
| Test.kt:87:3:87:10 | return ... | Test.kt:86:34:88:2 | { ... } |
291+
| Test.kt:87:3:87:10 | return ... | file://:0:0:0:0 | catch (...) |
292+
| Test.kt:92:2:97:2 | try ... | Test.kt:91:22:98:1 | { ... } |
293+
| Test.kt:92:6:95:2 | { ... } | Test.kt:91:22:98:1 | { ... } |
294+
| Test.kt:92:6:95:2 | { ... } | Test.kt:92:2:97:2 | try ... |
295+
| Test.kt:93:3:93:13 | var ...; | Test.kt:91:22:98:1 | { ... } |
296+
| Test.kt:93:3:93:13 | var ...; | Test.kt:92:2:97:2 | try ... |
297+
| Test.kt:93:3:93:13 | var ...; | Test.kt:92:6:95:2 | { ... } |
298+
| Test.kt:95:36:97:2 | { ... } | file://:0:0:0:0 | catch (...) |
299+
| Test.kt:96:3:96:10 | return ... | Test.kt:95:36:97:2 | { ... } |
300+
| Test.kt:96:3:96:10 | return ... | file://:0:0:0:0 | catch (...) |
283301
| file://:0:0:0:0 | var ...; | Test.kt:38:16:41:3 | { ... } |
284302
| file://:0:0:0:0 | var ...; | Test.kt:39:4:39:4 | <Expr>; |
285303
| file://:0:0:0:0 | var ...; | Test.kt:40:4:40:6 | <Expr>; |

0 commit comments

Comments
 (0)