AST: rename ExprSequence to StmtSequence

This commit is contained in:
Arthur Baars
2021-02-11 15:32:48 +01:00
parent fd6aeba9f5
commit d42b6b651e
16 changed files with 98 additions and 101 deletions

View File

@@ -57,11 +57,11 @@ class IfExpr extends ConditionalExpr {
final predicate isElsif() { this instanceof @elsif }
/** Gets the 'then' branch of this `if`/`elsif` expression. */
final ExprSequence getThen() { result = range.getThen() }
final StmtSequence getThen() { result = range.getThen() }
/**
* Gets the `elsif`/`else` branch of this `if`/`elsif` expression, if any. In
* the following example, the result is an `ExprSequence` containing `b`.
* the following example, the result is a `StmtSequence` containing `b`.
* ```rb
* if foo
* a
@@ -77,7 +77,7 @@ class IfExpr extends ConditionalExpr {
* ```
* There can be at most one result, since `elsif` branches nest. In the
* following example, `ifExpr.getElse()` returns an `ElsifExpr`, and the
* `else` branch is nested inside that. To get the `ExprSequence` for the
* `else` branch is nested inside that. To get the `StmtSequence` for the
* `else` branch, i.e. the one containing `c`, use
* `getElse().(ElsifExpr).getElse()`.
* ```rb
@@ -108,7 +108,7 @@ class UnlessExpr extends ConditionalExpr, @unless {
/**
* Gets the 'then' branch of this `unless` expression. In the following
* example, the result is the `ExprSequence` containing `foo`.
* example, the result is the `StmtSequence` containing `foo`.
* ```rb
* unless a == b then
* foo
@@ -117,11 +117,11 @@ class UnlessExpr extends ConditionalExpr, @unless {
* end
* ```
*/
final ExprSequence getThen() { result = range.getThen() }
final StmtSequence getThen() { result = range.getThen() }
/**
* Gets the 'else' branch of this `unless` expression. In the following
* example, the result is the `ExprSequence` containing `bar`.
* example, the result is the `StmtSequence` containing `bar`.
* ```rb
* unless a == b then
* foo
@@ -130,7 +130,7 @@ class UnlessExpr extends ConditionalExpr, @unless {
* end
* ```
*/
final ExprSequence getElse() { result = range.getElse() }
final StmtSequence getElse() { result = range.getElse() }
}
/**
@@ -220,8 +220,8 @@ class CaseExpr extends ControlExpr, @case__ {
final Expr getValue() { result = range.getValue() }
/**
* Gets the `n`th branch of this case expression, either a `WhenExpr` or an
* `ExprSequence`.
* Gets the `n`th branch of this case expression, either a `WhenExpr` or a
* `StmtSequence`.
*/
final Expr getBranch(int n) { result = range.getBranch(n) }
@@ -235,7 +235,7 @@ class CaseExpr extends ControlExpr, @case__ {
final WhenExpr getAWhenBranch() { result = getABranch() }
/** Gets the `else` branch of this case expression, if any. */
final ExprSequence getElseBranch() { result = getABranch() }
final StmtSequence getElseBranch() { result = getABranch() }
/**
* Gets the number of branches of this case expression.
@@ -257,7 +257,7 @@ class WhenExpr extends Expr, @when {
final override string getAPrimaryQlClass() { result = "WhenExpr" }
/** Gets the body of this case-when expression. */
final ExprSequence getBody() { result = range.getBody() }
final StmtSequence getBody() { result = range.getBody() }
/**
* Gets the `n`th pattern (or condition) in this case-when expression. In the
@@ -320,7 +320,7 @@ class WhileExpr extends ConditionalLoop, @while {
final override string getAPrimaryQlClass() { result = "WhileExpr" }
/** Gets the body of this `while` loop. */
final override ExprSequence getBody() { result = range.getBody() }
final override StmtSequence getBody() { result = range.getBody() }
}
/**
@@ -338,7 +338,7 @@ class UntilExpr extends ConditionalLoop, @until {
final override string getAPrimaryQlClass() { result = "UntilExpr" }
/** Gets the body of this `until` loop. */
final override ExprSequence getBody() { result = range.getBody() }
final override StmtSequence getBody() { result = range.getBody() }
}
/**

View File

@@ -102,25 +102,25 @@ class SymbolLiteral extends Literal {
}
/** A sequence of expressions. */
class ExprSequence extends Expr {
override ExprSequence::Range range;
class StmtSequence extends Expr {
override StmtSequence::Range range;
override string getAPrimaryQlClass() { result = "ExprSequence" }
override string getAPrimaryQlClass() { result = "StmtSequence" }
/** Gets the `n`th expression in this sequence. */
final Expr getExpr(int n) { result = range.getExpr(n) }
/** Gets the `n`th statement in this sequence. */
final Stmt getStmt(int n) { result = range.getStmt(n) }
/** Gets an expression in this sequence. */
final Expr getAnExpr() { result = this.getExpr(_) }
/** Gets a statement in this sequence. */
final Stmt getAStmt() { result = this.getStmt(_) }
/** Gets the last expression in this sequence, if any. */
final Expr getLastExpr() { result = this.getExpr(this.getNumberOfExpressions() - 1) }
final Expr getLastExpr() { result = this.getStmt(this.getNumberOfStatements() - 1) }
/** Gets the number of expressions in this sequence. */
final int getNumberOfExpressions() { result = count(this.getAnExpr()) }
/** Gets the number of statements in this sequence. */
final int getNumberOfStatements() { result = count(this.getAStmt()) }
/** Holds if this sequence has no expressions. */
final predicate isEmpty() { this.getNumberOfExpressions() = 0 }
/** Holds if this sequence has no statements. */
final predicate isEmpty() { this.getNumberOfStatements() = 0 }
}
/**
@@ -128,14 +128,14 @@ class ExprSequence extends Expr {
* or do-block. That is, any body that may also include rescue/ensure/else
* statements.
*/
class BodyStatement extends ExprSequence {
class BodyStatement extends StmtSequence {
override BodyStatement::Range range;
/** Gets the `else` block in this block, if any. */
final ExprSequence getElse() { result = range.getElse() }
final StmtSequence getElse() { result = range.getElse() }
/** Gets the `ensure` block in this block, if any. */
final ExprSequence getEnsure() { result = range.getEnsure() }
final StmtSequence getEnsure() { result = range.getEnsure() }
final predicate hasEnsure() { exists(this.getEnsure()) }
}
@@ -155,7 +155,7 @@ class BodyStatement extends ExprSequence {
* ()
* ```
*/
class ParenthesizedExpr extends ExprSequence, @parenthesized_statements {
class ParenthesizedExpr extends StmtSequence, @parenthesized_statements {
final override ParenthesizedExpr::Range range;
final override string getAPrimaryQlClass() { result = "ParenthesizedExpr" }

View File

@@ -63,7 +63,7 @@ class Lambda extends Callable, BodyStatement, @lambda {
}
/** A block. */
class Block extends Callable, ExprSequence {
class Block extends Callable, StmtSequence {
override Block::Range range;
}

View File

@@ -9,19 +9,19 @@ class ModuleBase extends BodyStatement {
override ModuleBase::Range range;
/** Gets a method defined in this module/class. */
Method getAMethod() { result = this.getAnExpr() }
Method getAMethod() { result = this.getAStmt() }
/** Gets the method named `name` in this module/class, if any. */
Method getMethod(string name) { result = this.getAMethod() and result.getName() = name }
/** Gets a class defined in this module/class. */
Class getAClass() { result = this.getAnExpr() }
Class getAClass() { result = this.getAStmt() }
/** Gets the class named `name` in this module/class, if any. */
Class getClass(string name) { result = this.getAClass() and result.getName() = name }
/** Gets a module defined in this module/class. */
Module getAModule() { result = this.getAnExpr() }
Module getAModule() { result = this.getAStmt() }
/** Gets the module named `name` in this module/class, if any. */
Module getModule(string name) { result = this.getAModule() and result.getName() = name }

View File

@@ -17,7 +17,7 @@ module ConditionalExpr {
module IfExpr {
abstract class Range extends ConditionalExpr::Range {
abstract ExprSequence getThen();
abstract StmtSequence getThen();
abstract Expr getElse();
@@ -31,7 +31,7 @@ module IfExpr {
final override Expr getCondition() { result = generated.getCondition() }
final override ExprSequence getThen() { result = generated.getConsequence() }
final override StmtSequence getThen() { result = generated.getConsequence() }
final override Expr getElse() { result = generated.getAlternative() }
@@ -47,7 +47,7 @@ module IfExpr {
final override Expr getCondition() { result = generated.getCondition() }
final override ExprSequence getThen() { result = generated.getConsequence() }
final override StmtSequence getThen() { result = generated.getConsequence() }
final override Expr getElse() { result = generated.getAlternative() }
@@ -65,9 +65,9 @@ module UnlessExpr {
final override Expr getCondition() { result = generated.getCondition() }
final ExprSequence getThen() { result = generated.getConsequence() }
final StmtSequence getThen() { result = generated.getConsequence() }
final ExprSequence getElse() { result = generated.getAlternative() }
final StmtSequence getElse() { result = generated.getAlternative() }
final override Expr getBranch(boolean cond) {
cond = false and result = getThen()
@@ -143,7 +143,7 @@ module WhenExpr {
class Range extends Expr::Range, @when {
final override Generated::When generated;
final ExprSequence getBody() { result = generated.getBody() }
final StmtSequence getBody() { result = generated.getBody() }
final Expr getPattern(int n) { result = generated.getPattern(n).getChild() }
@@ -167,7 +167,7 @@ module WhileExpr {
class Range extends ConditionalLoop::Range, @while {
final override Generated::While generated;
final override ExprSequence getBody() { result = generated.getBody() }
final override StmtSequence getBody() { result = generated.getBody() }
final override Expr getCondition() { result = generated.getCondition() }
@@ -179,7 +179,7 @@ module UntilExpr {
class Range extends ConditionalLoop::Range, @until {
final override Generated::Until generated;
final override ExprSequence getBody() { result = generated.getBody() }
final override StmtSequence getBody() { result = generated.getBody() }
final override Expr getCondition() { result = generated.getCondition() }
@@ -215,7 +215,7 @@ module ForExpr {
class Range extends Loop::Range, @for {
final override Generated::For generated;
final override ExprSequence getBody() { result = generated.getBody() }
final override StmtSequence getBody() { result = generated.getBody() }
final Pattern getPattern() { result = generated.getPattern() }

View File

@@ -164,17 +164,17 @@ module SymbolLiteral {
}
}
module ExprSequence {
module StmtSequence {
abstract class Range extends Expr::Range {
abstract Expr getExpr(int n);
abstract Stmt getStmt(int n);
int getNumberOfExpressions() { result = count(this.getExpr(_)) }
int getNumberOfStatements() { result = count(this.getStmt(_)) }
override string toString() {
exists(int c | c = this.getNumberOfExpressions() |
exists(int c | c = this.getNumberOfStatements() |
c = 0 and result = ";"
or
c = 1 and result = this.getExpr(0).toString()
c = 1 and result = this.getStmt(0).toString()
or
c > 1 and result = "...; ..."
)
@@ -183,8 +183,8 @@ module ExprSequence {
}
module BodyStatement {
abstract class Range extends ExprSequence::Range {
final override Expr getExpr(int n) {
abstract class Range extends StmtSequence::Range {
final override Stmt getStmt(int n) {
result =
rank[n + 1](Generated::AstNode node, int i |
node = getChild(i) and
@@ -196,59 +196,59 @@ module BodyStatement {
)
}
final ExprSequence getElse() { result = unique(Generated::Else s | s = getChild(_)) }
final StmtSequence getElse() { result = unique(Generated::Else s | s = getChild(_)) }
final ExprSequence getEnsure() { result = unique(Generated::Ensure s | s = getChild(_)) }
final StmtSequence getEnsure() { result = unique(Generated::Ensure s | s = getChild(_)) }
abstract Generated::AstNode getChild(int i);
}
}
module ParenthesizedExpr {
class Range extends ExprSequence::Range, @parenthesized_statements {
class Range extends StmtSequence::Range, @parenthesized_statements {
final override Generated::ParenthesizedStatements generated;
final override Expr getExpr(int n) { result = generated.getChild(n) }
final override Stmt getStmt(int n) { result = generated.getChild(n) }
final override string toString() {
exists(int c | c = this.getNumberOfExpressions() |
exists(int c | c = this.getNumberOfStatements() |
c = 0 and result = "()"
or
c > 0 and result = "(" + ExprSequence::Range.super.toString() + ")"
c > 0 and result = "(" + StmtSequence::Range.super.toString() + ")"
)
}
}
}
module ThenExpr {
class Range extends ExprSequence::Range, @then {
class Range extends StmtSequence::Range, @then {
final override Generated::Then generated;
final override Expr getExpr(int n) { result = generated.getChild(n) }
final override Stmt getStmt(int n) { result = generated.getChild(n) }
}
}
module ElseExpr {
class Range extends ExprSequence::Range, @else {
class Range extends StmtSequence::Range, @else {
final override Generated::Else generated;
final override Expr getExpr(int n) { result = generated.getChild(n) }
final override Stmt getStmt(int n) { result = generated.getChild(n) }
}
}
module DoExpr {
class Range extends ExprSequence::Range, @do {
class Range extends StmtSequence::Range, @do {
final override Generated::Do generated;
final override Expr getExpr(int n) { result = generated.getChild(n) }
final override Stmt getStmt(int n) { result = generated.getChild(n) }
}
}
module Ensure {
class Range extends ExprSequence::Range, @ensure {
class Range extends StmtSequence::Range, @ensure {
final override Generated::Ensure generated;
final override Expr getExpr(int n) { result = generated.getChild(n) }
final override Stmt getStmt(int n) { result = generated.getChild(n) }
final override string toString() { result = "ensure ... end" }
}

View File

@@ -65,7 +65,7 @@ module Lambda {
}
module Block {
abstract class Range extends Callable::Range, ExprSequence::Range {
abstract class Range extends Callable::Range, StmtSequence::Range {
Range() { not generated.getParent() instanceof Generated::Lambda }
}
}
@@ -92,7 +92,7 @@ module BraceBlock {
result = generated.getParameters().getChild(n)
}
final override Expr getExpr(int i) { result = generated.getChild(i) }
final override Stmt getStmt(int i) { result = generated.getChild(i) }
final override string toString() { result = "{ ... }" }
}

View File

@@ -292,21 +292,18 @@ module ExprNodes {
final ExprCfgNode getBranch(boolean cond) { e.hasCfgChild(e.getBranch(cond), this, result) }
}
private class ExprSequenceChildMapping extends ExprChildMapping, ExprSequence {
override predicate relevantChild(Expr e) { e = this.getAnExpr() }
private class StmtSequenceChildMapping extends ExprChildMapping, StmtSequence {
override predicate relevantChild(Expr e) { e = this.getLastExpr() }
}
/** A control-flow node that wraps an `ExprSequence` AST expression. */
class ExprSequenceCfgNode extends ExprCfgNode {
override ExprSequenceChildMapping e;
/** A control-flow node that wraps a `StmtSequence` AST expression. */
class StmtSequenceCfgNode extends ExprCfgNode {
override StmtSequenceChildMapping e;
final override ExprSequence getExpr() { result = ExprCfgNode.super.getExpr() }
final override StmtSequence getExpr() { result = ExprCfgNode.super.getExpr() }
/** Gets the last expression in this sequence, if any. */
final ExprCfgNode getLastExpr() { e.hasCfgChild(e.getLastExpr(), this, result) }
/** Gets the 'n'th expression of this expression sequence. */
final ExprCfgNode getExpr(int n) { e.hasCfgChild(e.getExpr(n), this, result) }
}
private class ForExprChildMapping extends ExprChildMapping, ForExpr {
@@ -324,7 +321,7 @@ module ExprNodes {
}
/** A control-flow node that wraps a `ParenthesizedExpr` AST expression. */
class ParenthesizedExprCfgNode extends ExprSequenceCfgNode {
class ParenthesizedExprCfgNode extends StmtSequenceCfgNode {
ParenthesizedExprCfgNode() { this.getExpr() instanceof ParenthesizedExpr }
}

View File

@@ -126,7 +126,7 @@ private module Cached {
or
nodeFrom.asExpr() = nodeTo.asExpr().(CfgNodes::ExprNodes::AssignExprCfgNode).getRhs()
or
nodeFrom.asExpr() = nodeTo.asExpr().(CfgNodes::ExprNodes::ExprSequenceCfgNode).getLastExpr()
nodeFrom.asExpr() = nodeTo.asExpr().(CfgNodes::ExprNodes::StmtSequenceCfgNode).getLastExpr()
or
nodeFrom.asExpr() = nodeTo.asExpr().(CfgNodes::ExprNodes::ConditionalExprCfgNode).getBranch(_)
or