Skip to content

Commit

Permalink
Merge pull request #54 from github/hvitved/ast-final
Browse files Browse the repository at this point in the history
Mark more AST predicates as `final`
  • Loading branch information
hvitved authored Dec 1, 2020
2 parents 11927a9 + 311a0b6 commit 965b351
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 124 deletions.
26 changes: 13 additions & 13 deletions ql/src/codeql_ruby/ast/Method.qll
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ class Callable extends AstNode {
class Method extends Callable, @method {
final override Generated::Method generated;

override string describeQlClass() { result = "Method" }
final override string describeQlClass() { result = "Method" }

override string toString() { result = this.getName() }
final override string toString() { result = this.getName() }

/** Gets the name of this method. */
string getName() {
final string getName() {
result = generated.getName().(Generated::Token).getValue() or
// TODO: use hand-written Symbol class
result = generated.getName().(Generated::Symbol).toString() or
Expand All @@ -42,19 +42,19 @@ class Method extends Callable, @method {
* end
* ```
*/
predicate isSetter() { generated.getName() instanceof Generated::Setter }
final predicate isSetter() { generated.getName() instanceof Generated::Setter }
}

/** A singleton method. */
class SingletonMethod extends Callable, @singleton_method {
final override Generated::SingletonMethod generated;

override string describeQlClass() { result = "SingletonMethod" }
final override string describeQlClass() { result = "SingletonMethod" }

override string toString() { result = this.getName() }
final override string toString() { result = this.getName() }

/** Gets the name of this method. */
string getName() {
final string getName() {
result = generated.getName().(Generated::Token).getValue() or
// TODO: use hand-written Symbol class
result = generated.getName().(Generated::Symbol).toString() or
Expand All @@ -71,9 +71,9 @@ class SingletonMethod extends Callable, @singleton_method {
class Lambda extends Callable, @lambda {
final override Generated::Lambda generated;

override string describeQlClass() { result = "Lambda" }
final override string describeQlClass() { result = "Lambda" }

override string toString() { result = "-> { ... }" }
final override string toString() { result = "-> { ... }" }
}

/** A block. */
Expand All @@ -85,9 +85,9 @@ class Block extends AstNode, Callable {
class DoBlock extends Block, @do_block {
final override Generated::DoBlock generated;

override string describeQlClass() { result = "DoBlock" }
final override string describeQlClass() { result = "DoBlock" }

override string toString() { result = "| ... |" }
final override string toString() { result = "| ... |" }
}

/**
Expand All @@ -99,7 +99,7 @@ class DoBlock extends Block, @do_block {
class BraceBlock extends Block, @block {
final override Generated::Block generated;

override string describeQlClass() { result = "BraceBlock" }
final override string describeQlClass() { result = "BraceBlock" }

override string toString() { result = "{ ... }" }
final override string toString() { result = "{ ... }" }
}
66 changes: 30 additions & 36 deletions ql/src/codeql_ruby/ast/Parameter.qll
Original file line number Diff line number Diff line change
Expand Up @@ -17,28 +17,22 @@ class Parameter extends AstNode {
}

/** Gets the callable that this parameter belongs to. */
Callable getCallable() { result.getAParameter() = this }
final Callable getCallable() { result.getAParameter() = this }

/** Gets the zero-based position of this parameter. */
int getPosition() { result = pos }
final int getPosition() { result = pos }
}

/**
* A parameter defined using a pattern.
*
* This includes both simple parameters and tuple parameters.
*/
class PatternParameter extends Parameter, Pattern {
override string toString() { result = Pattern.super.toString() }

override Location getLocation() { result = Pattern.super.getLocation() }
}
class PatternParameter extends Parameter, Pattern { }

/** A parameter defined using a tuple pattern. */
class TuplePatternParameter extends PatternParameter, TuplePattern {
override string toString() { result = TuplePattern.super.toString() }

override string describeQlClass() { result = "TuplePatternParameter" }
final override string describeQlClass() { result = "TuplePatternParameter" }
}

/** A named parameter. */
Expand All @@ -57,13 +51,13 @@ class NamedParameter extends Parameter {

/** A simple (normal) parameter. */
class SimpleParameter extends NamedParameter, PatternParameter, VariablePattern {
override string getName() { result = VariablePattern.super.getName() }
final override string getName() { result = this.getVariableName() }

final override Variable getVariable() { result = TLocalVariable(_, _, this) }

override string describeQlClass() { result = "SimpleParameter" }
final override string describeQlClass() { result = "SimpleParameter" }

override string toString() { result = this.getName() }
final override string toString() { result = this.getName() }
}

/**
Expand All @@ -75,15 +69,15 @@ class SimpleParameter extends NamedParameter, PatternParameter, VariablePattern
* ```
*/
class BlockParameter extends @block_parameter, NamedParameter {
override Generated::BlockParameter generated;
final override Generated::BlockParameter generated;

final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }

override string describeQlClass() { result = "BlockParameter" }
final override string describeQlClass() { result = "BlockParameter" }

override string toString() { result = "&" + this.getName() }
final override string toString() { result = "&" + this.getName() }

override string getName() { result = generated.getName().getValue() }
final override string getName() { result = generated.getName().getValue() }
}

/**
Expand All @@ -96,15 +90,15 @@ class BlockParameter extends @block_parameter, NamedParameter {
* ```
*/
class HashSplatParameter extends @hash_splat_parameter, NamedParameter {
override Generated::HashSplatParameter generated;
final override Generated::HashSplatParameter generated;

final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }

override string describeQlClass() { result = "HashSplatParameter" }
final override string describeQlClass() { result = "HashSplatParameter" }

override string toString() { result = "**" + this.getName() }
final override string toString() { result = "**" + this.getName() }

override string getName() { result = generated.getName().getValue() }
final override string getName() { result = generated.getName().getValue() }
}

/**
Expand All @@ -119,29 +113,29 @@ class HashSplatParameter extends @hash_splat_parameter, NamedParameter {
* ```
*/
class KeywordParameter extends @keyword_parameter, NamedParameter {
override Generated::KeywordParameter generated;
final override Generated::KeywordParameter generated;

final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }

override string describeQlClass() { result = "KeywordParameter" }
final override string describeQlClass() { result = "KeywordParameter" }

override string getName() { result = generated.getName().getValue() }
final override string getName() { result = generated.getName().getValue() }

/**
* Gets the default value, i.e. the value assigned to the parameter when one
* is not provided by the caller. If the parameter is mandatory and does not
* have a default value, this predicate has no result.
* TODO: better return type (Expr?)
*/
AstNode getDefaultValue() { result = generated.getValue() }
final AstNode getDefaultValue() { result = generated.getValue() }

/**
* Holds if the parameter is optional. That is, there is a default value that
* is used when the caller omits this parameter.
*/
predicate isOptional() { exists(this.getDefaultValue()) }
final predicate isOptional() { exists(this.getDefaultValue()) }

override string toString() { result = this.getName() }
final override string toString() { result = this.getName() }
}

/**
Expand All @@ -154,22 +148,22 @@ class KeywordParameter extends @keyword_parameter, NamedParameter {
* ```
*/
class OptionalParameter extends @optional_parameter, NamedParameter {
override Generated::OptionalParameter generated;
final override Generated::OptionalParameter generated;

final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }

override string describeQlClass() { result = "OptionalParameter" }
final override string describeQlClass() { result = "OptionalParameter" }

override string toString() { result = this.getName() }
final override string toString() { result = this.getName() }

override string getName() { result = generated.getName().getValue() }
final override string getName() { result = generated.getName().getValue() }

/**
* Gets the default value, i.e. the value assigned to the parameter when one
* is not provided by the caller.
* TODO: better return type (Expr?)
*/
AstNode getDefaultValue() { result = generated.getValue() }
final AstNode getDefaultValue() { result = generated.getValue() }
}

/**
Expand All @@ -181,13 +175,13 @@ class OptionalParameter extends @optional_parameter, NamedParameter {
* ```
*/
class SplatParameter extends @splat_parameter, NamedParameter {
override Generated::SplatParameter generated;
final override Generated::SplatParameter generated;

final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }

override string describeQlClass() { result = "SplatParameter" }
final override string describeQlClass() { result = "SplatParameter" }

override string toString() { result = this.getName() }
final override string toString() { result = "*" + this.getName() }

override string getName() { result = generated.getName().getValue() }
final override string getName() { result = generated.getName().getValue() }
}
8 changes: 4 additions & 4 deletions ql/src/codeql_ruby/ast/Pattern.qll
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ class Pattern extends AstNode {

/** A simple variable pattern. */
class VariablePattern extends Pattern {
override Generated::Identifier generated;
final override Generated::Identifier generated;

/** Gets the name of the variable used in this pattern. */
string getName() { result = generated.getValue() }
final string getVariableName() { result = generated.getValue() }

/** Gets the variable used in this pattern. */
Variable getVariable() { this = result.getAnAccess() }

override string toString() { result = this.getName() }
override string toString() { result = this.getVariableName() }
}

/**
Expand All @@ -36,5 +36,5 @@ class TuplePattern extends Pattern {
/** Gets a sub pattern in this tuple pattern. */
final Pattern getAnElement() { result = this.getElement(_) }

override string toString() { result = "(..., ...)" }
final override string toString() { result = "(..., ...)" }
}
61 changes: 6 additions & 55 deletions ql/src/codeql_ruby/ast/Variable.qll
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ private import internal.Variable
/** A scope in which variables can be declared. */
class VariableScope extends TScope {
/** Gets a textual representation of this element. */
string toString() { none() }
final string toString() { result = this.(VariableScopeRange).toString() }

/** Gets the program element this scope is associated with, if any. */
AstNode getScopeElement() { none() }
final AstNode getScopeElement() { result = this.(VariableScopeRange).getScopeElement() }

/** Gets the location of the program element this scope is associated with. */
final Location getLocation() { result = getScopeElement().getLocation() }
Expand All @@ -26,60 +26,19 @@ class VariableScope extends TScope {
}
}

/** A top-level scope. */
class TopLevelScope extends VariableScope, TTopLevelScope {
final override string toString() { result = "top-level scope" }

final override AstNode getScopeElement() { TTopLevelScope(result) = this }
}

/** A module scope. */
class ModuleScope extends VariableScope, TModuleScope {
final override string toString() { result = "module scope" }

final override AstNode getScopeElement() { TModuleScope(result) = this }
}

/** A class scope. */
class ClassScope extends VariableScope, TClassScope {
final override string toString() { result = "class scope" }

final override AstNode getScopeElement() { TClassScope(result) = this }
}

/** A callable scope. */
class CallableScope extends VariableScope, TCallableScope {
private Callable c;

CallableScope() { this = TCallableScope(c) }

final override string toString() {
(c instanceof Method or c instanceof SingletonMethod) and
result = "method scope"
or
c instanceof Lambda and
result = "lambda scope"
or
c instanceof Block and
result = "block scope"
}

final override Callable getScopeElement() { TCallableScope(result) = this }
}

/** A variable declared in a scope. */
class Variable extends TVariable {
/** Gets the name of this variable. */
string getName() { none() }
final string getName() { result = this.(VariableRange).getName() }

/** Gets a textual representation of this variable. */
final string toString() { result = this.getName() }

/** Gets the location of this variable. */
Location getLocation() { none() }
final Location getLocation() { result = this.(VariableRange).getLocation() }

/** Gets the scope this variable is declared in. */
VariableScope getDeclaringScope() { none() }
final VariableScope getDeclaringScope() { result = this.(VariableRange).getDeclaringScope() }

/** Gets an access to this variable. */
VariableAccess getAnAccess() { result.getVariable() = this }
Expand All @@ -93,12 +52,6 @@ class LocalVariable extends Variable {

LocalVariable() { this = TLocalVariable(scope, name, i) }

final override string getName() { result = name }

final override Location getLocation() { result = i.getLocation() }

final override VariableScope getDeclaringScope() { result = scope }

final override LocalVariableAccess getAnAccess() { result.getVariable() = this }
}

Expand All @@ -112,14 +65,12 @@ class VariableAccess extends AstNode, @token_identifier {
/** Gets the variable this identifier refers to. */
Variable getVariable() { result = variable }

override string toString() { result = variable.getName() }
final override string toString() { result = variable.getName() }
}

/** An access to a local variable. */
class LocalVariableAccess extends VariableAccess {
override LocalVariable variable;

override LocalVariable getVariable() { result = variable }

override string toString() { result = variable.getName() }
}
Loading

0 comments on commit 965b351

Please sign in to comment.