mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
Merge branch 'main' into literals
This commit is contained in:
@@ -14,6 +14,26 @@ class Pattern extends AstNode {
|
||||
Variable getAVariable() { result = range.getAVariable() }
|
||||
}
|
||||
|
||||
/**
|
||||
* A "left-hand-side" expression. An `LhsExpr` can occur on the left-hand side of
|
||||
* operator assignments (`AssignOperation`), in patterns (`Pattern`) on the left-hand side of
|
||||
* an assignment (`AssignExpr`) or for loop (`ForExpr`), and as the exception
|
||||
* variable of a `rescue` clause (`RescueClause`).
|
||||
*
|
||||
* An `LhsExpr` can be a simple variable, a constant, a call, or an element reference:
|
||||
* ```rb
|
||||
* var = 1
|
||||
* var += 1
|
||||
* E = 1
|
||||
* foo.bar = 1
|
||||
* foo[0] = 1
|
||||
* rescue E => var
|
||||
* ```
|
||||
*/
|
||||
class LhsExpr extends Pattern, Expr {
|
||||
override LhsExpr::Range range;
|
||||
}
|
||||
|
||||
/** A simple variable pattern. */
|
||||
class VariablePattern extends Pattern {
|
||||
override VariablePattern::Range range;
|
||||
@@ -25,7 +45,12 @@ class VariablePattern extends Pattern {
|
||||
/**
|
||||
* A tuple pattern.
|
||||
*
|
||||
* This includes both tuple patterns in parameters and assignments.
|
||||
* This includes both tuple patterns in parameters and assignments. Example patterns:
|
||||
* ```rb
|
||||
* a, self.b = value
|
||||
* (a, b), c[3] = value
|
||||
* a, b, *rest, c, d = value
|
||||
* ```
|
||||
*/
|
||||
class TuplePattern extends Pattern {
|
||||
override TuplePattern::Range range;
|
||||
@@ -35,4 +60,13 @@ class TuplePattern extends Pattern {
|
||||
|
||||
/** Gets a sub pattern in this tuple pattern. */
|
||||
final Pattern getAnElement() { result = this.getElement(_) }
|
||||
|
||||
/**
|
||||
* Gets the index of the pattern with the `*` marker on it, if it exists.
|
||||
* In the example below the index is `2`.
|
||||
* ```rb
|
||||
* a, b, *rest, c, d = value
|
||||
* ```
|
||||
*/
|
||||
final int getRestIndex() { result = range.getRestIndex() }
|
||||
}
|
||||
|
||||
@@ -29,8 +29,6 @@ module AstNode {
|
||||
or
|
||||
this instanceof Generated::RestAssignment
|
||||
or
|
||||
this = any(Generated::RestAssignment ra).getChild()
|
||||
or
|
||||
this instanceof Generated::Superclass
|
||||
or
|
||||
this instanceof Generated::HeredocBody
|
||||
|
||||
@@ -57,13 +57,15 @@ module ConstantWriteAccess {
|
||||
}
|
||||
|
||||
module ConstantAssignment {
|
||||
abstract class Range extends ConstantWriteAccess::Range { }
|
||||
abstract class Range extends ConstantWriteAccess::Range, LhsExpr::Range {
|
||||
Range() { explicitAssignmentNode(this, _) }
|
||||
|
||||
override string toString() { result = ConstantWriteAccess::Range.super.toString() }
|
||||
}
|
||||
|
||||
private class TokenConstantAssignmentRange extends ConstantAssignment::Range, @token_constant {
|
||||
final override Generated::Constant generated;
|
||||
|
||||
TokenConstantAssignmentRange() { explicitAssignmentNode(this, _) }
|
||||
|
||||
final override string getName() { result = generated.getValue() }
|
||||
|
||||
final override Expr::Range getScopeExpr() { none() }
|
||||
@@ -75,10 +77,7 @@ module ConstantAssignment {
|
||||
final override Generated::ScopeResolution generated;
|
||||
Generated::Constant constant;
|
||||
|
||||
ScopeResolutionAssignmentRange() {
|
||||
constant = generated.getName() and
|
||||
explicitAssignmentNode(this, _)
|
||||
}
|
||||
ScopeResolutionAssignmentRange() { constant = generated.getName() }
|
||||
|
||||
final override string getName() { result = constant.getValue() }
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ module RescueClause {
|
||||
class Range extends Expr::Range, @rescue {
|
||||
final override Generated::Rescue generated;
|
||||
|
||||
final Expr getException(int n) { result = generated.getExceptions().getChild(n) }
|
||||
final LhsExpr getException(int n) { result = generated.getExceptions().getChild(n) }
|
||||
|
||||
final Expr getVariableExpr() { result = generated.getVariable() }
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ module AssignOperation {
|
||||
|
||||
final override string getOperator() { result = generated.getOperator() }
|
||||
|
||||
final override Expr getLhs() { result = generated.getLeft() }
|
||||
final override LhsExpr getLhs() { result = generated.getLeft() }
|
||||
|
||||
final override Expr getRhs() { result = generated.getRight() }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
private import codeql_ruby.AST
|
||||
private import TreeSitter
|
||||
private import codeql_ruby.ast.internal.AST
|
||||
private import codeql_ruby.ast.internal.Expr
|
||||
private import codeql_ruby.ast.internal.Variable
|
||||
private import codeql_ruby.ast.internal.Method
|
||||
private import codeql.Locations
|
||||
@@ -20,6 +21,8 @@ predicate explicitAssignmentNode(Generated::AstNode n, Generated::AstNode assign
|
||||
parent instanceof Generated::DestructuredLeftAssignment
|
||||
or
|
||||
parent instanceof Generated::LeftAssignmentList
|
||||
or
|
||||
parent instanceof Generated::RestAssignment
|
||||
)
|
||||
}
|
||||
|
||||
@@ -40,7 +43,7 @@ predicate implicitParameterAssignmentNode(Generated::AstNode n, Callable::Range
|
||||
}
|
||||
|
||||
module Pattern {
|
||||
class Range extends AstNode::Range {
|
||||
abstract class Range extends AstNode::Range {
|
||||
cached
|
||||
Range() {
|
||||
explicitAssignmentNode(this, _)
|
||||
@@ -56,8 +59,12 @@ module Pattern {
|
||||
}
|
||||
}
|
||||
|
||||
module LhsExpr {
|
||||
abstract class Range extends Pattern::Range, Expr::Range { }
|
||||
}
|
||||
|
||||
module VariablePattern {
|
||||
class Range extends Pattern::Range, @token_identifier {
|
||||
class Range extends LhsExpr::Range, @token_identifier {
|
||||
override Generated::Identifier generated;
|
||||
|
||||
string getVariableName() { result = generated.getValue() }
|
||||
@@ -74,6 +81,14 @@ module TuplePattern {
|
||||
|
||||
class Range extends Pattern::Range, Range_ {
|
||||
Pattern::Range getElement(int i) {
|
||||
exists(Generated::AstNode c | c = getChild(i) |
|
||||
result = c.(Generated::RestAssignment).getChild()
|
||||
or
|
||||
not c instanceof Generated::RestAssignment and result = c
|
||||
)
|
||||
}
|
||||
|
||||
private Generated::AstNode getChild(int i) {
|
||||
result = this.(Generated::DestructuredParameter).getChild(i)
|
||||
or
|
||||
result = this.(Generated::DestructuredLeftAssignment).getChild(i)
|
||||
@@ -81,6 +96,8 @@ module TuplePattern {
|
||||
result = this.(Generated::LeftAssignmentList).getChild(i)
|
||||
}
|
||||
|
||||
int getRestIndex() { result = unique(int i | getChild(i) instanceof Generated::RestAssignment) }
|
||||
|
||||
override Variable getAVariable() { result = this.getElement(_).getAVariable() }
|
||||
|
||||
override string toString() { result = "(..., ...)" }
|
||||
|
||||
Reference in New Issue
Block a user