AST: add ElementReference

This commit is contained in:
Arthur Baars
2021-02-15 13:40:00 +01:00
parent 392af7fe76
commit e3f54411d8
5 changed files with 37 additions and 7 deletions

View File

@@ -83,6 +83,18 @@ class Call extends Expr {
final Block getBlock() { result = range.getBlock() }
}
/**
* An element reference; a call to the `[]` method.
* ```rb
* a[0]
* ```
*/
class ElementReference extends Call, @element_reference {
final override ElementReference::Range range;
final override string getAPrimaryQlClass() { result = "ElementReference" }
}
/**
* A call to `yield`.
* ```rb

View File

@@ -49,8 +49,6 @@ module AstNode {
or
this instanceof Generated::Array
or
this instanceof Generated::ElementReference
or
this instanceof Generated::Complex
or
this instanceof Generated::Character

View File

@@ -13,7 +13,7 @@ module Call {
abstract Block getBlock();
final override string toString() { result = "call to " + this.getMethodName() }
override string toString() { result = "call to " + this.getMethodName() }
}
private class IdentifierCallRange extends Call::Range, @token_identifier {
@@ -71,6 +71,22 @@ module Call {
}
}
module ElementReference {
class Range extends Call::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 YieldCall {
class Range extends Call::Range, @yield {
final override Generated::Yield generated;