mirror of
https://github.com/github/codeql.git
synced 2026-02-23 10:23:41 +01:00
232 lines
6.7 KiB
Plaintext
232 lines
6.7 KiB
Plaintext
private import codeql_ruby.AST
|
|
private import codeql_ruby.ast.internal.AST
|
|
private import codeql_ruby.ast.internal.Expr
|
|
private import codeql_ruby.ast.internal.Pattern
|
|
private import codeql_ruby.ast.internal.TreeSitter
|
|
private import codeql_ruby.ast.internal.Variable
|
|
|
|
module Call {
|
|
abstract class Range extends Expr::Range {
|
|
abstract Expr getArgument(int n);
|
|
|
|
final predicate isSetter() { this instanceof LhsExpr }
|
|
|
|
final predicate isNormal() {
|
|
not isSetter() or generated.getParent() instanceof AssignOperation
|
|
}
|
|
|
|
override predicate child(string label, AstNode::Range child) {
|
|
label = "getArgument" and child = getArgument(_)
|
|
}
|
|
}
|
|
}
|
|
|
|
module MethodCall {
|
|
abstract class Range extends Call::Range {
|
|
abstract Block getBlock();
|
|
|
|
abstract Expr getReceiver();
|
|
|
|
abstract string getMethodName();
|
|
|
|
override string toString() { result = "call to " + this.getMethodName() }
|
|
|
|
final override predicate child(string label, AstNode::Range child) {
|
|
super.child(label, child)
|
|
or
|
|
label = "getReceiver" and child = getReceiver()
|
|
or
|
|
label = "getBlock" and child = getBlock()
|
|
}
|
|
}
|
|
|
|
private class IdentifierCallRange extends MethodCall::Range, @token_identifier {
|
|
final override Generated::Identifier generated;
|
|
|
|
IdentifierCallRange() { vcall(this) and not access(this, _) }
|
|
|
|
final override Expr getReceiver() { none() }
|
|
|
|
final override string getMethodName() { result = generated.getValue() }
|
|
|
|
final override Expr getArgument(int n) { none() }
|
|
|
|
final override Block getBlock() { none() }
|
|
}
|
|
|
|
private class ScopeResolutionIdentifierCallRange extends MethodCall::Range, @scope_resolution {
|
|
final override Generated::ScopeResolution generated;
|
|
Generated::Identifier identifier;
|
|
|
|
ScopeResolutionIdentifierCallRange() {
|
|
identifier = generated.getName() and
|
|
not exists(Generated::Call c | c.getMethod() = this)
|
|
}
|
|
|
|
final override Expr getReceiver() { result = generated.getScope() }
|
|
|
|
final override string getMethodName() { result = identifier.getValue() }
|
|
|
|
final override Expr getArgument(int n) { none() }
|
|
|
|
final override Block getBlock() { none() }
|
|
}
|
|
|
|
private class RegularCallRange extends MethodCall::Range, @call {
|
|
final override Generated::Call generated;
|
|
|
|
final override Expr getReceiver() {
|
|
result = generated.getReceiver()
|
|
or
|
|
not exists(generated.getReceiver()) and
|
|
result = generated.getMethod().(Generated::ScopeResolution).getScope()
|
|
}
|
|
|
|
final override string getMethodName() {
|
|
result = "call" and generated.getMethod() instanceof Generated::ArgumentList
|
|
or
|
|
result = generated.getMethod().(Generated::Token).getValue()
|
|
or
|
|
result =
|
|
generated.getMethod().(Generated::ScopeResolution).getName().(Generated::Token).getValue()
|
|
}
|
|
|
|
final override Expr getArgument(int n) {
|
|
result = generated.getArguments().getChild(n)
|
|
or
|
|
not exists(generated.getArguments()) and
|
|
result = generated.getMethod().(Generated::ArgumentList).getChild(n)
|
|
}
|
|
|
|
final override Block getBlock() { result = generated.getBlock() }
|
|
}
|
|
}
|
|
|
|
module ElementReference {
|
|
class Range extends MethodCall::Range, @element_reference {
|
|
final override Generated::ElementReference generated;
|
|
|
|
final override Expr getReceiver() { result = generated.getObject() }
|
|
|
|
final override string getMethodName() { result = "[]" }
|
|
|
|
final override string toString() { result = "...[...]" }
|
|
|
|
final override Expr getArgument(int n) { result = generated.getChild(n) }
|
|
|
|
final override Block getBlock() { none() }
|
|
}
|
|
}
|
|
|
|
module SetterMethodCall {
|
|
class Range extends LhsExpr::Range {
|
|
private MethodCall::Range range;
|
|
|
|
Range() { this = range }
|
|
|
|
final Expr getReceiver() { result = range.getReceiver() }
|
|
|
|
final Expr getArgument(int n) { result = range.getArgument(n) }
|
|
|
|
final string getMethodName() { result = range.getMethodName() }
|
|
|
|
final override string toString() { result = range.toString() }
|
|
|
|
final override predicate child(string label, AstNode::Range child) {
|
|
super.child(label, child)
|
|
or
|
|
label = "getReceiver" and child = getReceiver()
|
|
or
|
|
label = "getArgument" and child = getArgument(_)
|
|
}
|
|
}
|
|
}
|
|
|
|
module YieldCall {
|
|
class Range extends Call::Range, @yield {
|
|
final override Generated::Yield generated;
|
|
|
|
final override Expr getArgument(int n) { result = generated.getChild().getChild(n) }
|
|
|
|
final override string toString() { result = "yield ..." }
|
|
}
|
|
}
|
|
|
|
module SuperCall {
|
|
abstract class Range extends MethodCall::Range { }
|
|
|
|
private class SuperTokenCallRange extends SuperCall::Range, @token_super {
|
|
final override Generated::Super generated;
|
|
|
|
// N.B. `super` tokens can never be accesses, so any vcall with `super` must
|
|
// be a call.
|
|
SuperTokenCallRange() { vcall(this) }
|
|
|
|
final override Expr getReceiver() { none() }
|
|
|
|
final override string getMethodName() { result = generated.getValue() }
|
|
|
|
final override Expr getArgument(int n) { none() }
|
|
|
|
final override Block getBlock() { none() }
|
|
}
|
|
|
|
private class RegularSuperCallRange extends SuperCall::Range, @call {
|
|
final override Generated::Call generated;
|
|
|
|
RegularSuperCallRange() { generated.getMethod() instanceof Generated::Super }
|
|
|
|
final override Expr getReceiver() { none() }
|
|
|
|
final override string getMethodName() {
|
|
result = generated.getMethod().(Generated::Super).getValue()
|
|
}
|
|
|
|
final override Expr getArgument(int n) { result = generated.getArguments().getChild(n) }
|
|
|
|
final override Block getBlock() { result = generated.getBlock() }
|
|
}
|
|
}
|
|
|
|
module BlockArgument {
|
|
class Range extends Expr::Range, @block_argument {
|
|
final override Generated::BlockArgument generated;
|
|
|
|
final Expr getExpr() { result = generated.getChild() }
|
|
|
|
final override string toString() { result = "&..." }
|
|
|
|
final override predicate child(string label, AstNode::Range child) {
|
|
label = "getExpr" and child = getExpr()
|
|
}
|
|
}
|
|
}
|
|
|
|
module SplatArgument {
|
|
class Range extends Expr::Range, @splat_argument {
|
|
final override Generated::SplatArgument generated;
|
|
|
|
final Expr getExpr() { result = generated.getChild() }
|
|
|
|
final override string toString() { result = "*..." }
|
|
|
|
final override predicate child(string label, AstNode::Range child) {
|
|
label = "getExpr" and child = getExpr()
|
|
}
|
|
}
|
|
}
|
|
|
|
module HashSplatArgument {
|
|
class Range extends Expr::Range, @hash_splat_argument {
|
|
final override Generated::HashSplatArgument generated;
|
|
|
|
final Expr getExpr() { result = generated.getChild() }
|
|
|
|
final override string toString() { result = "**..." }
|
|
|
|
final override predicate child(string label, AstNode::Range child) {
|
|
label = "getExpr" and child = getExpr()
|
|
}
|
|
}
|
|
}
|