Skip to content

Commit 8af7277

Browse files
authored
Merge pull request #13909 from rdmarsh2/rdmarsh2/swift/for-in
Swift: dataflow for `for-in` loops
2 parents ebd640d + 8558741 commit 8af7277

File tree

30 files changed

+11389
-103
lines changed

30 files changed

+11389
-103
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
class Element extends @element {
2+
string toString() { none() }
3+
}
4+
5+
class ForEachStmt extends Element, @for_each_stmt {
6+
Element getPattern() { for_each_stmts(this, result, _) }
7+
8+
Element getIteratorVar() { for_each_stmt_iterator_vars(this, result) }
9+
10+
Element getIteratorVarPattern() {
11+
pattern_binding_decl_patterns(this.getIteratorVar(), _, result)
12+
}
13+
14+
Element getIteratorVarConcreteDecl() { decl_ref_exprs(this.getNextCallVarRef(), result) }
15+
16+
Element getNextCall() { for_each_stmt_next_calls(this, result) }
17+
18+
Element getNextCallMethodLookup() { apply_exprs(this.getNextCall(), result) }
19+
20+
Element getNextCallFuncRef() { apply_exprs(this.getNextCallMethodLookup(), result) }
21+
22+
Element getNextCallInOutConversion() { self_apply_exprs(this.getNextCallMethodLookup(), result) }
23+
24+
Element getNextCallVarRef() { in_out_exprs(this.getNextCallInOutConversion(), result) }
25+
}
26+
27+
query predicate new_for_each_stmts(ForEachStmt stmt, Element pattern, Element body, Element sequence) {
28+
exists(Element iteratorVar |
29+
for_each_stmts(stmt, pattern, body) and
30+
for_each_stmt_iterator_vars(stmt, iteratorVar) and
31+
pattern_binding_decl_inits(iteratorVar, _, sequence)
32+
)
33+
}
34+
35+
query predicate new_pattern_binding_decls(Element id) {
36+
pattern_binding_decls(id) and
37+
not for_each_stmt_iterator_vars(_, id)
38+
}
39+
40+
query predicate new_pattern_binding_decl_patterns(Element id, int index, Element pattern) {
41+
pattern_binding_decl_patterns(id, index, pattern) and
42+
not for_each_stmt_iterator_vars(_, id)
43+
}
44+
45+
query predicate new_named_patterns(Element pattern, string name) {
46+
named_patterns(pattern, name) and
47+
not exists(Element decl |
48+
pattern_binding_decl_patterns(decl, _, pattern) and
49+
for_each_stmt_iterator_vars(_, decl)
50+
)
51+
}
52+
53+
query predicate new_pattern_binding_decl_inits(Element id, int index, Element init) {
54+
pattern_binding_decl_inits(id, index, init) and
55+
not for_each_stmt_iterator_vars(_, id)
56+
}
57+
58+
query predicate new_dot_syntax_call_exprs(Element id) {
59+
dot_syntax_call_exprs(id) and
60+
not exists(ForEachStmt stmt | id = stmt.getNextCallMethodLookup())
61+
}
62+
63+
query predicate new_self_apply_exprs(Element id, Element base) {
64+
self_apply_exprs(id, base) and
65+
not exists(ForEachStmt stmt | id = stmt.getNextCallMethodLookup())
66+
}
67+
68+
query predicate new_in_out_exprs(Element inOutExpr, Element subExpr) {
69+
in_out_exprs(inOutExpr, subExpr) and
70+
not exists(ForEachStmt stmt | inOutExpr = stmt.getNextCallInOutConversion())
71+
}
72+
73+
query predicate new_apply_exprs(Element id, Element func) {
74+
apply_exprs(id, func) and
75+
not exists(ForEachStmt stmt | id = stmt.getNextCall() or id = stmt.getNextCallMethodLookup())
76+
}
77+
78+
query predicate new_decl_ref_exprs(Element id, Element decl) {
79+
decl_ref_exprs(id, decl) and
80+
not exists(ForEachStmt stmt | stmt.getNextCallVarRef() = id or stmt.getNextCallFuncRef() = id)
81+
}
82+
83+
query predicate new_lookup_exprs(Element id, Element base) {
84+
lookup_exprs(id, base) and
85+
not exists(ForEachStmt stmt | stmt.getNextCallMethodLookup() = id)
86+
}
87+
88+
query predicate new_call_exprs(Element id) {
89+
call_exprs(id) and
90+
not exists(ForEachStmt stmt | stmt.getNextCall() = id)
91+
}
92+
93+
query predicate new_locatable_locations(Element locatable, Element location) {
94+
locatable_locations(locatable, location) and
95+
not exists(ForEachStmt stmt |
96+
locatable = stmt.getIteratorVarPattern() or
97+
locatable = stmt.getIteratorVarConcreteDecl() or
98+
locatable = stmt.getNextCall() or
99+
locatable = stmt.getNextCallMethodLookup() or
100+
locatable = stmt.getNextCallInOutConversion() or
101+
locatable = stmt.getNextCallVarRef()
102+
)
103+
}
104+
105+
query predicate new_concrete_var_decls(Element decl, int introducer_int) {
106+
concrete_var_decls(decl, introducer_int) and
107+
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
108+
}
109+
110+
query predicate new_var_decls(Element decl, string name, Element type) {
111+
var_decls(decl, name, type) and
112+
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
113+
}
114+
115+
query predicate new_var_decl_parent_patterns(Element decl, Element pattern) {
116+
var_decl_parent_patterns(decl, pattern) and
117+
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
118+
}
119+
120+
query predicate new_var_decl_parent_initializers(Element decl, Element init) {
121+
var_decl_parent_initializers(decl, init) and
122+
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
123+
}
124+
125+
query predicate new_expr_types(Element expr, Element type) {
126+
expr_types(expr, type) and
127+
not exists(ForEachStmt stmt |
128+
expr = stmt.getNextCall() or
129+
expr = stmt.getNextCallMethodLookup() or
130+
expr = stmt.getNextCallVarRef() or
131+
expr = stmt.getNextCallFuncRef() or
132+
expr = stmt.getNextCallInOutConversion()
133+
)
134+
}

0 commit comments

Comments
 (0)