mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
Merge pull request #136 from github/aibaars/child-parent
Finish AST and add consistency query
This commit is contained in:
20
ql/consistency-queries/AstConsistency.ql
Normal file
20
ql/consistency-queries/AstConsistency.ql
Normal file
@@ -0,0 +1,20 @@
|
||||
import codeql_ruby.AST
|
||||
|
||||
private string getAPrimaryQlClass(AstNode node) {
|
||||
result = node.getAPrimaryQlClass()
|
||||
or
|
||||
not exists(node.getAPrimaryQlClass()) and result = "(none)"
|
||||
}
|
||||
|
||||
query predicate missingParent(AstNode node, string cls) {
|
||||
not exists(node.getParent()) and
|
||||
node.getLocation().getFile().getExtension() != "erb" and
|
||||
not node instanceof Toplevel and
|
||||
cls = getAPrimaryQlClass(node)
|
||||
}
|
||||
|
||||
query predicate multipleParents(AstNode node, AstNode parent, string cls) {
|
||||
parent = node.getParent() and
|
||||
count(node.getParent()) > 1 and
|
||||
cls = getAPrimaryQlClass(parent)
|
||||
}
|
||||
@@ -164,7 +164,7 @@ class BlockArgument extends Expr, @block_argument {
|
||||
* foo(&bar)
|
||||
* ```
|
||||
*/
|
||||
final Expr getExpr() { result = range.getExpr() }
|
||||
final Expr getValue() { result = range.getValue() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -185,7 +185,7 @@ class SplatArgument extends Expr, @splat_argument {
|
||||
* foo(*bar)
|
||||
* ```
|
||||
*/
|
||||
final Expr getExpr() { result = range.getExpr() }
|
||||
final Expr getValue() { result = range.getValue() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -206,5 +206,5 @@ class HashSplatArgument extends Expr, @hash_splat_argument {
|
||||
* foo(**bar)
|
||||
* ```
|
||||
*/
|
||||
final Expr getExpr() { result = range.getExpr() }
|
||||
final Expr getValue() { result = range.getValue() }
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ class ConditionalExpr extends ControlExpr {
|
||||
* Gets the branch of this conditional expression that is taken when the
|
||||
* condition evaluates to `cond`, if any.
|
||||
*/
|
||||
Expr getBranch(boolean cond) { result = range.getBranch(cond) }
|
||||
Stmt getBranch(boolean cond) { result = range.getBranch(cond) }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -57,7 +57,7 @@ class IfExpr extends ConditionalExpr {
|
||||
final predicate isElsif() { this instanceof @elsif }
|
||||
|
||||
/** Gets the 'then' branch of this `if`/`elsif` expression. */
|
||||
final StmtSequence getThen() { result = range.getThen() }
|
||||
final Stmt getThen() { result = range.getThen() }
|
||||
|
||||
/**
|
||||
* Gets the `elsif`/`else` branch of this `if`/`elsif` expression, if any. In
|
||||
@@ -90,7 +90,7 @@ class IfExpr extends ConditionalExpr {
|
||||
* end
|
||||
* ```
|
||||
*/
|
||||
final Expr getElse() { result = range.getElse() }
|
||||
final Stmt getElse() { result = range.getElse() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -117,7 +117,7 @@ class UnlessExpr extends ConditionalExpr, @unless {
|
||||
* end
|
||||
* ```
|
||||
*/
|
||||
final StmtSequence getThen() { result = range.getThen() }
|
||||
final Stmt getThen() { result = range.getThen() }
|
||||
|
||||
/**
|
||||
* Gets the 'else' branch of this `unless` expression. In the following
|
||||
@@ -130,7 +130,7 @@ class UnlessExpr extends ConditionalExpr, @unless {
|
||||
* end
|
||||
* ```
|
||||
*/
|
||||
final StmtSequence getElse() { result = range.getElse() }
|
||||
final Stmt getElse() { result = range.getElse() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -145,13 +145,13 @@ class IfModifierExpr extends ConditionalExpr, @if_modifier {
|
||||
final override string getAPrimaryQlClass() { result = "IfModifierExpr" }
|
||||
|
||||
/**
|
||||
* Gets the expression that is conditionally evaluated. In the following
|
||||
* Gets the statement that is conditionally evaluated. In the following
|
||||
* example, the result is the `Expr` for `foo`.
|
||||
* ```rb
|
||||
* foo if bar
|
||||
* ```
|
||||
*/
|
||||
final Expr getExpr() { result = range.getExpr() }
|
||||
final Stmt getBody() { result = range.getBody() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -166,13 +166,13 @@ class UnlessModifierExpr extends ConditionalExpr, @unless_modifier {
|
||||
final override string getAPrimaryQlClass() { result = "UnlessModifierExpr" }
|
||||
|
||||
/**
|
||||
* Gets the expression that is conditionally evaluated. In the following
|
||||
* Gets the statement that is conditionally evaluated. In the following
|
||||
* example, the result is the `Expr` for `foo`.
|
||||
* ```rb
|
||||
* foo unless bar
|
||||
* ```
|
||||
*/
|
||||
final Expr getExpr() { result = range.getExpr() }
|
||||
final Stmt getBody() { result = range.getBody() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -187,10 +187,10 @@ class TernaryIfExpr extends ConditionalExpr, @conditional {
|
||||
final override string getAPrimaryQlClass() { result = "TernaryIfExpr" }
|
||||
|
||||
/** Gets the 'then' branch of this ternary if expression. */
|
||||
final Expr getThen() { result = range.getThen() }
|
||||
final Stmt getThen() { result = range.getThen() }
|
||||
|
||||
/** Gets the 'else' branch of this ternary if expression. */
|
||||
final Expr getElse() { result = range.getElse() }
|
||||
final Stmt getElse() { result = range.getElse() }
|
||||
}
|
||||
|
||||
class CaseExpr extends ControlExpr, @case__ {
|
||||
@@ -257,7 +257,7 @@ class WhenExpr extends Expr, @when {
|
||||
final override string getAPrimaryQlClass() { result = "WhenExpr" }
|
||||
|
||||
/** Gets the body of this case-when expression. */
|
||||
final StmtSequence getBody() { result = range.getBody() }
|
||||
final Stmt getBody() { result = range.getBody() }
|
||||
|
||||
/**
|
||||
* Gets the `n`th pattern (or condition) in this case-when expression. In the
|
||||
@@ -291,7 +291,7 @@ class Loop extends ControlExpr {
|
||||
override Loop::Range range;
|
||||
|
||||
/** Gets the body of this loop. */
|
||||
Expr getBody() { result = range.getBody() }
|
||||
Stmt getBody() { result = range.getBody() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -320,7 +320,7 @@ class WhileExpr extends ConditionalLoop, @while {
|
||||
final override string getAPrimaryQlClass() { result = "WhileExpr" }
|
||||
|
||||
/** Gets the body of this `while` loop. */
|
||||
final override StmtSequence getBody() { result = range.getBody() }
|
||||
final override Stmt 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 StmtSequence getBody() { result = range.getBody() }
|
||||
final override Stmt getBody() { result = range.getBody() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -379,7 +379,7 @@ class ForExpr extends Loop, @for {
|
||||
final override string getAPrimaryQlClass() { result = "ForExpr" }
|
||||
|
||||
/** Gets the body of this `for` loop. */
|
||||
final override Expr getBody() { result = range.getBody() }
|
||||
final override Stmt getBody() { result = range.getBody() }
|
||||
|
||||
/** Gets the pattern representing the iteration argument. */
|
||||
final Pattern getPattern() { result = range.getPattern() }
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -105,10 +105,10 @@ class BinaryOperation extends Operation, @binary {
|
||||
override BinaryOperation::Range range;
|
||||
|
||||
/** Gets the left operand of this binary operation. */
|
||||
final Expr getLeftOperand() { result = range.getLeftOperand() }
|
||||
final Stmt getLeftOperand() { result = range.getLeftOperand() }
|
||||
|
||||
/** Gets the right operand of this binary operation. */
|
||||
final Expr getRightOperand() { result = range.getRightOperand() }
|
||||
final Stmt getRightOperand() { result = range.getRightOperand() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -445,7 +445,7 @@ class Assignment extends Operation {
|
||||
override Assignment::Range range;
|
||||
|
||||
/** Gets the left hand side of this assignment. */
|
||||
final Expr getLeftOperand() { result = range.getLeftOperand() }
|
||||
Pattern getLeftOperand() { result = range.getLeftOperand() }
|
||||
|
||||
/** Gets the right hand side of this assignment. */
|
||||
final Expr getRightOperand() { result = range.getRightOperand() }
|
||||
@@ -554,6 +554,8 @@ class AssignExponentExpr extends AssignArithmeticOperation, @operator_assignment
|
||||
*/
|
||||
class AssignLogicalOperation extends AssignOperation {
|
||||
override AssignLogicalOperation::Range range;
|
||||
|
||||
final override LhsExpr getLeftOperand() { result = super.getLeftOperand() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -122,7 +122,7 @@ class VariableAccess extends Expr {
|
||||
*
|
||||
* both `a` and `b` are write accesses belonging to the same assignment.
|
||||
*/
|
||||
predicate isExplicitWrite(AstNode assignment) { explicitWriteAccess(this, assignment) }
|
||||
predicate isExplicitWrite(AstNode assignment) { range.isExplicitWrite(assignment) }
|
||||
|
||||
/**
|
||||
* Holds if this access is a write access belonging to an implicit assignment.
|
||||
@@ -139,7 +139,7 @@ class VariableAccess extends Expr {
|
||||
* the access to `elements` in the parameter list is an implicit assignment,
|
||||
* as is the first access to `e`.
|
||||
*/
|
||||
predicate isImplicitWrite() { implicitWriteAccess(this) }
|
||||
predicate isImplicitWrite() { range.isImplicitWrite() }
|
||||
}
|
||||
|
||||
/** An access to a variable where the value is updated. */
|
||||
@@ -161,13 +161,13 @@ class VariableReadAccess extends VariableAccess {
|
||||
}
|
||||
|
||||
/** An access to a local variable. */
|
||||
class LocalVariableAccess extends VariableAccess, @token_identifier {
|
||||
class LocalVariableAccess extends VariableAccess, LocalVariableAccess::LocalVariableRange {
|
||||
final override LocalVariableAccess::Range range;
|
||||
|
||||
final override LocalVariable getVariable() { result = range.getVariable() }
|
||||
|
||||
final override string getAPrimaryQlClass() {
|
||||
not this instanceof SimpleParameter and result = "LocalVariableAccess"
|
||||
not this instanceof NamedParameter and result = "LocalVariableAccess"
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -14,26 +14,4 @@ module AstNode {
|
||||
|
||||
predicate child(string label, AstNode::Range child) { none() }
|
||||
}
|
||||
|
||||
// TODO: Remove
|
||||
private class RemoveWhenFullCoverage extends Range {
|
||||
// Lists the entities that are currently used in tests but do not yet
|
||||
// have an external ASTNode. Perhaps not all entities below need to be
|
||||
// an AST node, for example we include the `in` keyword in `for` loops
|
||||
// in the CFG, but not the AST
|
||||
RemoveWhenFullCoverage() {
|
||||
this = any(Generated::Method m).getName()
|
||||
or
|
||||
this = any(Generated::SingletonMethod m).getName()
|
||||
or
|
||||
this = any(Generated::Call c).getMethod() and
|
||||
not this instanceof Generated::ScopeResolution
|
||||
or
|
||||
this instanceof Generated::RestAssignment
|
||||
or
|
||||
this instanceof Generated::Superclass
|
||||
}
|
||||
|
||||
override string toString() { result = "AstNode" }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,12 +223,12 @@ module BlockArgument {
|
||||
class Range extends Expr::Range, @block_argument {
|
||||
final override Generated::BlockArgument generated;
|
||||
|
||||
final Expr getExpr() { result = generated.getChild() }
|
||||
final Expr getValue() { result = generated.getChild() }
|
||||
|
||||
final override string toString() { result = "&..." }
|
||||
|
||||
final override predicate child(string label, AstNode::Range child) {
|
||||
label = "getExpr" and child = getExpr()
|
||||
label = "getValue" and child = getValue()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -237,12 +237,12 @@ module SplatArgument {
|
||||
class Range extends Expr::Range, @splat_argument {
|
||||
final override Generated::SplatArgument generated;
|
||||
|
||||
final Expr getExpr() { result = generated.getChild() }
|
||||
final Expr getValue() { result = generated.getChild() }
|
||||
|
||||
final override string toString() { result = "*..." }
|
||||
|
||||
final override predicate child(string label, AstNode::Range child) {
|
||||
label = "getExpr" and child = getExpr()
|
||||
label = "getValue" and child = getValue()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -251,12 +251,12 @@ module HashSplatArgument {
|
||||
class Range extends Expr::Range, @hash_splat_argument {
|
||||
final override Generated::HashSplatArgument generated;
|
||||
|
||||
final Expr getExpr() { result = generated.getChild() }
|
||||
final Expr getValue() { result = generated.getChild() }
|
||||
|
||||
final override string toString() { result = "**..." }
|
||||
|
||||
final override predicate child(string label, AstNode::Range child) {
|
||||
label = "getExpr" and child = getExpr()
|
||||
label = "getValue" and child = getValue()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ module ConditionalExpr {
|
||||
abstract class Range extends ControlExpr::Range {
|
||||
abstract Expr getCondition();
|
||||
|
||||
abstract Expr getBranch(boolean cond);
|
||||
abstract Stmt getBranch(boolean cond);
|
||||
|
||||
override predicate child(string label, AstNode::Range child) {
|
||||
label = "getCondition" and child = getCondition()
|
||||
@@ -24,9 +24,9 @@ module ConditionalExpr {
|
||||
|
||||
module IfExpr {
|
||||
abstract class Range extends ConditionalExpr::Range {
|
||||
abstract StmtSequence getThen();
|
||||
abstract Stmt getThen();
|
||||
|
||||
abstract Expr getElse();
|
||||
abstract Stmt getElse();
|
||||
|
||||
final override string toString() {
|
||||
if this instanceof @elsif then result = "elsif ..." else result = "if ..."
|
||||
@@ -46,11 +46,11 @@ module IfExpr {
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
final override StmtSequence getThen() { result = generated.getConsequence() }
|
||||
final override Stmt getThen() { result = generated.getConsequence() }
|
||||
|
||||
final override Expr getElse() { result = generated.getAlternative() }
|
||||
final override Stmt getElse() { result = generated.getAlternative() }
|
||||
|
||||
final override Expr getBranch(boolean cond) {
|
||||
final override Stmt getBranch(boolean cond) {
|
||||
cond = true and result = getThen()
|
||||
or
|
||||
cond = false and result = getElse()
|
||||
@@ -62,9 +62,9 @@ module IfExpr {
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
final override StmtSequence getThen() { result = generated.getConsequence() }
|
||||
final override Stmt getThen() { result = generated.getConsequence() }
|
||||
|
||||
final override Expr getElse() { result = generated.getAlternative() }
|
||||
final override Stmt getElse() { result = generated.getAlternative() }
|
||||
|
||||
final override Expr getBranch(boolean cond) {
|
||||
cond = true and result = getThen()
|
||||
@@ -80,9 +80,9 @@ module UnlessExpr {
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
final StmtSequence getThen() { result = generated.getConsequence() }
|
||||
final Stmt getThen() { result = generated.getConsequence() }
|
||||
|
||||
final StmtSequence getElse() { result = generated.getAlternative() }
|
||||
final Stmt getElse() { result = generated.getAlternative() }
|
||||
|
||||
final override Expr getBranch(boolean cond) {
|
||||
cond = false and result = getThen()
|
||||
@@ -108,16 +108,16 @@ module IfModifierExpr {
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
final Expr getExpr() { result = generated.getBody() }
|
||||
final Stmt getBody() { result = generated.getBody() }
|
||||
|
||||
final override Expr getBranch(boolean cond) { cond = true and result = getExpr() }
|
||||
final override Stmt getBranch(boolean cond) { cond = true and result = getBody() }
|
||||
|
||||
final override string toString() { result = "... if ..." }
|
||||
|
||||
override predicate child(string label, AstNode::Range child) {
|
||||
ConditionalExpr::Range.super.child(label, child)
|
||||
or
|
||||
label = "getExpr" and child = getExpr()
|
||||
label = "getBody" and child = getBody()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -128,16 +128,16 @@ module UnlessModifierExpr {
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
final Expr getExpr() { result = generated.getBody() }
|
||||
final Stmt getBody() { result = generated.getBody() }
|
||||
|
||||
final override Expr getBranch(boolean cond) { cond = false and result = getExpr() }
|
||||
final override Stmt getBranch(boolean cond) { cond = false and result = getBody() }
|
||||
|
||||
final override string toString() { result = "... unless ..." }
|
||||
|
||||
override predicate child(string label, AstNode::Range child) {
|
||||
ConditionalExpr::Range.super.child(label, child)
|
||||
or
|
||||
label = "getExpr" and child = getExpr()
|
||||
label = "getBody" and child = getBody()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -148,11 +148,11 @@ module TernaryIfExpr {
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
final Expr getThen() { result = generated.getConsequence() }
|
||||
final Stmt getThen() { result = generated.getConsequence() }
|
||||
|
||||
final Expr getElse() { result = generated.getAlternative() }
|
||||
final Stmt getElse() { result = generated.getAlternative() }
|
||||
|
||||
final override Expr getBranch(boolean cond) {
|
||||
final override Stmt getBranch(boolean cond) {
|
||||
cond = true and result = getThen()
|
||||
or
|
||||
cond = false and result = getElse()
|
||||
@@ -192,7 +192,7 @@ module WhenExpr {
|
||||
class Range extends Expr::Range, @when {
|
||||
final override Generated::When generated;
|
||||
|
||||
final StmtSequence getBody() { result = generated.getBody() }
|
||||
final Stmt getBody() { result = generated.getBody() }
|
||||
|
||||
final Expr getPattern(int n) { result = generated.getPattern(n).getChild() }
|
||||
|
||||
@@ -208,7 +208,7 @@ module WhenExpr {
|
||||
|
||||
module Loop {
|
||||
abstract class Range extends ControlExpr::Range {
|
||||
abstract Expr getBody();
|
||||
abstract Stmt getBody();
|
||||
|
||||
override predicate child(string label, AstNode::Range child) {
|
||||
label = "getBody" and child = getBody()
|
||||
@@ -232,7 +232,7 @@ module WhileExpr {
|
||||
class Range extends ConditionalLoop::Range, @while {
|
||||
final override Generated::While generated;
|
||||
|
||||
final override StmtSequence getBody() { result = generated.getBody() }
|
||||
final override Stmt getBody() { result = generated.getBody() }
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
@@ -244,7 +244,7 @@ module UntilExpr {
|
||||
class Range extends ConditionalLoop::Range, @until {
|
||||
final override Generated::Until generated;
|
||||
|
||||
final override StmtSequence getBody() { result = generated.getBody() }
|
||||
final override Stmt getBody() { result = generated.getBody() }
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
@@ -256,7 +256,7 @@ module WhileModifierExpr {
|
||||
class Range extends ConditionalLoop::Range, @while_modifier {
|
||||
final override Generated::WhileModifier generated;
|
||||
|
||||
final override Expr getBody() { result = generated.getBody() }
|
||||
final override Stmt getBody() { result = generated.getBody() }
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
@@ -268,7 +268,7 @@ module UntilModifierExpr {
|
||||
class Range extends ConditionalLoop::Range, @until_modifier {
|
||||
final override Generated::UntilModifier generated;
|
||||
|
||||
final override Expr getBody() { result = generated.getBody() }
|
||||
final override Stmt getBody() { result = generated.getBody() }
|
||||
|
||||
final override Expr getCondition() { result = generated.getCondition() }
|
||||
|
||||
|
||||
@@ -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() { strictcount(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);
|
||||
|
||||
@@ -7,7 +7,7 @@ module Operation {
|
||||
abstract class Range extends Expr::Range {
|
||||
abstract string getOperator();
|
||||
|
||||
abstract Expr getAnOperand();
|
||||
abstract Stmt getAnOperand();
|
||||
|
||||
override predicate child(string label, AstNode::Range child) {
|
||||
label = "getAnOperand" and child = getAnOperand()
|
||||
@@ -77,9 +77,9 @@ module BinaryOperation {
|
||||
|
||||
final Expr getLeftOperand() { result = generated.getLeft() }
|
||||
|
||||
final Expr getRightOperand() { result = generated.getRight() }
|
||||
final Stmt getRightOperand() { result = generated.getRight() }
|
||||
|
||||
final override Expr getAnOperand() {
|
||||
final override Stmt getAnOperand() {
|
||||
result = this.getLeftOperand() or result = this.getRightOperand()
|
||||
}
|
||||
|
||||
@@ -245,7 +245,7 @@ module NoRegexMatchExpr {
|
||||
|
||||
module Assignment {
|
||||
abstract class Range extends Operation::Range {
|
||||
abstract Expr getLeftOperand();
|
||||
abstract Pattern getLeftOperand();
|
||||
|
||||
abstract Expr getRightOperand();
|
||||
|
||||
@@ -269,7 +269,7 @@ module AssignExpr {
|
||||
class Range extends Assignment::Range, @assignment {
|
||||
final override Generated::Assignment generated;
|
||||
|
||||
final override Expr getLeftOperand() { result = generated.getLeft() }
|
||||
final override Pattern getLeftOperand() { result = generated.getLeft() }
|
||||
|
||||
final override Expr getRightOperand() { result = generated.getRight() }
|
||||
|
||||
|
||||
@@ -111,6 +111,14 @@ module KeywordParameter {
|
||||
final override string toString() { result = this.getName() }
|
||||
|
||||
final override string getName() { result = generated.getName().getValue() }
|
||||
|
||||
final override Location getLocation() { result = generated.getName().getLocation() }
|
||||
|
||||
final override predicate child(string label, AstNode::Range child) {
|
||||
NamedParameter::Range.super.child(label, child)
|
||||
or
|
||||
label = "getDefaultValue" and child = getDefaultValue()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,6 +135,14 @@ module OptionalParameter {
|
||||
final override string toString() { result = this.getName() }
|
||||
|
||||
final override string getName() { result = generated.getName().getValue() }
|
||||
|
||||
final override Location getLocation() { result = generated.getName().getLocation() }
|
||||
|
||||
final override predicate child(string label, AstNode::Range child) {
|
||||
NamedParameter::Range.super.child(label, child)
|
||||
or
|
||||
label = "getDefaultValue" and child = getDefaultValue()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -116,6 +116,23 @@ private predicate strictlyBefore(Location one, Location two) {
|
||||
one.getStartLine() = two.getStartLine() and one.getStartColumn() < two.getStartColumn()
|
||||
}
|
||||
|
||||
private Generated::AstNode getNodeForIdentifier(Generated::Identifier id) {
|
||||
exists(Generated::AstNode parent | parent = id.getParent() |
|
||||
if
|
||||
parent instanceof Generated::BlockParameter
|
||||
or
|
||||
parent instanceof Generated::SplatParameter
|
||||
or
|
||||
parent instanceof Generated::HashSplatParameter
|
||||
or
|
||||
parent instanceof Generated::KeywordParameter
|
||||
or
|
||||
parent instanceof Generated::OptionalParameter
|
||||
then result = parent
|
||||
else result = id
|
||||
)
|
||||
}
|
||||
|
||||
cached
|
||||
private module Cached {
|
||||
/** Gets the enclosing scope for `node`. */
|
||||
@@ -518,7 +535,7 @@ module LocalVariable {
|
||||
|
||||
final override VariableScope getDeclaringScope() { result = scope }
|
||||
|
||||
final VariableAccess getDefiningAccess() { result = i }
|
||||
final VariableAccess getDefiningAccess() { result = getNodeForIdentifier(i) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -577,28 +594,46 @@ module VariableAccess {
|
||||
abstract class Range extends Expr::Range {
|
||||
abstract Variable getVariable();
|
||||
|
||||
final override string toString() { result = this.getVariable().getName() }
|
||||
final predicate isExplicitWrite(AstNode assignment) {
|
||||
exists(Generated::Identifier i | this = getNodeForIdentifier(i) |
|
||||
explicitWriteAccess(i, assignment)
|
||||
)
|
||||
or
|
||||
not this = getNodeForIdentifier(_) and explicitWriteAccess(this, assignment)
|
||||
}
|
||||
|
||||
override predicate child(string label, AstNode::Range child) { none() }
|
||||
final predicate isImplicitWrite() {
|
||||
exists(Generated::Identifier i | this = getNodeForIdentifier(i) | implicitWriteAccess(i))
|
||||
or
|
||||
not this = getNodeForIdentifier(_) and implicitWriteAccess(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module LocalVariableAccess {
|
||||
class Range extends VariableAccess::Range, @token_identifier {
|
||||
override Generated::Identifier generated;
|
||||
class LocalVariableRange =
|
||||
@token_identifier or @splat_parameter or @keyword_parameter or @optional_parameter or
|
||||
@hash_splat_parameter or @block_parameter;
|
||||
|
||||
class Range extends VariableAccess::Range, LocalVariableRange {
|
||||
LocalVariable variable;
|
||||
|
||||
Range() {
|
||||
access(this, variable) and
|
||||
(
|
||||
explicitWriteAccess(this, _)
|
||||
or
|
||||
implicitWriteAccess(this)
|
||||
or
|
||||
vcall(this)
|
||||
exists(Generated::Identifier id |
|
||||
this = getNodeForIdentifier(id) and
|
||||
access(id, variable) and
|
||||
(
|
||||
explicitWriteAccess(id, _)
|
||||
or
|
||||
implicitWriteAccess(id)
|
||||
or
|
||||
vcall(id)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override string toString() { result = generated.(Generated::Identifier).getValue() }
|
||||
|
||||
final override LocalVariable getVariable() { result = variable }
|
||||
}
|
||||
}
|
||||
@@ -610,6 +645,8 @@ module GlobalVariableAccess {
|
||||
Range() { this.(Generated::GlobalVariable).getValue() = variable.getName() }
|
||||
|
||||
final override GlobalVariable getVariable() { result = variable }
|
||||
|
||||
override string toString() { result = generated.(Generated::GlobalVariable).getValue() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -620,6 +657,8 @@ module InstanceVariableAccess {
|
||||
Range() { instanceVariableAccess(this, variable) }
|
||||
|
||||
final override InstanceVariable getVariable() { result = variable }
|
||||
|
||||
override string toString() { result = generated.(Generated::InstanceVariable).getValue() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -630,5 +669,7 @@ module ClassVariableAccess {
|
||||
Range() { classVariableAccess(this, variable) }
|
||||
|
||||
final override ClassVariable getVariable() { result = variable }
|
||||
|
||||
override string toString() { result = generated.(Generated::ClassVariable).getValue() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,20 @@
|
||||
|
||||
import codeql_ruby.CFG
|
||||
|
||||
query predicate nodes(CfgNode n) { any() }
|
||||
query predicate nodes(CfgNode n, string attr, string val) {
|
||||
attr = "semmle.order" and
|
||||
val =
|
||||
any(int i |
|
||||
n =
|
||||
rank[i](CfgNode p |
|
||||
|
|
||||
p
|
||||
order by
|
||||
p.getLocation().getFile().getBaseName(), p.getLocation().getFile().getAbsolutePath(),
|
||||
p.getLocation().getStartLine()
|
||||
)
|
||||
).toString()
|
||||
}
|
||||
|
||||
query predicate edges(CfgNode pred, CfgNode succ, string attr, string val) {
|
||||
exists(SuccessorType t | succ = pred.getASuccessor(t) |
|
||||
|
||||
@@ -218,7 +218,7 @@ private predicate inMatchingContext(AstNode n) {
|
||||
w.getPattern(_).getChild() = n
|
||||
)
|
||||
or
|
||||
n = any(Trees::DefaultValueParameterTree t | t.hasDefaultValue()).getIdentifier()
|
||||
n = any(Trees::DefaultValueParameterTree t | t.hasDefaultValue())
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -203,7 +203,20 @@ private predicate succImpl(AstNode pred, AstNode succ, Completion c) {
|
||||
any(ControlFlowTree cft).succ(pred, succ, c)
|
||||
}
|
||||
|
||||
private predicate isHidden(ControlFlowTree t) { t.isHidden() }
|
||||
private predicate isHidden(ControlFlowTree t) {
|
||||
t.isHidden()
|
||||
or
|
||||
t = any(Method m).getName()
|
||||
or
|
||||
t = any(SingletonMethod m).getName()
|
||||
or
|
||||
t = any(Call c).getMethod() and
|
||||
not t instanceof ScopeResolution
|
||||
or
|
||||
t instanceof RestAssignment
|
||||
or
|
||||
t instanceof Superclass
|
||||
}
|
||||
|
||||
private predicate succImplIfHidden(AstNode pred, AstNode succ) {
|
||||
isHidden(pred) and
|
||||
@@ -418,9 +431,7 @@ module Trees {
|
||||
}
|
||||
}
|
||||
|
||||
private class BlockParameterTree extends ComplexParameterTree, BlockParameter {
|
||||
final override Identifier getIdentifier() { result = this.getName() }
|
||||
}
|
||||
private class BlockParameterTree extends LeafTree, BlockParameter { }
|
||||
|
||||
private class CaseTree extends PreOrderTree, Case {
|
||||
final override predicate propagatesAbnormal(AstNode child) {
|
||||
@@ -481,47 +492,32 @@ module Trees {
|
||||
|
||||
private class ComplexTree extends LeafTree, Complex { }
|
||||
|
||||
abstract private class ComplexParameterTree extends ControlFlowTree {
|
||||
abstract Identifier getIdentifier();
|
||||
|
||||
final override predicate propagatesAbnormal(AstNode child) { none() }
|
||||
|
||||
final override predicate first(AstNode first) { first(this.getIdentifier(), first) }
|
||||
|
||||
final override predicate last(AstNode last, Completion c) {
|
||||
last(this.getIdentifier(), last, c)
|
||||
}
|
||||
|
||||
final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() }
|
||||
}
|
||||
|
||||
private class ConstantTree extends LeafTree, Constant { }
|
||||
|
||||
/** A parameter that may have a default value. */
|
||||
abstract class DefaultValueParameterTree extends ControlFlowTree {
|
||||
abstract class DefaultValueParameterTree extends PreOrderTree {
|
||||
abstract AstNode getDefaultValue();
|
||||
|
||||
abstract Identifier getIdentifier();
|
||||
|
||||
predicate hasDefaultValue() { exists(this.getDefaultValue()) }
|
||||
|
||||
final override predicate propagatesAbnormal(AstNode child) { child = this.getDefaultValue() }
|
||||
|
||||
final override predicate first(AstNode first) { first(this.getIdentifier(), first) }
|
||||
|
||||
final override predicate last(AstNode last, Completion c) {
|
||||
last(this.getIdentifier(), last, c) and
|
||||
c.(MatchingCompletion).getValue() = true
|
||||
or
|
||||
last(this.getDefaultValue(), last, c)
|
||||
or
|
||||
last(this.getIdentifier(), last, c) and
|
||||
not this.hasDefaultValue() and
|
||||
last(this.getDefaultValue(), last, c) and
|
||||
c instanceof NormalCompletion
|
||||
or
|
||||
last = this and
|
||||
(
|
||||
not this.hasDefaultValue() and
|
||||
c instanceof SimpleCompletion
|
||||
or
|
||||
this.hasDefaultValue() and
|
||||
c.(MatchingCompletion).getValue() = true
|
||||
)
|
||||
}
|
||||
|
||||
final override predicate succ(AstNode pred, AstNode succ, Completion c) {
|
||||
last(this.getIdentifier(), pred, c) and
|
||||
pred = this and
|
||||
first(this.getDefaultValue(), succ) and
|
||||
c.(MatchingCompletion).getValue() = false
|
||||
}
|
||||
@@ -662,9 +658,7 @@ module Trees {
|
||||
|
||||
private class GlobalVariableTree extends LeafTree, GlobalVariable { }
|
||||
|
||||
private class HashSplatParameterTree extends ComplexParameterTree, HashSplatParameter {
|
||||
final override Identifier getIdentifier() { result = this.getName() }
|
||||
}
|
||||
private class HashSplatParameterTree extends LeafTree, HashSplatParameter { }
|
||||
|
||||
private HeredocBody heredoc(HeredocBeginning start) {
|
||||
exists(int i, File f |
|
||||
@@ -721,8 +715,6 @@ module Trees {
|
||||
|
||||
private class KeywordParameterTree extends DefaultValueParameterTree, KeywordParameter {
|
||||
final override AstNode getDefaultValue() { result = this.getValue() }
|
||||
|
||||
final override Identifier getIdentifier() { result = this.getName() }
|
||||
}
|
||||
|
||||
class LambdaTree extends LeafTree, Lambda {
|
||||
@@ -821,8 +813,6 @@ module Trees {
|
||||
|
||||
private class OptionalParameterTree extends DefaultValueParameterTree, OptionalParameter {
|
||||
final override AstNode getDefaultValue() { result = this.getValue() }
|
||||
|
||||
final override Identifier getIdentifier() { result = this.getName() }
|
||||
}
|
||||
|
||||
private class RationalTree extends LeafTree, Rational { }
|
||||
@@ -1183,9 +1173,7 @@ module Trees {
|
||||
}
|
||||
}
|
||||
|
||||
private class SplatParameterTree extends ComplexParameterTree, SplatParameter {
|
||||
final override Identifier getIdentifier() { result = this.getName() }
|
||||
}
|
||||
private class SplatParameterTree extends LeafTree, SplatParameter { }
|
||||
|
||||
private class SuperTree extends LeafTree, Super { }
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import ruby
|
||||
|
||||
query predicate blockArguments(BlockArgument a, Expr e) { e = a.getExpr() }
|
||||
query predicate blockArguments(BlockArgument a, Expr e) { e = a.getValue() }
|
||||
|
||||
query predicate splatArguments(SplatArgument a, Expr e) { e = a.getExpr() }
|
||||
query predicate splatArguments(SplatArgument a, Expr e) { e = a.getValue() }
|
||||
|
||||
query predicate hashSplatArguments(HashSplatArgument a, Expr e) { e = a.getExpr() }
|
||||
query predicate hashSplatArguments(HashSplatArgument a, Expr e) { e = a.getValue() }
|
||||
|
||||
query predicate keywordArguments(Pair a, Expr key, Expr value) {
|
||||
exists(Call c | c.getAnArgument() = a and key = a.getKey() and value = a.getValue())
|
||||
|
||||
@@ -30,13 +30,13 @@ query predicate unlessExprs(
|
||||
query predicate ifModifierExprs(IfModifierExpr e, string pClass, Expr cond, Expr expr) {
|
||||
pClass = e.getAPrimaryQlClass() and
|
||||
cond = e.getCondition() and
|
||||
expr = e.getExpr()
|
||||
expr = e.getBody()
|
||||
}
|
||||
|
||||
query predicate unlessModifierExprs(UnlessModifierExpr e, string pClass, Expr cond, Expr expr) {
|
||||
pClass = e.getAPrimaryQlClass() and
|
||||
cond = e.getCondition() and
|
||||
expr = e.getExpr()
|
||||
expr = e.getBody()
|
||||
}
|
||||
|
||||
query predicate ternaryIfExprs(
|
||||
|
||||
@@ -16,23 +16,23 @@ idParams
|
||||
| params.rb:38:29:38:33 | *blah | blah |
|
||||
| params.rb:38:36:38:43 | **wibble | wibble |
|
||||
| params.rb:41:32:41:32 | x | x |
|
||||
| params.rb:41:35:41:38 | foo | foo |
|
||||
| params.rb:41:41:41:46 | bar | bar |
|
||||
| params.rb:41:35:41:37 | foo | foo |
|
||||
| params.rb:41:41:41:43 | bar | bar |
|
||||
| params.rb:46:28:46:33 | &block | block |
|
||||
| params.rb:49:28:49:30 | xx | xx |
|
||||
| params.rb:49:33:49:39 | yy | yy |
|
||||
| params.rb:49:28:49:29 | xx | xx |
|
||||
| params.rb:49:33:49:34 | yy | yy |
|
||||
| params.rb:53:34:53:34 | x | x |
|
||||
| params.rb:53:37:53:38 | y | y |
|
||||
| params.rb:53:41:53:44 | z | z |
|
||||
| params.rb:53:37:53:37 | y | y |
|
||||
| params.rb:53:41:53:41 | z | z |
|
||||
| params.rb:58:33:58:36 | val1 | val1 |
|
||||
| params.rb:58:39:58:46 | val2 | val2 |
|
||||
| params.rb:58:49:58:58 | val3 | val3 |
|
||||
| params.rb:58:39:58:42 | val2 | val2 |
|
||||
| params.rb:58:49:58:52 | val3 | val3 |
|
||||
| params.rb:62:29:62:34 | &block | block |
|
||||
| params.rb:65:29:65:32 | name | name |
|
||||
| params.rb:65:35:65:42 | age | age |
|
||||
| params.rb:65:35:65:37 | age | age |
|
||||
| params.rb:70:35:70:35 | a | a |
|
||||
| params.rb:70:38:70:45 | b | b |
|
||||
| params.rb:70:48:70:53 | c | c |
|
||||
| params.rb:70:38:70:38 | b | b |
|
||||
| params.rb:70:48:70:48 | c | c |
|
||||
blockParams
|
||||
| params.rb:46:28:46:33 | &block | block |
|
||||
| params.rb:62:29:62:34 | &block | block |
|
||||
@@ -55,18 +55,18 @@ hashSplatParams
|
||||
| params.rb:34:29:34:42 | **double_splat | double_splat |
|
||||
| params.rb:38:36:38:43 | **wibble | wibble |
|
||||
keywordParams
|
||||
| params.rb:41:35:41:38 | foo | foo | (none) |
|
||||
| params.rb:41:41:41:46 | bar | bar | 7 |
|
||||
| params.rb:49:28:49:30 | xx | xx | (none) |
|
||||
| params.rb:49:33:49:39 | yy | yy | 100 |
|
||||
| params.rb:53:37:53:38 | y | y | (none) |
|
||||
| params.rb:53:41:53:44 | z | z | 3 |
|
||||
| params.rb:41:35:41:37 | foo | foo | (none) |
|
||||
| params.rb:41:41:41:43 | bar | bar | 7 |
|
||||
| params.rb:49:28:49:29 | xx | xx | (none) |
|
||||
| params.rb:49:33:49:34 | yy | yy | 100 |
|
||||
| params.rb:53:37:53:37 | y | y | (none) |
|
||||
| params.rb:53:41:53:41 | z | z | 3 |
|
||||
optionalParams
|
||||
| params.rb:58:39:58:46 | val2 | val2 | params.rb:58:46:58:46 | 0 |
|
||||
| params.rb:58:49:58:58 | val3 | val3 | params.rb:58:56:58:58 | 100 |
|
||||
| params.rb:65:35:65:42 | age | age | params.rb:65:41:65:42 | 99 |
|
||||
| params.rb:70:38:70:45 | b | b | params.rb:70:42:70:45 | 1000 |
|
||||
| params.rb:70:48:70:53 | c | c | params.rb:70:52:70:53 | 20 |
|
||||
| params.rb:58:39:58:42 | val2 | val2 | params.rb:58:46:58:46 | 0 |
|
||||
| params.rb:58:49:58:52 | val3 | val3 | params.rb:58:56:58:58 | 100 |
|
||||
| params.rb:65:35:65:37 | age | age | params.rb:65:41:65:42 | 99 |
|
||||
| params.rb:70:38:70:38 | b | b | params.rb:70:42:70:45 | 1000 |
|
||||
| params.rb:70:48:70:48 | c | c | params.rb:70:52:70:53 | 20 |
|
||||
paramsInMethods
|
||||
| params.rb:4:1:5:3 | identifier_method_params | 0 | params.rb:4:30:4:32 | foo | SimpleParameter |
|
||||
| params.rb:4:1:5:3 | identifier_method_params | 1 | params.rb:4:35:4:37 | bar | SimpleParameter |
|
||||
@@ -76,12 +76,12 @@ paramsInMethods
|
||||
| params.rb:30:1:31:3 | method_with_splat | 1 | params.rb:30:31:30:36 | *splat | SplatParameter |
|
||||
| params.rb:30:1:31:3 | method_with_splat | 2 | params.rb:30:39:30:52 | **double_splat | HashSplatParameter |
|
||||
| params.rb:41:1:43:3 | method_with_keyword_params | 0 | params.rb:41:32:41:32 | x | SimpleParameter |
|
||||
| params.rb:41:1:43:3 | method_with_keyword_params | 1 | params.rb:41:35:41:38 | foo | KeywordParameter |
|
||||
| params.rb:41:1:43:3 | method_with_keyword_params | 2 | params.rb:41:41:41:46 | bar | KeywordParameter |
|
||||
| params.rb:41:1:43:3 | method_with_keyword_params | 1 | params.rb:41:35:41:37 | foo | KeywordParameter |
|
||||
| params.rb:41:1:43:3 | method_with_keyword_params | 2 | params.rb:41:41:41:43 | bar | KeywordParameter |
|
||||
| params.rb:46:1:48:3 | use_block_with_keyword | 0 | params.rb:46:28:46:33 | &block | BlockParameter |
|
||||
| params.rb:58:1:59:3 | method_with_optional_params | 0 | params.rb:58:33:58:36 | val1 | SimpleParameter |
|
||||
| params.rb:58:1:59:3 | method_with_optional_params | 1 | params.rb:58:39:58:46 | val2 | OptionalParameter |
|
||||
| params.rb:58:1:59:3 | method_with_optional_params | 2 | params.rb:58:49:58:58 | val3 | OptionalParameter |
|
||||
| params.rb:58:1:59:3 | method_with_optional_params | 1 | params.rb:58:39:58:42 | val2 | OptionalParameter |
|
||||
| params.rb:58:1:59:3 | method_with_optional_params | 2 | params.rb:58:49:58:52 | val3 | OptionalParameter |
|
||||
| params.rb:62:1:64:3 | use_block_with_optional | 0 | params.rb:62:29:62:34 | &block | BlockParameter |
|
||||
paramsInBlocks
|
||||
| params.rb:9:11:11:3 | do ... end | 0 | params.rb:9:15:9:17 | key | SimpleParameter |
|
||||
@@ -90,10 +90,10 @@ paramsInBlocks
|
||||
| params.rb:34:12:35:3 | do ... end | 0 | params.rb:34:16:34:18 | val | SimpleParameter |
|
||||
| params.rb:34:12:35:3 | do ... end | 1 | params.rb:34:21:34:26 | *splat | SplatParameter |
|
||||
| params.rb:34:12:35:3 | do ... end | 2 | params.rb:34:29:34:42 | **double_splat | HashSplatParameter |
|
||||
| params.rb:49:24:51:3 | do ... end | 0 | params.rb:49:28:49:30 | xx | KeywordParameter |
|
||||
| params.rb:49:24:51:3 | do ... end | 1 | params.rb:49:33:49:39 | yy | KeywordParameter |
|
||||
| params.rb:49:24:51:3 | do ... end | 0 | params.rb:49:28:49:29 | xx | KeywordParameter |
|
||||
| params.rb:49:24:51:3 | do ... end | 1 | params.rb:49:33:49:34 | yy | KeywordParameter |
|
||||
| params.rb:65:25:67:3 | do ... end | 0 | params.rb:65:29:65:32 | name | SimpleParameter |
|
||||
| params.rb:65:25:67:3 | do ... end | 1 | params.rb:65:35:65:42 | age | OptionalParameter |
|
||||
| params.rb:65:25:67:3 | do ... end | 1 | params.rb:65:35:65:37 | age | OptionalParameter |
|
||||
paramsInLambdas
|
||||
| params.rb:14:7:14:33 | -> { ... } | 0 | params.rb:14:11:14:13 | foo | SimpleParameter |
|
||||
| params.rb:14:7:14:33 | -> { ... } | 1 | params.rb:14:16:14:18 | bar | SimpleParameter |
|
||||
@@ -103,11 +103,11 @@ paramsInLambdas
|
||||
| params.rb:38:22:38:47 | -> { ... } | 1 | params.rb:38:29:38:33 | *blah | SplatParameter |
|
||||
| params.rb:38:22:38:47 | -> { ... } | 2 | params.rb:38:36:38:43 | **wibble | HashSplatParameter |
|
||||
| params.rb:53:30:55:1 | -> { ... } | 0 | params.rb:53:34:53:34 | x | SimpleParameter |
|
||||
| params.rb:53:30:55:1 | -> { ... } | 1 | params.rb:53:37:53:38 | y | KeywordParameter |
|
||||
| params.rb:53:30:55:1 | -> { ... } | 2 | params.rb:53:41:53:44 | z | KeywordParameter |
|
||||
| params.rb:53:30:55:1 | -> { ... } | 1 | params.rb:53:37:53:37 | y | KeywordParameter |
|
||||
| params.rb:53:30:55:1 | -> { ... } | 2 | params.rb:53:41:53:41 | z | KeywordParameter |
|
||||
| params.rb:70:31:70:64 | -> { ... } | 0 | params.rb:70:35:70:35 | a | SimpleParameter |
|
||||
| params.rb:70:31:70:64 | -> { ... } | 1 | params.rb:70:38:70:45 | b | OptionalParameter |
|
||||
| params.rb:70:31:70:64 | -> { ... } | 2 | params.rb:70:48:70:53 | c | OptionalParameter |
|
||||
| params.rb:70:31:70:64 | -> { ... } | 1 | params.rb:70:38:70:38 | b | OptionalParameter |
|
||||
| params.rb:70:31:70:64 | -> { ... } | 2 | params.rb:70:48:70:48 | c | OptionalParameter |
|
||||
params
|
||||
| params.rb:4:30:4:32 | foo | 0 | SimpleParameter |
|
||||
| params.rb:4:35:4:37 | bar | 1 | SimpleParameter |
|
||||
@@ -130,20 +130,20 @@ params
|
||||
| params.rb:38:29:38:33 | *blah | 1 | SplatParameter |
|
||||
| params.rb:38:36:38:43 | **wibble | 2 | HashSplatParameter |
|
||||
| params.rb:41:32:41:32 | x | 0 | SimpleParameter |
|
||||
| params.rb:41:35:41:38 | foo | 1 | KeywordParameter |
|
||||
| params.rb:41:41:41:46 | bar | 2 | KeywordParameter |
|
||||
| params.rb:41:35:41:37 | foo | 1 | KeywordParameter |
|
||||
| params.rb:41:41:41:43 | bar | 2 | KeywordParameter |
|
||||
| params.rb:46:28:46:33 | &block | 0 | BlockParameter |
|
||||
| params.rb:49:28:49:30 | xx | 0 | KeywordParameter |
|
||||
| params.rb:49:33:49:39 | yy | 1 | KeywordParameter |
|
||||
| params.rb:49:28:49:29 | xx | 0 | KeywordParameter |
|
||||
| params.rb:49:33:49:34 | yy | 1 | KeywordParameter |
|
||||
| params.rb:53:34:53:34 | x | 0 | SimpleParameter |
|
||||
| params.rb:53:37:53:38 | y | 1 | KeywordParameter |
|
||||
| params.rb:53:41:53:44 | z | 2 | KeywordParameter |
|
||||
| params.rb:53:37:53:37 | y | 1 | KeywordParameter |
|
||||
| params.rb:53:41:53:41 | z | 2 | KeywordParameter |
|
||||
| params.rb:58:33:58:36 | val1 | 0 | SimpleParameter |
|
||||
| params.rb:58:39:58:46 | val2 | 1 | OptionalParameter |
|
||||
| params.rb:58:49:58:58 | val3 | 2 | OptionalParameter |
|
||||
| params.rb:58:39:58:42 | val2 | 1 | OptionalParameter |
|
||||
| params.rb:58:49:58:52 | val3 | 2 | OptionalParameter |
|
||||
| params.rb:62:29:62:34 | &block | 0 | BlockParameter |
|
||||
| params.rb:65:29:65:32 | name | 0 | SimpleParameter |
|
||||
| params.rb:65:35:65:42 | age | 1 | OptionalParameter |
|
||||
| params.rb:65:35:65:37 | age | 1 | OptionalParameter |
|
||||
| params.rb:70:35:70:35 | a | 0 | SimpleParameter |
|
||||
| params.rb:70:38:70:45 | b | 1 | OptionalParameter |
|
||||
| params.rb:70:48:70:53 | c | 2 | OptionalParameter |
|
||||
| params.rb:70:38:70:38 | b | 1 | OptionalParameter |
|
||||
| params.rb:70:48:70:48 | c | 2 | OptionalParameter |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,17 +12,17 @@ parameterVariable
|
||||
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key |
|
||||
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value |
|
||||
| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name |
|
||||
| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size |
|
||||
| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first |
|
||||
| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle |
|
||||
| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last |
|
||||
| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a |
|
||||
| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name |
|
||||
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size |
|
||||
| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first |
|
||||
| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle |
|
||||
| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last |
|
||||
| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a |
|
||||
| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d |
|
||||
| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ |
|
||||
| parameters.rb:49:12:49:16 | (..., ...) | parameters.rb:49:13:49:13 | a |
|
||||
| parameters.rb:49:12:49:16 | (..., ...) | parameters.rb:49:15:49:15 | b |
|
||||
| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y |
|
||||
| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y |
|
||||
| scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x |
|
||||
| scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x |
|
||||
| ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b |
|
||||
@@ -30,7 +30,7 @@ parameterVariable
|
||||
| ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements |
|
||||
| ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x |
|
||||
| ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b |
|
||||
| ssa.rb:49:9:49:20 | x | ssa.rb:49:9:49:9 | x |
|
||||
| ssa.rb:49:9:49:9 | x | ssa.rb:49:9:49:9 | x |
|
||||
| ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo |
|
||||
| ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a |
|
||||
| ssa.rb:66:15:66:15 | a | ssa.rb:66:15:66:15 | a |
|
||||
@@ -41,4 +41,4 @@ parameterVariableNoAccess
|
||||
| nested_scopes.rb:18:26:18:26 | x | nested_scopes.rb:18:26:18:26 | x |
|
||||
| scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x |
|
||||
| scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x |
|
||||
| ssa.rb:49:9:49:20 | x | ssa.rb:49:9:49:9 | x |
|
||||
| ssa.rb:49:9:49:9 | x | ssa.rb:49:9:49:9 | x |
|
||||
|
||||
@@ -13,32 +13,32 @@ definition
|
||||
| parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x |
|
||||
| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas |
|
||||
| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas |
|
||||
| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map |
|
||||
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key |
|
||||
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value |
|
||||
| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name |
|
||||
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size |
|
||||
| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first |
|
||||
| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle |
|
||||
| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last |
|
||||
| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name |
|
||||
| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size |
|
||||
| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first |
|
||||
| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle |
|
||||
| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last |
|
||||
| parameters.rb:35:1:38:3 | <uninitialized> | parameters.rb:35:16:35:16 | b |
|
||||
| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a |
|
||||
| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a |
|
||||
| parameters.rb:35:16:35:20 | ... = ... | parameters.rb:35:16:35:16 | b |
|
||||
| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b |
|
||||
| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b |
|
||||
| parameters.rb:40:1:43:3 | <uninitialized> | parameters.rb:40:15:40:15 | e |
|
||||
| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d |
|
||||
| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d |
|
||||
| parameters.rb:40:15:40:19 | ... = ... | parameters.rb:40:15:40:15 | e |
|
||||
| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e |
|
||||
| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e |
|
||||
| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ |
|
||||
| parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a |
|
||||
| parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b |
|
||||
| parameters.rb:53:1:53:6 | ... = ... | parameters.rb:53:1:53:1 | x |
|
||||
| parameters.rb:54:9:57:3 | <captured> | parameters.rb:53:1:53:1 | x |
|
||||
| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y |
|
||||
| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y |
|
||||
| parameters.rb:54:19:54:23 | ... = ... | parameters.rb:53:1:53:1 | x |
|
||||
| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x |
|
||||
| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x |
|
||||
| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a |
|
||||
| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a |
|
||||
| scopes.rb:9:9:18:3 | <captured> | scopes.rb:7:1:7:1 | a |
|
||||
@@ -68,7 +68,7 @@ definition
|
||||
| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x |
|
||||
| ssa.rb:49:1:51:3 | <uninitialized> | ssa.rb:49:14:49:14 | y |
|
||||
| ssa.rb:49:14:49:19 | ... = ... | ssa.rb:49:14:49:14 | y |
|
||||
| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y |
|
||||
| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y |
|
||||
| ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo |
|
||||
| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x |
|
||||
| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x |
|
||||
@@ -100,27 +100,27 @@ read
|
||||
| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:11:41:11:46 | client |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas |
|
||||
| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas |
|
||||
| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map |
|
||||
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:17:13:17:15 | key |
|
||||
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:17:22:17:26 | value |
|
||||
| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name |
|
||||
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size |
|
||||
| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first |
|
||||
| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle |
|
||||
| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last |
|
||||
| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a |
|
||||
| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b |
|
||||
| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d |
|
||||
| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e |
|
||||
| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name |
|
||||
| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size |
|
||||
| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first |
|
||||
| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle |
|
||||
| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last |
|
||||
| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a |
|
||||
| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b |
|
||||
| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d |
|
||||
| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e |
|
||||
| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ |
|
||||
| parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a |
|
||||
| parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b |
|
||||
| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y |
|
||||
| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x |
|
||||
| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y |
|
||||
| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x |
|
||||
| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a |
|
||||
| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a |
|
||||
| scopes.rb:9:9:18:3 | <captured> | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a |
|
||||
@@ -153,7 +153,7 @@ read
|
||||
| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 |
|
||||
| ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b |
|
||||
| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x |
|
||||
| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y |
|
||||
| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y |
|
||||
| ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo |
|
||||
| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x |
|
||||
| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x |
|
||||
@@ -181,26 +181,26 @@ firstRead
|
||||
| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:11:41:11:46 | client |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas |
|
||||
| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas |
|
||||
| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map |
|
||||
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:17:13:17:15 | key |
|
||||
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:17:22:17:26 | value |
|
||||
| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name |
|
||||
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size |
|
||||
| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first |
|
||||
| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle |
|
||||
| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last |
|
||||
| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a |
|
||||
| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b |
|
||||
| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d |
|
||||
| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e |
|
||||
| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name |
|
||||
| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size |
|
||||
| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first |
|
||||
| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle |
|
||||
| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last |
|
||||
| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a |
|
||||
| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b |
|
||||
| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d |
|
||||
| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e |
|
||||
| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ |
|
||||
| parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a |
|
||||
| parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b |
|
||||
| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y |
|
||||
| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x |
|
||||
| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y |
|
||||
| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x |
|
||||
| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a |
|
||||
| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a |
|
||||
| scopes.rb:9:9:18:3 | <captured> | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a |
|
||||
@@ -223,7 +223,7 @@ firstRead
|
||||
| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 |
|
||||
| ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b |
|
||||
| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x |
|
||||
| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y |
|
||||
| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y |
|
||||
| ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo |
|
||||
| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x |
|
||||
| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x |
|
||||
@@ -250,26 +250,26 @@ lastRead
|
||||
| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:11:41:11:46 | client |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas |
|
||||
| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas |
|
||||
| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map |
|
||||
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:17:13:17:15 | key |
|
||||
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:17:22:17:26 | value |
|
||||
| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name |
|
||||
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size |
|
||||
| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first |
|
||||
| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle |
|
||||
| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last |
|
||||
| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a |
|
||||
| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b |
|
||||
| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d |
|
||||
| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e |
|
||||
| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name |
|
||||
| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size |
|
||||
| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first |
|
||||
| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle |
|
||||
| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last |
|
||||
| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a |
|
||||
| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b |
|
||||
| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d |
|
||||
| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e |
|
||||
| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ |
|
||||
| parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a |
|
||||
| parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b |
|
||||
| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y |
|
||||
| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x |
|
||||
| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y |
|
||||
| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x |
|
||||
| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a |
|
||||
| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a |
|
||||
| scopes.rb:9:9:18:3 | <captured> | scopes.rb:7:1:7:1 | a | scopes.rb:11:4:11:4 | a |
|
||||
@@ -293,7 +293,7 @@ lastRead
|
||||
| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 |
|
||||
| ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b |
|
||||
| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x |
|
||||
| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y |
|
||||
| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y |
|
||||
| ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo |
|
||||
| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x |
|
||||
| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x |
|
||||
@@ -306,8 +306,8 @@ lastRead
|
||||
| ssa.rb:84:10:86:8 | <captured> | ssa.rb:82:3:82:10 | captured | ssa.rb:85:15:85:22 | captured |
|
||||
adjacentReads
|
||||
| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | nested_scopes.rb:15:11:15:11 | a |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | parameters.rb:11:14:11:19 | pizzas |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | parameters.rb:26:8:26:11 | name |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | parameters.rb:11:14:11:19 | pizzas |
|
||||
| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | parameters.rb:26:8:26:11 | name |
|
||||
| scopes.rb:9:9:18:3 | <captured> | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | scopes.rb:11:4:11:4 | a |
|
||||
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | scopes.rb:31:10:31:10 | x |
|
||||
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x |
|
||||
@@ -320,12 +320,12 @@ adjacentReads
|
||||
| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x |
|
||||
| ssa.rb:66:11:70:5 | <captured> | ssa.rb:65:3:65:10 | captured | ssa.rb:68:10:68:17 | captured | ssa.rb:69:5:69:12 | captured |
|
||||
phi
|
||||
| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | <uninitialized> |
|
||||
| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:20 | ... = ... |
|
||||
| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | <uninitialized> |
|
||||
| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:19 | ... = ... |
|
||||
| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | <captured> |
|
||||
| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:23 | ... = ... |
|
||||
| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | <uninitialized> |
|
||||
| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:20 | ... = ... |
|
||||
| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | <uninitialized> |
|
||||
| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:19 | ... = ... |
|
||||
| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | <captured> |
|
||||
| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:23 | ... = ... |
|
||||
| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:9 | ... = ... |
|
||||
| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:9 | ... = ... |
|
||||
| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x |
|
||||
@@ -334,5 +334,5 @@ phi
|
||||
| ssa.rb:26:12:26:22 | phi | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem |
|
||||
| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:44:1:47:3 | <uninitialized> |
|
||||
| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:7 | ... = ... |
|
||||
| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | <uninitialized> |
|
||||
| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:19 | ... = ... |
|
||||
| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | <uninitialized> |
|
||||
| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:19 | ... = ... |
|
||||
|
||||
@@ -51,18 +51,18 @@ variableAccess
|
||||
| parameters.rb:3:9:3:9 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope |
|
||||
| parameters.rb:4:9:4:9 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope |
|
||||
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope for order_pizza |
|
||||
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza |
|
||||
| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza |
|
||||
| parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza |
|
||||
| parameters.rb:9:25:9:30 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope for order_pizza |
|
||||
| parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza |
|
||||
| parameters.rb:11:41:11:46 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope for order_pizza |
|
||||
| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope for print_map |
|
||||
| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope for print_map |
|
||||
| parameters.rb:16:3:16:5 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope for print_map |
|
||||
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope |
|
||||
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope |
|
||||
| parameters.rb:17:13:17:15 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope |
|
||||
| parameters.rb:17:22:17:26 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope |
|
||||
| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope for call_block |
|
||||
| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope for call_block |
|
||||
| parameters.rb:22:3:22:7 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope for call_block |
|
||||
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope for opt_param |
|
||||
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:25:1:28:3 | method scope for opt_param |
|
||||
@@ -228,11 +228,11 @@ implicitWrite
|
||||
| parameters.rb:1:14:1:14 | x |
|
||||
| parameters.rb:1:18:1:18 | y |
|
||||
| parameters.rb:7:17:7:22 | client |
|
||||
| parameters.rb:7:26:7:31 | pizzas |
|
||||
| parameters.rb:15:17:15:19 | map |
|
||||
| parameters.rb:7:25:7:31 | *pizzas |
|
||||
| parameters.rb:15:15:15:19 | **map |
|
||||
| parameters.rb:16:16:16:18 | key |
|
||||
| parameters.rb:16:21:16:25 | value |
|
||||
| parameters.rb:21:17:21:21 | block |
|
||||
| parameters.rb:21:16:21:21 | &block |
|
||||
| parameters.rb:25:15:25:18 | name |
|
||||
| parameters.rb:25:33:25:36 | size |
|
||||
| parameters.rb:30:15:30:19 | first |
|
||||
|
||||
Reference in New Issue
Block a user