mirror of
https://github.com/github/codeql.git
synced 2026-04-24 08:15:14 +02:00
usesType: support pattern cases
This commit is contained in:
@@ -79,6 +79,11 @@ predicate depends(RefType t, RefType dep) {
|
||||
exists(InstanceOfExpr ioe | t = ioe.getEnclosingCallable().getDeclaringType() |
|
||||
usesType(ioe.getCheckedType(), dep)
|
||||
)
|
||||
or
|
||||
// the type accessed in a pattern-switch case statement in `t`.
|
||||
exists(PatternCase pc | t = pc.getEnclosingCallable().getDeclaringType() |
|
||||
usesType(pc.getDecl().getType(), dep)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +102,11 @@ predicate numDepends(RefType t, RefType dep, int value) {
|
||||
|
|
||||
usesType(ioe.getCheckedType(), dep)
|
||||
)
|
||||
or
|
||||
// the type accessed in a pattern-switch case statement in `t`.
|
||||
exists(PatternCase pc | elem = pc and t = pc.getEnclosingCallable().getDeclaringType() |
|
||||
usesType(pc.getDecl().getType(), dep)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,17 @@
|
||||
| dependency/A.java:15:8:15:8 | E | java.lang.Object |
|
||||
| dependency/A.java:22:7:22:7 | F | java.lang.Object |
|
||||
| dependency/A.java:24:7:24:7 | G | java.lang.Throwable |
|
||||
| dependency/A.java:26:7:26:7 | H | dependency.H$Used1 |
|
||||
| dependency/A.java:26:7:26:7 | H | dependency.H$Used2 |
|
||||
| dependency/A.java:26:7:26:7 | H | dependency.H$Used3 |
|
||||
| dependency/A.java:26:7:26:7 | H | java.lang.Number |
|
||||
| dependency/A.java:26:7:26:7 | H | java.lang.Object |
|
||||
| dependency/A.java:26:7:26:7 | H | java.lang.String |
|
||||
| dependency/A.java:26:7:26:7 | H | java.util.Collection |
|
||||
| dependency/A.java:27:3:27:18 | T | java.lang.String |
|
||||
| dependency/A.java:41:22:41:26 | Used1 | dependency.H |
|
||||
| dependency/A.java:41:22:41:26 | Used1 | java.lang.Object |
|
||||
| dependency/A.java:42:22:42:26 | Used2 | dependency.H |
|
||||
| dependency/A.java:42:22:42:26 | Used2 | java.lang.Object |
|
||||
| dependency/A.java:43:22:43:26 | Used3 | dependency.H |
|
||||
| dependency/A.java:43:22:43:26 | Used3 | java.lang.Object |
|
||||
|
||||
@@ -49,3 +49,39 @@ dependency/A.java:
|
||||
# 28| 0: [WildcardTypeAccess] ? ...
|
||||
# 28| 0: [TypeAccess] Number
|
||||
# 28| 5: [BlockStmt] { ... }
|
||||
# 29| 4: [Method] test3
|
||||
# 29| 3: [TypeAccess] void
|
||||
#-----| 4: (Parameters)
|
||||
# 29| 0: [Parameter] o
|
||||
# 29| 0: [TypeAccess] Object
|
||||
# 29| 5: [BlockStmt] { ... }
|
||||
# 30| 0: [IfStmt] if (...)
|
||||
# 30| 0: [InstanceOfExpr] ...instanceof...
|
||||
# 30| 0: [VarAccess] o
|
||||
# 30| 1: [TypeAccess] Used1
|
||||
# 30| 1: [ReturnStmt] return ...
|
||||
# 31| 1: [SwitchStmt] switch (...)
|
||||
# 31| -1: [VarAccess] o
|
||||
# 32| 0: [PatternCase] case T t ...
|
||||
#-----| 0: (Single Local Variable Declaration)
|
||||
# 32| 0: [TypeAccess] Used2
|
||||
# 32| 1: [LocalVariableDeclExpr] u2
|
||||
# 32| 1: [BreakStmt] break
|
||||
# 33| 2: [DefaultCase] default
|
||||
# 33| 3: [BreakStmt] break
|
||||
# 35| 2: [LocalVariableDeclStmt] var ...;
|
||||
# 35| 1: [LocalVariableDeclExpr] x
|
||||
# 35| 0: [SwitchExpr] switch (...)
|
||||
# 35| -1: [VarAccess] o
|
||||
# 36| 0: [PatternCase] case T t ...
|
||||
#-----| 0: (Single Local Variable Declaration)
|
||||
# 36| 0: [TypeAccess] Used3
|
||||
# 36| 1: [LocalVariableDeclExpr] u3
|
||||
# 36| 1: [YieldStmt] yield ...
|
||||
# 36| 0: [IntegerLiteral] 1
|
||||
# 37| 2: [DefaultCase] default
|
||||
# 37| 3: [YieldStmt] yield ...
|
||||
# 37| 0: [IntegerLiteral] 2
|
||||
# 41| 5: [Class] Used1
|
||||
# 42| 6: [Class] Used2
|
||||
# 43| 7: [Class] Used3
|
||||
|
||||
@@ -10,4 +10,7 @@
|
||||
| dependency/A.java:22:7:22:7 | F | dependency/A.java:22:7:22:7 | F |
|
||||
| dependency/A.java:24:7:24:7 | G | dependency/A.java:24:7:24:7 | G |
|
||||
| dependency/A.java:26:7:26:7 | H | dependency/A.java:26:7:26:7 | H |
|
||||
| dependency/A.java:41:22:41:26 | Used1 | dependency/A.java:41:22:41:26 | Used1 |
|
||||
| dependency/A.java:42:22:42:26 | Used2 | dependency/A.java:42:22:42:26 | Used2 |
|
||||
| dependency/A.java:43:22:43:26 | Used3 | dependency/A.java:43:22:43:26 | Used3 |
|
||||
| file://:0:0:0:0 | C[] | dependency/A.java:9:7:9:7 | C |
|
||||
|
||||
@@ -26,4 +26,19 @@ class G extends Throwable { }
|
||||
class H {
|
||||
<T extends String> T test(T t) { return t; }
|
||||
void test2(java.util.Collection<? extends Number> t) {}
|
||||
void test3(Object o) {
|
||||
if (o instanceof Used1) return;
|
||||
switch (o) {
|
||||
case Used2 u2: break;
|
||||
default: break;
|
||||
}
|
||||
var x = switch (o) {
|
||||
case Used3 u3: yield 1;
|
||||
default: yield 2;
|
||||
};
|
||||
}
|
||||
|
||||
static class Used1 { }
|
||||
static class Used2 { }
|
||||
static class Used3 { }
|
||||
}
|
||||
|
||||
1
java/ql/test/library-tests/dependency/options
Normal file
1
java/ql/test/library-tests/dependency/options
Normal file
@@ -0,0 +1 @@
|
||||
//semmle-extractor-options: --javac-args --release 21
|
||||
Reference in New Issue
Block a user