AST: add ArgumentList

This commit is contained in:
Arthur Baars
2021-02-24 15:22:02 +01:00
parent 336b310668
commit 1a73cf6cc4
2 changed files with 47 additions and 0 deletions

View File

@@ -24,6 +24,23 @@ class Self extends Expr, @token_self {
final override string getAPrimaryQlClass() { result = "Self" }
}
/**
* A sequence of expressions in the right-hand side of an assignment or
* a `return`, `break` or `next` statement.
* ```rb
* x = 1, *items, 3, *more
* return 1, 2
* next *list
* break **map
* return 1, 2, *items, k: 5, **map
* ```
*/
class ArgumentList extends Expr {
override ArgumentList::Range range;
override string getAPrimaryQlClass() { result = "ArgumentList" }
}
/** A sequence of expressions. */
class StmtSequence extends Expr {
override StmtSequence::Range range;

View File

@@ -16,6 +16,36 @@ module Self {
}
}
module ArgumentList {
private class ValidParent = @break or @return or @next or @assignment or @operator_assignment;
abstract class Range extends Expr::Range {
Range() { generated.getParent() instanceof ValidParent }
abstract Expr getElement(int i);
final override string toString() { result = "..., ..." }
override predicate child(string label, AstNode::Range child) {
label = "getElement" and child = getElement(_)
}
}
private class ArgArgumentList extends ArgumentList::Range, @argument_list {
final override Generated::ArgumentList generated;
ArgArgumentList() { count(generated.getChild(_)) != 1 }
final override Expr getElement(int i) { result = generated.getChild(i) }
}
private class AssignmentList extends ArgumentList::Range, @right_assignment_list {
final override Generated::RightAssignmentList generated;
final override Expr getElement(int i) { result = generated.getChild(i) }
}
}
module StmtSequence {
abstract class Range extends Expr::Range {
abstract Stmt getStmt(int n);