Skip to content

Commit c2e9ffa

Browse files
committed
Swift: add EnumElementExpr + Pattern.getMatchingExpr()
1 parent 5419e65 commit c2e9ffa

File tree

14 files changed

+1228
-26
lines changed

14 files changed

+1228
-26
lines changed

swift/ql/.generated.list

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,6 @@ ql/lib/codeql/swift/elements/pattern/IsPatternConstructor.qll 209ad40227f49dfe1b
232232
ql/lib/codeql/swift/elements/pattern/NamedPatternConstructor.qll 437ccf0a28c204a83861babc91e0e422846630f001554a3d7764b323c8632a26 91c52727ccf6b035cc1f0c2ca1eb91482ef28fa874bca382fb34f9226c31c84e
233233
ql/lib/codeql/swift/elements/pattern/OptionalSomePatternConstructor.qll bc33a81415edfa4294ad9dfb57f5aa929ea4d7f21a013f145949352009a93975 9fb2afa86dc9cedd28af9f27543ea8babf431a4ba48e9941bcd484b9aa0aeab5
234234
ql/lib/codeql/swift/elements/pattern/ParenPatternConstructor.qll 7229439aac7010dbb82f2aaa48aedf47b189e21cc70cb926072e00faa8358369 341cfacd838185178e95a2a7bb29f198e46954098f6d13890351a82943969809
235-
ql/lib/codeql/swift/elements/pattern/Pattern.qll a5cee4c72446f884107acc248a10b098871dc027513452c569294aaeecbc5890 cbecbc4b2d9bea7b571b9d184a0bb8cf472f66106e96d4f70e0e98d627f269a5
236235
ql/lib/codeql/swift/elements/pattern/TuplePatternConstructor.qll 208fe1f6af1eb569ea4cd5f76e8fbe4dfab9a6264f6c12b762f074a237934bdc 174c55ad1bf3058059ed6c3c3502d6099cda95fbfce925cfd261705accbddbcd
237236
ql/lib/codeql/swift/elements/pattern/TypedPatternConstructor.qll 1befdd0455e94d4daa0332b644b74eae43f98bab6aab7491a37176a431c36c34 e574ecf38aac7d9381133bfb894da8cb96aec1c933093f4f7cc951dba8152570
238237
ql/lib/codeql/swift/elements/stmt/BraceStmtConstructor.qll eb2b4817d84da4063eaa0b95fe22131cc980c761dcf41f1336566e95bc28aae4 c8e5f7fecd01a7724d8f58c2cd8c845264be91252281f37e3eb20f4a6f421c72
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
private import codeql.swift.elements.expr.Expr
2+
private import codeql.swift.elements.expr.Argument
3+
private import codeql.swift.elements.expr.CallExpr
4+
private import codeql.swift.elements.expr.DeclRefExpr
5+
private import codeql.swift.elements.expr.MethodLookupExpr
6+
private import codeql.swift.elements.decl.EnumElementDecl
7+
8+
/**
9+
* An expression that constructs a case of an enum.
10+
*/
11+
abstract class EnumElementExpr extends Expr {
12+
EnumElementDecl decl;
13+
14+
/** Gets the declaration of the enum element that this expression creates. */
15+
EnumElementDecl getElement() { result = decl }
16+
17+
/** Gets the `i`th argument passed to this enum element expression (0-based). */
18+
Argument getArgument(int i) { none() }
19+
20+
/** Gets an argument passed to this enum element expression, if any. */
21+
final Argument getAnArgument() { result = this.getArgument(_) }
22+
23+
/** Gets the number of arguments passed to this enum element expression. */
24+
final int getNumberOfArguments() { result = count(this.getArgument(_)) }
25+
}
26+
27+
private class EnumElementLookupExpr extends MethodLookupExpr {
28+
EnumElementLookupExpr() { this.getMember() instanceof EnumElementDecl }
29+
}
30+
31+
private class NullaryEnumElementExpr extends EnumElementExpr instanceof EnumElementLookupExpr {
32+
NullaryEnumElementExpr() {
33+
this.getMember() = decl and not exists(CallExpr ce | ce.getFunction() = this)
34+
}
35+
}
36+
37+
private class NonNullaryEnumElementExpr extends EnumElementExpr instanceof CallExpr {
38+
NonNullaryEnumElementExpr() {
39+
exists(EnumElementLookupExpr eele |
40+
this.getFunction() = eele and
41+
eele.getMember() = decl
42+
)
43+
}
44+
45+
override Argument getArgument(int i) { result = CallExpr.super.getArgument(i) }
46+
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
private import codeql.swift.generated.pattern.EnumElementPattern
2+
private import codeql.swift.elements.pattern.TuplePattern
23

34
class EnumElementPattern extends Generated::EnumElementPattern {
5+
/**
6+
* Gets the `i`th element (0-based) of this enum element's tuple
7+
* sub-pattern, if any, or the sub-pattern itself if it is not a tuple pattern.
8+
*/
9+
Pattern getSubPattern(int i) {
10+
result = this.getSubPattern().(TuplePattern).getElement(i)
11+
or
12+
not this.getSubPattern() instanceof TuplePattern and
13+
result = this.getSubPattern() and
14+
i = 0
15+
}
16+
417
override string toString() {
518
if this.hasSubPattern()
619
then result = "." + this.getElement().toString() + "(...)"
Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,68 @@
1-
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
21
private import codeql.swift.generated.pattern.Pattern
2+
private import codeql.swift.elements.pattern.EnumElementPattern
3+
private import codeql.swift.elements.pattern.IsPattern
4+
private import codeql.swift.elements.pattern.OptionalSomePattern
5+
private import codeql.swift.elements.pattern.TypedPattern
6+
private import codeql.swift.elements.pattern.TuplePattern
7+
private import codeql.swift.elements.expr.Expr
8+
private import codeql.swift.elements.expr.TupleExpr
9+
private import codeql.swift.elements.expr.EnumElementExpr
10+
private import codeql.swift.elements.expr.LookupExpr
11+
private import codeql.swift.elements.expr.MethodLookupExpr
12+
private import codeql.swift.elements.expr.DeclRefExpr
13+
private import codeql.swift.elements.stmt.ConditionElement
14+
private import codeql.swift.elements.stmt.SwitchStmt
15+
private import codeql.swift.elements.stmt.CaseStmt
16+
private import codeql.swift.elements.decl.VarDecl
17+
private import codeql.swift.elements.decl.PatternBindingDecl
18+
private import codeql.swift.elements.decl.EnumElementDecl
19+
private import codeql.swift.generated.ParentChild
320

4-
class Pattern extends Generated::Pattern { }
21+
class Pattern extends Generated::Pattern {
22+
/**
23+
* Gets the expression that this pattern is matched against, if any.
24+
*
25+
* For example, in `switch e { case p: ... }`, the pattern `p`
26+
* is matched against the expression `e`.
27+
*/
28+
Expr getMatchingExpr() {
29+
exists(ConditionElement c |
30+
c.getPattern() = this and
31+
result = c.getInitializer()
32+
)
33+
or
34+
exists(SwitchStmt s |
35+
s.getExpr() = result and
36+
s.getACase().getALabel().getPattern() = this
37+
)
38+
or
39+
exists(PatternBindingDecl v, int i |
40+
v.getPattern(i) = this and
41+
result = v.getInit(i)
42+
)
43+
or
44+
exists(Pattern p | p.getMatchingExpr() = result |
45+
this = p.(IsPattern).getSubPattern()
46+
or
47+
this = p.(OptionalSomePattern).getSubPattern()
48+
or
49+
this = p.(TypedPattern).getSubPattern()
50+
)
51+
or
52+
exists(TuplePattern p, TupleExpr e, int i |
53+
p.getMatchingExpr() = e and
54+
this = p.getElement(i) and
55+
result = e.getElement(i)
56+
)
57+
or
58+
exists(EnumElementPattern p, EnumElementExpr e, int i |
59+
p.getMatchingExpr() = e and
60+
this = p.getSubPattern(i) and
61+
result = e.getArgument(i).getExpr() and
62+
p.getElement() = e.getElement()
63+
)
64+
}
65+
66+
/** Holds if this pattern is matched against an expression. */
67+
predicate hasMatchingExpr() { exists(this.getMatchingExpr()) }
68+
}

swift/ql/lib/swift.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import codeql.swift.elements.expr.InitializerLookupExpr
88
import codeql.swift.elements.expr.MethodCallExpr
99
import codeql.swift.elements.expr.InitializerCallExpr
1010
import codeql.swift.elements.expr.SelfRefExpr
11+
import codeql.swift.elements.expr.EnumElementExpr
1112
import codeql.swift.elements.decl.MethodDecl
1213
import codeql.swift.elements.decl.ClassOrStructDecl
1314
import codeql.swift.elements.type.NumericType

swift/ql/test/extractor-tests/patterns/all.expected

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,141 @@
5959
| patterns.swift:62:14:62:18 | let ... |
6060
| patterns.swift:62:18:62:18 | c |
6161
| patterns.swift:63:9:63:9 | _ |
62+
| patterns.swift:78:9:78:9 | a |
63+
| patterns.swift:78:9:78:13 | ... as ... |
64+
| patterns.swift:81:10:81:11 | .myNone |
65+
| patterns.swift:83:10:83:25 | .mySingle(...) |
66+
| patterns.swift:83:19:83:25 | (...) |
67+
| patterns.swift:83:20:83:24 | let ... |
68+
| patterns.swift:83:24:83:24 | a |
69+
| patterns.swift:85:10:85:30 | .myPair(...) |
70+
| patterns.swift:85:17:85:30 | (...) |
71+
| patterns.swift:85:18:85:22 | let ... |
72+
| patterns.swift:85:22:85:22 | a |
73+
| patterns.swift:85:25:85:29 | let ... |
74+
| patterns.swift:85:29:85:29 | b |
75+
| patterns.swift:88:10:88:26 | let ... |
76+
| patterns.swift:88:14:88:26 | .myCons(...) |
77+
| patterns.swift:88:21:88:26 | (...) |
78+
| patterns.swift:88:22:88:22 | a |
79+
| patterns.swift:88:25:88:25 | _ |
80+
| patterns.swift:92:13:92:28 | .mySingle(...) |
81+
| patterns.swift:92:22:92:28 | (...) |
82+
| patterns.swift:92:23:92:27 | let ... |
83+
| patterns.swift:92:27:92:27 | x |
84+
| patterns.swift:95:13:95:33 | .myPair(...) |
85+
| patterns.swift:95:20:95:33 | (...) |
86+
| patterns.swift:95:21:95:25 | let ... |
87+
| patterns.swift:95:25:95:25 | x |
88+
| patterns.swift:95:28:95:32 | let ... |
89+
| patterns.swift:95:32:95:32 | y |
90+
| patterns.swift:103:10:103:11 | .myNone |
91+
| patterns.swift:105:10:105:25 | .mySingle(...) |
92+
| patterns.swift:105:19:105:25 | (...) |
93+
| patterns.swift:105:20:105:24 | let ... |
94+
| patterns.swift:105:24:105:24 | a |
95+
| patterns.swift:107:10:107:30 | .myPair(...) |
96+
| patterns.swift:107:17:107:30 | (...) |
97+
| patterns.swift:107:18:107:22 | let ... |
98+
| patterns.swift:107:22:107:22 | a |
99+
| patterns.swift:107:25:107:29 | let ... |
100+
| patterns.swift:107:29:107:29 | b |
101+
| patterns.swift:110:10:110:26 | let ... |
102+
| patterns.swift:110:14:110:26 | .myCons(...) |
103+
| patterns.swift:110:21:110:26 | (...) |
104+
| patterns.swift:110:22:110:22 | a |
105+
| patterns.swift:110:25:110:25 | _ |
106+
| patterns.swift:114:13:114:28 | .mySingle(...) |
107+
| patterns.swift:114:22:114:28 | (...) |
108+
| patterns.swift:114:23:114:27 | let ... |
109+
| patterns.swift:114:27:114:27 | x |
110+
| patterns.swift:117:13:117:33 | .myPair(...) |
111+
| patterns.swift:117:20:117:33 | (...) |
112+
| patterns.swift:117:21:117:25 | let ... |
113+
| patterns.swift:117:25:117:25 | x |
114+
| patterns.swift:117:28:117:32 | let ... |
115+
| patterns.swift:117:32:117:32 | y |
116+
| patterns.swift:125:10:125:11 | .myNone |
117+
| patterns.swift:127:10:127:25 | .mySingle(...) |
118+
| patterns.swift:127:19:127:25 | (...) |
119+
| patterns.swift:127:20:127:24 | let ... |
120+
| patterns.swift:127:24:127:24 | a |
121+
| patterns.swift:129:10:129:30 | .myPair(...) |
122+
| patterns.swift:129:17:129:30 | (...) |
123+
| patterns.swift:129:18:129:22 | let ... |
124+
| patterns.swift:129:22:129:22 | a |
125+
| patterns.swift:129:25:129:29 | let ... |
126+
| patterns.swift:129:29:129:29 | b |
127+
| patterns.swift:132:10:132:26 | let ... |
128+
| patterns.swift:132:14:132:26 | .myCons(...) |
129+
| patterns.swift:132:21:132:26 | (...) |
130+
| patterns.swift:132:22:132:22 | a |
131+
| patterns.swift:132:25:132:25 | _ |
132+
| patterns.swift:136:13:136:28 | .mySingle(...) |
133+
| patterns.swift:136:22:136:28 | (...) |
134+
| patterns.swift:136:23:136:27 | let ... |
135+
| patterns.swift:136:27:136:27 | x |
136+
| patterns.swift:139:13:139:33 | .myPair(...) |
137+
| patterns.swift:139:20:139:33 | (...) |
138+
| patterns.swift:139:21:139:25 | let ... |
139+
| patterns.swift:139:25:139:25 | x |
140+
| patterns.swift:139:28:139:32 | let ... |
141+
| patterns.swift:139:32:139:32 | y |
142+
| patterns.swift:144:9:144:9 | b |
143+
| patterns.swift:144:9:144:12 | ... as ... |
144+
| patterns.swift:147:10:147:11 | .myNone |
145+
| patterns.swift:149:10:149:25 | .mySingle(...) |
146+
| patterns.swift:149:19:149:25 | (...) |
147+
| patterns.swift:149:20:149:24 | let ... |
148+
| patterns.swift:149:24:149:24 | a |
149+
| patterns.swift:151:10:151:30 | .myPair(...) |
150+
| patterns.swift:151:17:151:30 | (...) |
151+
| patterns.swift:151:18:151:22 | let ... |
152+
| patterns.swift:151:22:151:22 | a |
153+
| patterns.swift:151:25:151:29 | let ... |
154+
| patterns.swift:151:29:151:29 | b |
155+
| patterns.swift:154:10:154:38 | let ... |
156+
| patterns.swift:154:14:154:38 | .myCons(...) |
157+
| patterns.swift:154:21:154:38 | (...) |
158+
| patterns.swift:154:22:154:22 | a |
159+
| patterns.swift:154:25:154:37 | .myPair(...) |
160+
| patterns.swift:154:32:154:37 | (...) |
161+
| patterns.swift:154:33:154:33 | b |
162+
| patterns.swift:154:36:154:36 | c |
163+
| patterns.swift:158:10:158:26 | let ... |
164+
| patterns.swift:158:14:158:26 | .myCons(...) |
165+
| patterns.swift:158:21:158:26 | (...) |
166+
| patterns.swift:158:22:158:22 | a |
167+
| patterns.swift:158:25:158:25 | _ |
168+
| patterns.swift:162:13:162:28 | .mySingle(...) |
169+
| patterns.swift:162:22:162:28 | (...) |
170+
| patterns.swift:162:23:162:27 | let ... |
171+
| patterns.swift:162:27:162:27 | x |
172+
| patterns.swift:165:13:165:39 | .myPair(...) |
173+
| patterns.swift:165:26:165:39 | (...) |
174+
| patterns.swift:165:27:165:31 | let ... |
175+
| patterns.swift:165:31:165:31 | x |
176+
| patterns.swift:165:34:165:38 | let ... |
177+
| patterns.swift:165:38:165:38 | y |
178+
| patterns.swift:169:13:169:41 | let ... |
179+
| patterns.swift:169:17:169:41 | .myCons(...) |
180+
| patterns.swift:169:24:169:41 | (...) |
181+
| patterns.swift:169:25:169:25 | _ |
182+
| patterns.swift:169:28:169:40 | .myPair(...) |
183+
| patterns.swift:169:35:169:40 | (...) |
184+
| patterns.swift:169:36:169:36 | _ |
185+
| patterns.swift:169:39:169:39 | c |
186+
| patterns.swift:174:10:174:55 | let ... |
187+
| patterns.swift:174:14:174:55 | (...) |
188+
| patterns.swift:174:15:174:27 | .myPair(...) |
189+
| patterns.swift:174:22:174:27 | (...) |
190+
| patterns.swift:174:23:174:23 | a |
191+
| patterns.swift:174:26:174:26 | b |
192+
| patterns.swift:174:30:174:54 | .myCons(...) |
193+
| patterns.swift:174:37:174:54 | (...) |
194+
| patterns.swift:174:38:174:38 | c |
195+
| patterns.swift:174:41:174:53 | .myPair(...) |
196+
| patterns.swift:174:48:174:53 | (...) |
197+
| patterns.swift:174:49:174:49 | d |
198+
| patterns.swift:174:52:174:52 | e |
199+
| patterns.swift:180:5:180:5 | _ |

swift/ql/test/extractor-tests/patterns/bound_and_unbound.expected

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,45 @@ bound
2222
| patterns.swift:57:19:57:19 | c |
2323
| patterns.swift:58:21:58:21 | b |
2424
| patterns.swift:62:18:62:18 | c |
25+
| patterns.swift:78:9:78:9 | a |
26+
| patterns.swift:83:24:83:24 | a |
27+
| patterns.swift:85:22:85:22 | a |
28+
| patterns.swift:85:29:85:29 | b |
29+
| patterns.swift:88:22:88:22 | a |
30+
| patterns.swift:92:27:92:27 | x |
31+
| patterns.swift:95:25:95:25 | x |
32+
| patterns.swift:95:32:95:32 | y |
33+
| patterns.swift:105:24:105:24 | a |
34+
| patterns.swift:107:22:107:22 | a |
35+
| patterns.swift:107:29:107:29 | b |
36+
| patterns.swift:110:22:110:22 | a |
37+
| patterns.swift:114:27:114:27 | x |
38+
| patterns.swift:117:25:117:25 | x |
39+
| patterns.swift:117:32:117:32 | y |
40+
| patterns.swift:127:24:127:24 | a |
41+
| patterns.swift:129:22:129:22 | a |
42+
| patterns.swift:129:29:129:29 | b |
43+
| patterns.swift:132:22:132:22 | a |
44+
| patterns.swift:136:27:136:27 | x |
45+
| patterns.swift:139:25:139:25 | x |
46+
| patterns.swift:139:32:139:32 | y |
47+
| patterns.swift:144:9:144:9 | b |
48+
| patterns.swift:149:24:149:24 | a |
49+
| patterns.swift:151:22:151:22 | a |
50+
| patterns.swift:151:29:151:29 | b |
51+
| patterns.swift:154:22:154:22 | a |
52+
| patterns.swift:154:33:154:33 | b |
53+
| patterns.swift:154:36:154:36 | c |
54+
| patterns.swift:158:22:158:22 | a |
55+
| patterns.swift:162:27:162:27 | x |
56+
| patterns.swift:165:31:165:31 | x |
57+
| patterns.swift:165:38:165:38 | y |
58+
| patterns.swift:169:39:169:39 | c |
59+
| patterns.swift:174:23:174:23 | a |
60+
| patterns.swift:174:26:174:26 | b |
61+
| patterns.swift:174:38:174:38 | c |
62+
| patterns.swift:174:49:174:49 | d |
63+
| patterns.swift:174:52:174:52 | e |
2564
unbound
2665
| patterns.swift:57:16:57:16 | b |
2766
| patterns.swift:58:28:58:28 | c |

0 commit comments

Comments
 (0)