usesType: support pattern cases

This commit is contained in:
Chris Smowton
2023-10-26 14:47:50 +01:00
parent 0f434e7f08
commit b6622d2f5b
7 changed files with 74 additions and 0 deletions

View File

@@ -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)
)
)
}

View File

@@ -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)
)
)
}

View File

@@ -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 |

View File

@@ -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

View File

@@ -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 |

View File

@@ -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 { }
}

View File

@@ -0,0 +1 @@
//semmle-extractor-options: --javac-args --release 21