Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
e9fdbfa
Swift: extract nextCall from ForEachStmt
AlexDenisov Aug 22, 2023
b657301
Swift: update test expectations
AlexDenisov Aug 22, 2023
50d23f1
merge main into for-in getnextcall branch
Sep 8, 2023
a3e250a
Swift: extract iterator variable for for-in loops
Sep 8, 2023
988a871
Swift: add flow through for-in loops
Sep 8, 2023
53ad559
Swift: fix for-try-await CFG
Sep 12, 2023
7ca6b6f
Swift: add dataflow test for async for
Sep 12, 2023
e0fae76
Swift: move IteratorProtocol model to its own file
Sep 13, 2023
56b646a
Merge branch 'main' into rdmarsh2/swift/for-in
Sep 14, 2023
eddca7f
Swift: autoformat for for-in changes
Sep 14, 2023
30b3069
Swift: WIP upgrade script for for-each refactor
Sep 19, 2023
5b77e7d
Swift: for-in upgrade script passing CFG test
Sep 22, 2023
325d6f7
Swift: add expr types to for-in upgrade script
Sep 22, 2023
8ce79e6
Swift: for-in downgrade script
Sep 22, 2023
92fdb7a
Swift: finish upgrade script for for-in PR
Sep 25, 2023
811c33b
Swift: finish downgrade script for for-in PR
Sep 25, 2023
ae1072e
Merge branch 'main' into rdmarsh2/swift/for-in
Sep 26, 2023
293400a
Swift: change note for for-in dataflow
Sep 26, 2023
81ee932
Swift: Fix db types in downgrade script for for-in
Sep 26, 2023
50521f7
Swift: fix ql reference in downgrade script
Sep 26, 2023
a7a50cf
Swift: more downgrade script fixes
Sep 27, 2023
9975a18
Swift: Hopefully fix codegen test failure
Sep 27, 2023
188ad6a
Swift: another attempt at fixing downgrade script
Sep 27, 2023
4799ba0
Swift: yet another downgrade script fix
Sep 27, 2023
d71d6b2
Swift: remove table from downgrade properties
Sep 27, 2023
64e4c1e
Swift: remove another table from downgrade script
Sep 27, 2023
77fd917
Swift: Fix extra param in downgrade script
Sep 27, 2023
b5f1296
Swift: Use getFullyConverted in CFG generation
rdmarsh2 Oct 4, 2023
00068d6
Merge branch 'main' into rdmarsh2/swift/for-in
Oct 4, 2023
9c3b72c
Swift: remove TODO comment
Oct 4, 2023
5dd7c14
Swift: add getSequence back to ForEachStmt
Oct 4, 2023
a402bfc
Swift: update for-in change note
Oct 4, 2023
ec292ca
Swift: Split for-each change note into two lines
Oct 6, 2023
c281db6
Swift: improve QLDoc for getSequence
Oct 6, 2023
8558741
Swift: fix QLDoc formatting for getSequence
Oct 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
class Element extends @element {
string toString() { none() }
}

class ForEachStmt extends Element, @for_each_stmt {
Element getPattern() { for_each_stmts(this, result, _) }

Element getIteratorVar() { for_each_stmt_iterator_vars(this, result) }

Element getIteratorVarPattern() {
pattern_binding_decl_patterns(this.getIteratorVar(), _, result)
}

Element getIteratorVarConcreteDecl() { decl_ref_exprs(this.getNextCallVarRef(), result) }

Element getNextCall() { for_each_stmt_next_calls(this, result) }

Element getNextCallMethodLookup() { apply_exprs(this.getNextCall(), result) }

Element getNextCallFuncRef() { apply_exprs(this.getNextCallMethodLookup(), result) }

Element getNextCallInOutConversion() { self_apply_exprs(this.getNextCallMethodLookup(), result) }

Element getNextCallVarRef() { in_out_exprs(this.getNextCallInOutConversion(), result) }
}

query predicate new_for_each_stmts(ForEachStmt stmt, Element pattern, Element body, Element sequence) {
exists(Element iteratorVar |
for_each_stmts(stmt, pattern, body) and
for_each_stmt_iterator_vars(stmt, iteratorVar) and
pattern_binding_decl_inits(iteratorVar, _, sequence)
)
}

query predicate new_pattern_binding_decls(Element id) {
pattern_binding_decls(id) and
not for_each_stmt_iterator_vars(_, id)
}

query predicate new_pattern_binding_decl_patterns(Element id, int index, Element pattern) {
pattern_binding_decl_patterns(id, index, pattern) and
not for_each_stmt_iterator_vars(_, id)
}

query predicate new_named_patterns(Element pattern, string name) {
named_patterns(pattern, name) and
not exists(Element decl |
pattern_binding_decl_patterns(decl, _, pattern) and
for_each_stmt_iterator_vars(_, decl)
)
}

query predicate new_pattern_binding_decl_inits(Element id, int index, Element init) {
pattern_binding_decl_inits(id, index, init) and
not for_each_stmt_iterator_vars(_, id)
}

query predicate new_dot_syntax_call_exprs(Element id) {
dot_syntax_call_exprs(id) and
not exists(ForEachStmt stmt | id = stmt.getNextCallMethodLookup())
}

query predicate new_self_apply_exprs(Element id, Element base) {
self_apply_exprs(id, base) and
not exists(ForEachStmt stmt | id = stmt.getNextCallMethodLookup())
}

query predicate new_in_out_exprs(Element inOutExpr, Element subExpr) {
in_out_exprs(inOutExpr, subExpr) and
not exists(ForEachStmt stmt | inOutExpr = stmt.getNextCallInOutConversion())
}

query predicate new_apply_exprs(Element id, Element func) {
apply_exprs(id, func) and
not exists(ForEachStmt stmt | id = stmt.getNextCall() or id = stmt.getNextCallMethodLookup())
}

query predicate new_decl_ref_exprs(Element id, Element decl) {
decl_ref_exprs(id, decl) and
not exists(ForEachStmt stmt | stmt.getNextCallVarRef() = id or stmt.getNextCallFuncRef() = id)
}

query predicate new_lookup_exprs(Element id, Element base) {
lookup_exprs(id, base) and
not exists(ForEachStmt stmt | stmt.getNextCallMethodLookup() = id)
}

query predicate new_call_exprs(Element id) {
call_exprs(id) and
not exists(ForEachStmt stmt | stmt.getNextCall() = id)
}

query predicate new_locatable_locations(Element locatable, Element location) {
locatable_locations(locatable, location) and
not exists(ForEachStmt stmt |
locatable = stmt.getIteratorVarPattern() or
locatable = stmt.getIteratorVarConcreteDecl() or
locatable = stmt.getNextCall() or
locatable = stmt.getNextCallMethodLookup() or
locatable = stmt.getNextCallInOutConversion() or
locatable = stmt.getNextCallVarRef()
)
}

query predicate new_concrete_var_decls(Element decl, int introducer_int) {
concrete_var_decls(decl, introducer_int) and
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
}

query predicate new_var_decls(Element decl, string name, Element type) {
var_decls(decl, name, type) and
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
}

query predicate new_var_decl_parent_patterns(Element decl, Element pattern) {
var_decl_parent_patterns(decl, pattern) and
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
}

query predicate new_var_decl_parent_initializers(Element decl, Element init) {
var_decl_parent_initializers(decl, init) and
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
}

query predicate new_expr_types(Element expr, Element type) {
expr_types(expr, type) and
not exists(ForEachStmt stmt |
expr = stmt.getNextCall() or
expr = stmt.getNextCallMethodLookup() or
expr = stmt.getNextCallVarRef() or
expr = stmt.getNextCallFuncRef() or
expr = stmt.getNextCallInOutConversion()
)
}
Loading