Swift: for-in downgrade script

This commit is contained in:
Robert Marsh
2023-09-22 19:12:27 +00:00
parent 325d6f738c
commit 8ce79e6be8
4 changed files with 5398 additions and 0 deletions

View File

@@ -0,0 +1,130 @@
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, @pattern_or_none pattern, @brace_stmt_or_none body, @expr_or_none sequence,
@pattern_binding_decl_or_none iteratorVar
) {
for_each_stmt(stmt, pattern, body) and
for_each_stmt_iterator_vars(stmt, iteratorVar) and
(
iteratorVar instanceof @pattern_binding_decl and
pattern_binding_decl_inits(iteratorVar, 0, 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(NewElement decl, string name, Element type) {
var_decls(decl, name, type) and
not exists(ForEachStmt stmt | stmt.getIteratorVarConcreteDecl() = decl)
}
query predicate new_expr_types(NewElement expr, NewElement 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()
)
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,21 @@
description: Revert adding `nextCall` and `iteratorVar` for `forEachStmt`s
compatibility: backwards
for_each_stmt_next_calls.rel: delete
for_each_stmt_iterator_vars.rel: delete
for_each_stmts.rel: run for_in_downgrade.qlo new_for_each_stmts
for_each_stmt_iterator_vars.rel: run for_in_downgrade.qlo for_each_stmt_iterator_vars
pattern_binding_decls.rel: run for_in_downgrade.qlo new_pattern_binding_decls
pattern_binding_decl_patterns.rel: run for_in_downgrade.qlo new_pattern_binding_decl_patterns
named_patterns.rel: run for_in_downgrade.qlo new_named_patterns
pattern_binding_decl_inits.rel: run for_in_downgrade.qlo new_pattern_binding_decl_inits
for_each_stmt_next_calls.rel: run for_in_downgrade.qlo for_each_stmt_next_calls
dot_syntax_call_exprs.rel: run for_in_downgrade.qlo new_dot_syntax_call_exprs
self_apply_exprs.rel: run for_in_downgrade.qlo new_self_apply_exprs
apply_exprs.rel: run for_in_downgrade.qlo new_apply_exprs
decl_ref_exprs.rel: run for_in_downgrade.qlo new_decl_ref_exprs
in_out_exprs.rel: run for_in_downgrade.qlo new_in_out_exprs
call_exprs.rel: run for_in_downgrade.qlo new_call_exprs
locatable_locations.rel: run for_in_downgrade.qlo new_locatable_locations
var_decls.rel: run for_in_downgrade.qlo new_var_decls
concrete_var_decls.rel: run for_in_downgrade.qlo new_concrete_var_decls
expr_types.rel: run for_in_downgrade.qlo new_expr_types