AST: add redo, retry, empty-statement

This commit is contained in:
Arthur Baars
2021-02-12 14:29:34 +01:00
parent 64cba18c41
commit 015b581f57
4 changed files with 61 additions and 8 deletions

View File

@@ -25,6 +25,15 @@ class Stmt extends AstNode {
Callable getEnclosingCallable() { result = this.getCfgScope() }
}
/**
* An empty statement (`;`).
*/
class EmptyStmt extends Stmt, @token_empty_statement {
final override EmptyStmt::Range range;
final override string getAPrimaryQlClass() { result = "EmptyStmt" }
}
/**
* A statement that may return a value: `return`, `break` and `next`.
*
@@ -82,3 +91,27 @@ class NextStmt extends ReturningStmt, @next {
final override string getAPrimaryQlClass() { result = "NextStmt" }
}
/**
* A `redo` statement.
* ```rb
* redo
* ```
*/
class RedoStmt extends Stmt, @redo {
final override RedoStmt::Range range;
final override string getAPrimaryQlClass() { result = "RedoStmt" }
}
/**
* A `retry` statement.
* ```rb
* retry
* ```
*/
class RetryStmt extends Stmt, @retry {
final override RetryStmt::Range range;
final override string getAPrimaryQlClass() { result = "RetryStmt" }
}

View File

@@ -51,10 +51,6 @@ module AstNode {
or
this instanceof Generated::Superclass
or
this instanceof Generated::EmptyStatement
or
this instanceof Generated::Redo
or
this instanceof Generated::Hash
or
this instanceof Generated::Array

View File

@@ -6,6 +6,14 @@ module Stmt {
abstract class Range extends AstNode::Range { }
}
module EmptyStmt {
class Range extends Stmt::Range, @token_empty_statement {
final override Generated::EmptyStatement generated;
final override string toString() { result = ";" }
}
}
module ReturningStmt {
abstract class Range extends Stmt::Range {
abstract Generated::ArgumentList getArgumentList();
@@ -51,3 +59,19 @@ module NextStmt {
final override Generated::ArgumentList getArgumentList() { result = generated.getChild() }
}
}
module RedoStmt {
class Range extends Stmt::Range, @redo {
final override Generated::Redo generated;
final override string toString() { result = "redo" }
}
}
module RetryStmt {
class Range extends Stmt::Range, @retry {
final override Generated::Retry generated;
final override string toString() { result = "retry" }
}
}

View File

@@ -1973,7 +1973,7 @@ cfg.rb:
# 181| ... == ...
#-----| false -> if ...
#-----| true -> Redo
#-----| true -> redo
# 181| x
#-----| -> 5
@@ -1981,7 +1981,7 @@ cfg.rb:
# 181| 5
#-----| -> ... == ...
# 181| Redo
# 181| redo
#-----| redo -> x
# 182| call to puts
@@ -2651,7 +2651,7 @@ loops.rb:
# 16| ... > ...
#-----| false -> elsif ...
#-----| true -> Redo
#-----| true -> redo
# 16| x
#-----| -> 10
@@ -2659,7 +2659,7 @@ loops.rb:
# 16| 10
#-----| -> ... > ...
# 17| Redo
# 17| redo
#-----| redo -> puts
# 19| call to puts