Skip to content

Commit 5c79563

Browse files
committed
Swift: add Pattern.getEnclosingPattern()
1 parent c2e9ffa commit 5c79563

File tree

3 files changed

+31
-45
lines changed

3 files changed

+31
-45
lines changed

swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ private predicate switchMatching(SwitchStmt switch, CaseStmt c, AstNode ast) {
185185
(
186186
c.getALabel() = ast
187187
or
188-
isSubPattern+(c.getALabel().getPattern(), ast)
188+
ast.(Pattern).getEnclosingPattern+() = c.getALabel().getPattern()
189189
)
190190
}
191191

@@ -216,27 +216,10 @@ predicate catchMatchingPattern(DoCatchStmt s, CaseStmt c, Pattern pattern) {
216216
exists(CaseLabelItem cli | catchMatching(s, c, cli) |
217217
cli.getPattern() = pattern
218218
or
219-
isSubPattern+(cli.getPattern(), pattern)
219+
pattern.getEnclosingPattern+() = cli.getPattern()
220220
)
221221
}
222222

223-
/** Holds if `sub` is a subpattern of `p`. */
224-
private predicate isSubPattern(Pattern p, Pattern sub) {
225-
sub = p.(BindingPattern).getImmediateSubPattern()
226-
or
227-
sub = p.(EnumElementPattern).getImmediateSubPattern()
228-
or
229-
sub = p.(IsPattern).getImmediateSubPattern()
230-
or
231-
sub = p.(OptionalSomePattern).getImmediateSubPattern()
232-
or
233-
sub = p.(ParenPattern).getImmediateSubPattern()
234-
or
235-
sub = p.(TuplePattern).getImmediateElement(_)
236-
or
237-
sub = p.(TypedPattern).getImmediateSubPattern()
238-
}
239-
240223
/** Gets the value of `e` if it is a constant value, disregarding conversions. */
241224
private string getExprValue(Expr e) {
242225
result = e.(IntegerLiteralExpr).getStringValue()
Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,15 @@
11
private import codeql.swift.generated.pattern.NamedPattern
2-
private import codeql.swift.elements.pattern.BindingPattern
3-
private import codeql.swift.elements.pattern.EnumElementPattern
4-
private import codeql.swift.elements.pattern.IsPattern
5-
private import codeql.swift.elements.pattern.OptionalSomePattern
6-
private import codeql.swift.elements.pattern.ParenPattern
7-
private import codeql.swift.elements.pattern.TuplePattern
8-
private import codeql.swift.elements.pattern.TypedPattern
92
private import codeql.swift.elements.decl.VarDecl
10-
private import codeql.swift.elements.stmt.LabeledConditionalStmt
11-
private import codeql.swift.elements.stmt.ConditionElement
123

134
class NamedPattern extends Generated::NamedPattern {
145
/** Holds if this named pattern has a corresponding `VarDecl` */
156
predicate hasVarDecl() { exists(this.getVarDecl()) }
167

178
/** Gets the `VarDecl` bound by this named pattern, if any. */
189
VarDecl getVarDecl() {
19-
isSubPattern*(result.getParentPattern().getFullyUnresolved(), this) and
10+
this.getEnclosingPattern*() = result.getParentPattern().getFullyUnresolved() and
2011
result.getName() = this.getName()
2112
}
2213

2314
override string toString() { result = this.getName() }
2415
}
25-
26-
private predicate isSubPattern(Pattern p, Pattern sub) {
27-
sub = p.(BindingPattern).getImmediateSubPattern()
28-
or
29-
sub = p.(EnumElementPattern).getImmediateSubPattern()
30-
or
31-
sub = p.(IsPattern).getImmediateSubPattern()
32-
or
33-
sub = p.(OptionalSomePattern).getImmediateSubPattern()
34-
or
35-
sub = p.(ParenPattern).getImmediateSubPattern()
36-
or
37-
sub = p.(TuplePattern).getImmediateElement(_)
38-
or
39-
sub = p.(TypedPattern).getImmediateSubPattern()
40-
}

swift/ql/lib/codeql/swift/elements/pattern/Pattern.qll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,32 @@ class Pattern extends Generated::Pattern {
6565

6666
/** Holds if this pattern is matched against an expression. */
6767
predicate hasMatchingExpr() { exists(this.getMatchingExpr()) }
68+
69+
/**
70+
* Holds if this occurs as a sub-pattern of the result.
71+
*/
72+
Pattern getEnclosingPattern() {
73+
this = result.(EnumElementPattern).getImmediateSubPattern()
74+
or
75+
this = result.(OptionalSomePattern).getImmediateSubPattern()
76+
or
77+
this = result.(TuplePattern).getImmediateElement(_)
78+
or
79+
result = this.getIdentityPreservingEnclosingPattern()
80+
}
81+
82+
/**
83+
* Holds if this occurs as a sub-pattern of the result
84+
* without any intervening destructurings of
85+
* complex data structures.
86+
*/
87+
Pattern getIdentityPreservingEnclosingPattern() {
88+
this = result.(BindingPattern).getImmediateSubPattern()
89+
or
90+
this = result.(IsPattern).getImmediateSubPattern()
91+
or
92+
this = result.(ParenPattern).getImmediateSubPattern()
93+
or
94+
this = result.(TypedPattern).getImmediateSubPattern()
95+
}
6896
}

0 commit comments

Comments
 (0)