Add Pattern::getAVariable() and use self range field througout

This commit is contained in:
Tom Hvitved
2020-12-02 09:11:43 +01:00
parent 59263650b1
commit b2483069e0
6 changed files with 78 additions and 54 deletions

View File

@@ -5,19 +5,33 @@ abstract class CallableRange extends AstNode {
abstract Parameter getParameter(int n);
}
private class MethodRange extends CallableRange, @method {
class MethodRange extends CallableRange, @method {
final override Generated::Method generated;
override Parameter getParameter(int n) { result = generated.getParameters().getChild(n) }
string getName() {
result = generated.getName().(Generated::Token).getValue() or
// TODO: use hand-written Symbol class
result = generated.getName().(Generated::Symbol).toString() or
result = generated.getName().(Generated::Setter).getName().getValue() + "="
}
}
private class SingletonMethodRange extends CallableRange, @singleton_method {
class SingletonMethodRange extends CallableRange, @singleton_method {
final override Generated::SingletonMethod generated;
override Parameter getParameter(int n) { result = generated.getParameters().getChild(n) }
string getName() {
result = generated.getName().(Generated::Token).getValue() or
// TODO: use hand-written Symbol class
result = generated.getName().(Generated::Symbol).toString() or
result = generated.getName().(Generated::Setter).getName().getValue() + "="
}
}
private class LambdaRange extends CallableRange, @lambda {
class LambdaRange extends CallableRange, @lambda {
final override Generated::Lambda generated;
final override Parameter getParameter(int n) { result = generated.getParameters().getChild(n) }
@@ -29,13 +43,13 @@ abstract class BlockRange extends CallableRange {
final override Parameter getParameter(int n) { result = params.getChild(n) }
}
private class DoBlockRange extends BlockRange, @do_block {
class DoBlockRange extends BlockRange, @do_block {
final override Generated::DoBlock generated;
DoBlockRange() { params = generated.getParameters() }
}
private class BraceBlockRange extends BlockRange, @block {
class BraceBlockRange extends BlockRange, @block {
final override Generated::Block generated;
BraceBlockRange() { params = generated.getParameters() }

View File

@@ -1,5 +1,6 @@
import codeql_ruby.AST
private import TreeSitter
private import Variable
private import codeql.Locations
private predicate tuplePatternNode(Generated::AstNode n, boolean parameter) {
@@ -36,30 +37,38 @@ predicate assignment(Generated::Identifier i, boolean parameter) { patternNode(i
abstract class PatternRange extends AstNode {
PatternRange() { patternNode(this, _) }
abstract Variable getAVariable();
}
private class VariablePatternRange extends PatternRange {
class VariablePatternRange extends PatternRange {
override Generated::Identifier generated;
string getVariableName() { result = generated.getValue() }
override Variable getAVariable() { access(this, result) }
}
abstract class TuplePatternRange extends PatternRange {
abstract Pattern getElement(int i);
abstract PatternRange getElement(int i);
override Variable getAVariable() { result = this.getElement(_).getAVariable() }
}
private class ParameterTuplePatternRange extends TuplePatternRange {
override Generated::DestructuredParameter generated;
override Pattern getElement(int i) { result = generated.getChild(i) }
override PatternRange getElement(int i) { result = generated.getChild(i) }
}
private class AssignmentTuplePatternRange extends TuplePatternRange {
override Generated::DestructuredLeftAssignment generated;
override Pattern getElement(int i) { result = generated.getChild(i) }
override PatternRange getElement(int i) { result = generated.getChild(i) }
}
private class AssignmentListPatternRange extends TuplePatternRange {
override Generated::LeftAssignmentList generated;
override Pattern getElement(int i) { result = generated.getChild(i) }
override PatternRange getElement(int i) { result = generated.getChild(i) }
}