mirror of
https://github.com/github/codeql.git
synced 2026-02-20 08:53:49 +01:00
AST: ensure and else blocks
This commit is contained in:
@@ -145,6 +145,14 @@ class ExprSequence extends Expr {
|
||||
*/
|
||||
class BodyStatement extends ExprSequence {
|
||||
override BodyStatement::Range range;
|
||||
|
||||
/** Gets the `else` block in this block, if any. */
|
||||
final ExprSequence getElse() { result = range.getElse() }
|
||||
|
||||
/** Gets the `ensure` block in this block, if any. */
|
||||
final ExprSequence getEnsure() { result = range.getEnsure() }
|
||||
|
||||
final predicate hasEnsure() { exists(this.getEnsure()) }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -33,8 +33,6 @@ module AstNode {
|
||||
this = any(Generated::Call c).getMethod() and
|
||||
not this instanceof Generated::ScopeResolution
|
||||
or
|
||||
this instanceof Generated::Ensure
|
||||
or
|
||||
this instanceof Generated::Rescue
|
||||
or
|
||||
this instanceof Generated::Constant
|
||||
|
||||
@@ -184,7 +184,25 @@ module ExprSequence {
|
||||
}
|
||||
|
||||
module BodyStatement {
|
||||
abstract class Range extends ExprSequence::Range { }
|
||||
abstract class Range extends ExprSequence::Range {
|
||||
final override Expr getExpr(int n) {
|
||||
result =
|
||||
rank[n + 1](Generated::AstNode node, int i |
|
||||
node = getChild(i) and
|
||||
not node instanceof Generated::Else and
|
||||
not node instanceof Generated::Rescue and
|
||||
not node instanceof Generated::Ensure
|
||||
|
|
||||
node order by i
|
||||
)
|
||||
}
|
||||
|
||||
final ExprSequence getElse() { result = unique(Generated::Else s | s = getChild(_)) }
|
||||
|
||||
final ExprSequence getEnsure() { result = unique(Generated::Ensure s | s = getChild(_)) }
|
||||
|
||||
abstract Generated::AstNode getChild(int i);
|
||||
}
|
||||
}
|
||||
|
||||
module ParenthesizedExpr {
|
||||
@@ -227,6 +245,16 @@ module DoExpr {
|
||||
}
|
||||
}
|
||||
|
||||
module Ensure {
|
||||
class Range extends ExprSequence::Range, @ensure {
|
||||
final override Generated::Ensure generated;
|
||||
|
||||
final override Expr getExpr(int n) { result = generated.getChild(n) }
|
||||
|
||||
final override string toString() { result = "ensure ... end" }
|
||||
}
|
||||
}
|
||||
|
||||
module ScopeResolution {
|
||||
class Range extends Expr::Range, @scope_resolution {
|
||||
final override Generated::ScopeResolution generated;
|
||||
|
||||
@@ -23,7 +23,7 @@ module Method {
|
||||
|
||||
final predicate isSetter() { generated.getName() instanceof Generated::Setter }
|
||||
|
||||
final override Expr getExpr(int i) { result = generated.getChild(i) }
|
||||
final override Generated::AstNode getChild(int i) { result = generated.getChild(i) }
|
||||
|
||||
final override string toString() { result = this.getName() }
|
||||
}
|
||||
@@ -41,7 +41,7 @@ module SingletonMethod {
|
||||
result = generated.getName().(Generated::Setter).getName().getValue() + "="
|
||||
}
|
||||
|
||||
final override Expr getExpr(int i) { result = generated.getChild(i) }
|
||||
final override Generated::AstNode getChild(int i) { result = generated.getChild(i) }
|
||||
|
||||
final override string toString() { result = this.getName() }
|
||||
}
|
||||
@@ -55,7 +55,7 @@ module Lambda {
|
||||
result = generated.getParameters().getChild(n)
|
||||
}
|
||||
|
||||
final override Expr getExpr(int i) {
|
||||
final override Generated::AstNode getChild(int i) {
|
||||
result = generated.getBody().(Generated::DoBlock).getChild(i) or
|
||||
result = generated.getBody().(Generated::Block).getChild(i)
|
||||
}
|
||||
@@ -74,7 +74,7 @@ module DoBlock {
|
||||
class Range extends Block::Range, BodyStatement::Range, @do_block {
|
||||
final override Generated::DoBlock generated;
|
||||
|
||||
final override Expr getExpr(int i) { result = generated.getChild(i) }
|
||||
final override Generated::AstNode getChild(int i) { result = generated.getChild(i) }
|
||||
|
||||
final override Parameter::Range getParameter(int n) {
|
||||
result = generated.getParameters().getChild(n)
|
||||
|
||||
@@ -10,7 +10,7 @@ module Class {
|
||||
class Range extends ModuleBase::Range, @class {
|
||||
final override Generated::Class generated;
|
||||
|
||||
final override Expr getExpr(int i) { result = generated.getChild(i) }
|
||||
final override Generated::AstNode getChild(int i) { result = generated.getChild(i) }
|
||||
|
||||
final string getName() {
|
||||
result = generated.getName().(Generated::Token).getValue() or
|
||||
@@ -29,7 +29,7 @@ module SingletonClass {
|
||||
class Range extends ModuleBase::Range, @singleton_class {
|
||||
final override Generated::SingletonClass generated;
|
||||
|
||||
final override Expr getExpr(int i) { result = generated.getChild(i) }
|
||||
final override Generated::AstNode getChild(int i) { result = generated.getChild(i) }
|
||||
|
||||
final Expr getValue() { result = generated.getValue() }
|
||||
|
||||
@@ -41,7 +41,7 @@ module Module {
|
||||
class Range extends ModuleBase::Range, @module {
|
||||
final override Generated::Module generated;
|
||||
|
||||
final override Expr getExpr(int n) { result = generated.getChild(n) }
|
||||
final override Generated::AstNode getChild(int i) { result = generated.getChild(i) }
|
||||
|
||||
final string getName() {
|
||||
result = generated.getName().(Generated::Token).getValue() or
|
||||
|
||||
Reference in New Issue
Block a user