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

Skip to content

Commit ba0f3cf

Browse files
committed
Add basic support for case guards
1 parent e94c5a7 commit ba0f3cf

3 files changed

Lines changed: 66 additions & 28 deletions

File tree

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,9 @@ class PatternCase extends SwitchCase {
523523
/** Gets the variable declared by this pattern case. */
524524
LocalVariableDeclExpr getDecl() { result.isNthChildOf(this, 0) }
525525

526+
/** Gets the guard applicable to this pattern case, if any. */
527+
Expr getGuard() { result.isNthChildOf(this, -3) }
528+
526529
override string pp() { result = "case T t ..." }
527530

528531
override string toString() { result = "case T t ..." }

java/ql/test/library-tests/printAst/A.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ void varDecls(Object[] things) {
8282
case null -> "Null";
8383
default -> "Not null";
8484
};
85+
var whenTest = switch((String)thing) {
86+
case "constant" -> "It's constant";
87+
case String s when s.length() == 3 -> "It's 3 letters long";
88+
case String s when s.length() == 5 -> "it's 5 letters long";
89+
default -> "It's something else";
90+
};
8591
}
8692
}
8793
catch (RuntimeException rte) {

java/ql/test/library-tests/printAst/PrintAst.expected

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -217,36 +217,65 @@ A.java:
217217
# 82| 0: [NullLiteral] null
218218
# 83| 1: [DefaultCase] default
219219
# 83| -1: [StringLiteral] "Not null"
220-
# 87| 0: [CatchClause] catch (...)
220+
# 85| 7: [LocalVariableDeclStmt] var ...;
221+
# 85| 1: [LocalVariableDeclExpr] whenTest
222+
# 85| 0: [SwitchExpr] switch (...)
223+
# 85| -1: [CastExpr] (...)...
224+
# 85| 0: [TypeAccess] String
225+
# 85| 1: [VarAccess] thing
226+
# 86| 0: [ConstCase] case ...
227+
# 86| -1: [StringLiteral] "It's constant"
228+
# 86| 0: [StringLiteral] "constant"
229+
# 87| 1: [PatternCase] case T t ...
230+
# 87| -3: [EQExpr] ... == ...
231+
# 87| 0: [MethodCall] length(...)
232+
# 87| -1: [VarAccess] s
233+
# 87| 1: [IntegerLiteral] 3
234+
# 87| -1: [StringLiteral] "It's 3 letters long"
235+
#-----| 0: (Single Local Variable Declaration)
236+
# 87| 0: [TypeAccess] String
237+
# 87| 1: [LocalVariableDeclExpr] s
238+
# 88| 2: [PatternCase] case T t ...
239+
# 88| -3: [EQExpr] ... == ...
240+
# 88| 0: [MethodCall] length(...)
241+
# 88| -1: [VarAccess] s
242+
# 88| 1: [IntegerLiteral] 5
243+
# 88| -1: [StringLiteral] "it's 5 letters long"
244+
#-----| 0: (Single Local Variable Declaration)
245+
# 88| 0: [TypeAccess] String
246+
# 88| 1: [LocalVariableDeclExpr] s
247+
# 89| 3: [DefaultCase] default
248+
# 89| -1: [StringLiteral] "It's something else"
249+
# 93| 0: [CatchClause] catch (...)
221250
#-----| 0: (Single Local Variable Declaration)
222-
# 87| 0: [TypeAccess] RuntimeException
223-
# 87| 1: [LocalVariableDeclExpr] rte
224-
# 87| 1: [BlockStmt] { ... }
225-
# 88| 0: [ReturnStmt] return ...
226-
# 92| 10: [Class] E
227-
# 96| 3: [FieldDeclaration] E A;
251+
# 93| 0: [TypeAccess] RuntimeException
252+
# 93| 1: [LocalVariableDeclExpr] rte
253+
# 93| 1: [BlockStmt] { ... }
254+
# 94| 0: [ReturnStmt] return ...
255+
# 98| 10: [Class] E
256+
# 102| 3: [FieldDeclaration] E A;
228257
#-----| -3: (Javadoc)
229-
# 93| 1: [Javadoc] /** Javadoc for enum constant */
230-
# 94| 0: [JavadocText] Javadoc for enum constant
231-
# 96| -1: [TypeAccess] E
232-
# 96| 0: [ClassInstanceExpr] new E(...)
233-
# 96| -3: [TypeAccess] E
234-
# 97| 4: [FieldDeclaration] E B;
258+
# 99| 1: [Javadoc] /** Javadoc for enum constant */
259+
# 100| 0: [JavadocText] Javadoc for enum constant
260+
# 102| -1: [TypeAccess] E
261+
# 102| 0: [ClassInstanceExpr] new E(...)
262+
# 102| -3: [TypeAccess] E
263+
# 103| 4: [FieldDeclaration] E B;
235264
#-----| -3: (Javadoc)
236-
# 93| 1: [Javadoc] /** Javadoc for enum constant */
237-
# 94| 0: [JavadocText] Javadoc for enum constant
238-
# 97| -1: [TypeAccess] E
239-
# 97| 0: [ClassInstanceExpr] new E(...)
240-
# 97| -3: [TypeAccess] E
241-
# 98| 5: [FieldDeclaration] E C;
265+
# 99| 1: [Javadoc] /** Javadoc for enum constant */
266+
# 100| 0: [JavadocText] Javadoc for enum constant
267+
# 103| -1: [TypeAccess] E
268+
# 103| 0: [ClassInstanceExpr] new E(...)
269+
# 103| -3: [TypeAccess] E
270+
# 104| 5: [FieldDeclaration] E C;
242271
#-----| -3: (Javadoc)
243-
# 93| 1: [Javadoc] /** Javadoc for enum constant */
244-
# 94| 0: [JavadocText] Javadoc for enum constant
245-
# 98| -1: [TypeAccess] E
246-
# 98| 0: [ClassInstanceExpr] new E(...)
247-
# 98| -3: [TypeAccess] E
248-
# 104| 11: [FieldDeclaration] int i, ...;
272+
# 99| 1: [Javadoc] /** Javadoc for enum constant */
273+
# 100| 0: [JavadocText] Javadoc for enum constant
274+
# 104| -1: [TypeAccess] E
275+
# 104| 0: [ClassInstanceExpr] new E(...)
276+
# 104| -3: [TypeAccess] E
277+
# 110| 11: [FieldDeclaration] int i, ...;
249278
#-----| -3: (Javadoc)
250-
# 101| 1: [Javadoc] /** Javadoc for fields */
251-
# 102| 0: [JavadocText] Javadoc for fields
252-
# 104| -1: [TypeAccess] int
279+
# 107| 1: [Javadoc] /** Javadoc for fields */
280+
# 108| 0: [JavadocText] Javadoc for fields
281+
# 110| -1: [TypeAccess] int

0 commit comments

Comments
 (0)