Merge pull request #9137 from hmac/hmac/cfg-ql-class

Ruby: Add getAPrimaryQlClass to CfgNodes classes
This commit is contained in:
Harry Maclean
2022-05-23 15:37:51 +01:00
committed by GitHub
2 changed files with 98 additions and 0 deletions

View File

@@ -11,6 +11,8 @@ private import internal.Splitting
/** An entry node for a given scope. */
class EntryNode extends CfgNode, TEntryNode {
override string getAPrimaryQlClass() { result = "EntryNode" }
private CfgScope scope;
EntryNode() { this = TEntryNode(scope) }
@@ -24,6 +26,8 @@ class EntryNode extends CfgNode, TEntryNode {
/** An exit node for a given scope, annotated with the type of exit. */
class AnnotatedExitNode extends CfgNode, TAnnotatedExitNode {
override string getAPrimaryQlClass() { result = "AnnotatedExitNode" }
private CfgScope scope;
private boolean normal;
@@ -49,6 +53,8 @@ class AnnotatedExitNode extends CfgNode, TAnnotatedExitNode {
/** An exit node for a given scope. */
class ExitNode extends CfgNode, TExitNode {
override string getAPrimaryQlClass() { result = "ExitNode" }
private CfgScope scope;
ExitNode() { this = TExitNode(scope) }
@@ -66,6 +72,9 @@ class ExitNode extends CfgNode, TExitNode {
* splits for the AST node.
*/
class AstCfgNode extends CfgNode, TElementNode {
/** Gets the name of the primary QL class for this node. */
override string getAPrimaryQlClass() { result = "AstCfgNode" }
private Splits splits;
AstNode e;
@@ -95,6 +104,8 @@ class AstCfgNode extends CfgNode, TElementNode {
/** A control-flow node that wraps an AST expression. */
class ExprCfgNode extends AstCfgNode {
override string getAPrimaryQlClass() { result = "ExprCfgNode" }
override Expr e;
ExprCfgNode() { e = this.getNode() }
@@ -115,6 +126,8 @@ class ExprCfgNode extends AstCfgNode {
/** A control-flow node that wraps a return-like statement. */
class ReturningCfgNode extends AstCfgNode {
override string getAPrimaryQlClass() { result = "ReturningCfgNode" }
ReturningStmt s;
ReturningCfgNode() { s = this.getNode() }
@@ -128,6 +141,8 @@ class ReturningCfgNode extends AstCfgNode {
/** A control-flow node that wraps a `StringComponent` AST expression. */
class StringComponentCfgNode extends AstCfgNode {
override string getAPrimaryQlClass() { result = "StringComponentCfgNode" }
StringComponentCfgNode() { this.getNode() instanceof StringComponent }
/** Gets the constant value of this string component. */
@@ -136,6 +151,8 @@ class StringComponentCfgNode extends AstCfgNode {
/** A control-flow node that wraps a `RegExpComponent` AST expression. */
class RegExpComponentCfgNode extends StringComponentCfgNode {
override string getAPrimaryQlClass() { result = "RegExpComponentCfgNode" }
RegExpComponentCfgNode() { e instanceof RegExpComponent }
}
@@ -219,6 +236,8 @@ module ExprNodes {
/** A control-flow node that wraps an `ArrayLiteral` AST expression. */
class LiteralCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "LiteralCfgNode" }
override LiteralChildMapping e;
override Literal getExpr() { result = super.getExpr() }
@@ -230,6 +249,8 @@ module ExprNodes {
/** A control-flow node that wraps an `AssignExpr` AST expression. */
class AssignExprCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "AssignExprCfgNode" }
override AssignExprChildMapping e;
final override AssignExpr getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -247,6 +268,8 @@ module ExprNodes {
/** A control-flow node that wraps an `Operation` AST expression. */
class OperationCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "OperationCfgNode" }
override OperationExprChildMapping e;
override Operation getExpr() { result = super.getExpr() }
@@ -260,6 +283,8 @@ module ExprNodes {
/** A control-flow node that wraps a `UnaryOperation` AST expression. */
class UnaryOperationCfgNode extends OperationCfgNode {
override string getAPrimaryQlClass() { result = "UnaryOperationCfgNode" }
private UnaryOperation uo;
UnaryOperationCfgNode() { e = uo }
@@ -272,6 +297,8 @@ module ExprNodes {
/** A control-flow node that wraps a `BinaryOperation` AST expression. */
class BinaryOperationCfgNode extends OperationCfgNode {
override string getAPrimaryQlClass() { result = "BinaryOperationCfgNode" }
private BinaryOperation bo;
BinaryOperationCfgNode() { e = bo }
@@ -291,6 +318,8 @@ module ExprNodes {
/** A control-flow node that wraps a `BlockArgument` AST expression. */
class BlockArgumentCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "BlockArgumentCfgNode" }
override BlockArgumentChildMapping e;
final override BlockArgument getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -307,6 +336,8 @@ module ExprNodes {
/** A control-flow node that wraps a `Call` AST expression. */
class CallCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "CallCfgNode" }
override CallExprChildMapping e;
override Call getExpr() { result = super.getExpr() }
@@ -338,6 +369,8 @@ module ExprNodes {
/** A control-flow node that wraps a `MethodCall` AST expression. */
class MethodCallCfgNode extends CallCfgNode {
override string getAPrimaryQlClass() { result = "MethodCallCfgNode" }
MethodCallCfgNode() { super.getExpr() instanceof MethodCall }
override MethodCall getExpr() { result = super.getExpr() }
@@ -349,6 +382,8 @@ module ExprNodes {
/** A control-flow node that wraps a `CaseExpr` AST expression. */
class CaseExprCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "CaseExprCfgNode" }
override CaseExprChildMapping e;
final override CaseExpr getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -372,6 +407,8 @@ module ExprNodes {
/** A control-flow node that wraps an `InClause` AST expression. */
class InClauseCfgNode extends AstCfgNode {
override string getAPrimaryQlClass() { result = "InClauseCfgNode" }
override InClauseChildMapping e;
/** Gets the pattern in this `in`-clause. */
@@ -390,6 +427,8 @@ module ExprNodes {
/** A control-flow node that wraps a `WhenClause` AST expression. */
class WhenClauseCfgNode extends AstCfgNode {
override string getAPrimaryQlClass() { result = "WhenClauseCfgNode" }
override WhenClauseChildMapping e;
/** Gets the body of this `when`-clause. */
@@ -398,6 +437,8 @@ module ExprNodes {
/** A control-flow node that wraps a `CasePattern`. */
class CasePatternCfgNode extends AstCfgNode {
override string getAPrimaryQlClass() { result = "CasePatternCfgNode" }
override CasePattern e;
}
@@ -411,6 +452,8 @@ module ExprNodes {
/** A control-flow node that wraps an `ArrayPattern` node. */
class ArrayPatternCfgNode extends CasePatternCfgNode {
override string getAPrimaryQlClass() { result = "ArrayPatternCfgNode" }
override ArrayPatternChildMapping e;
/** Gets the `n`th element of this list pattern's prefix. */
@@ -439,6 +482,8 @@ module ExprNodes {
/** A control-flow node that wraps a `FindPattern` node. */
class FindPatternCfgNode extends CasePatternCfgNode {
override string getAPrimaryQlClass() { result = "FindPatternCfgNode" }
override FindPatternChildMapping e;
/** Gets the `n`th element of this find pattern. */
@@ -464,6 +509,8 @@ module ExprNodes {
/** A control-flow node that wraps a `HashPattern` node. */
class HashPatternCfgNode extends CasePatternCfgNode {
override string getAPrimaryQlClass() { result = "HashPatternCfgNode" }
override HashPatternChildMapping e;
/** Gets the value of the `n`th pair. */
@@ -481,6 +528,8 @@ module ExprNodes {
/** A control-flow node that wraps an `AlternativePattern` node. */
class AlternativePatternCfgNode extends CasePatternCfgNode {
override string getAPrimaryQlClass() { result = "AlternativePatternCfgNode" }
override AlternativePatternChildMapping e;
/** Gets the `n`th alternative. */
@@ -497,6 +546,8 @@ module ExprNodes {
/** A control-flow node that wraps an `AsPattern` node. */
class AsPatternCfgNode extends CasePatternCfgNode {
override string getAPrimaryQlClass() { result = "AsPatternCfgNode" }
override AsPatternChildMapping e;
/** Gets the underlying pattern. */
@@ -514,6 +565,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ParenthesizedPattern` node. */
class ParenthesizedPatternCfgNode extends CasePatternCfgNode {
override string getAPrimaryQlClass() { result = "ParenthesizedPatternCfgNode" }
override ParenthesizedPatternChildMapping e;
/** Gets the underlying pattern. */
@@ -526,6 +579,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ConditionalExpr` AST expression. */
class ConditionalExprCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "ConditionalExprCfgNode" }
override ConditionalExprChildMapping e;
final override ConditionalExpr getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -546,6 +601,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ConditionalExpr` AST expression. */
class ConstantAccessCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "ConstantAccessCfgNode" }
override ConstantAccessChildMapping e;
final override ConstantAccess getExpr() { result = super.getExpr() }
@@ -560,6 +617,8 @@ module ExprNodes {
/** A control-flow node that wraps a `StmtSequence` AST expression. */
class StmtSequenceCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "StmtSequenceCfgNode" }
override StmtSequenceChildMapping e;
final override StmtSequence getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -574,6 +633,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ForExpr` AST expression. */
class ForExprCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "ForExprCfgNode" }
override ForExprChildMapping e;
final override ForExpr getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -584,6 +645,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ParenthesizedExpr` AST expression. */
class ParenthesizedExprCfgNode extends StmtSequenceCfgNode {
override string getAPrimaryQlClass() { result = "ParenthesizedExprCfgNode" }
ParenthesizedExprCfgNode() { this.getExpr() instanceof ParenthesizedExpr }
}
@@ -593,6 +656,8 @@ module ExprNodes {
/** A control-flow node that wraps a `Pair` AST expression. */
class PairCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "PairCfgNode" }
override PairChildMapping e;
final override Pair getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -610,6 +675,8 @@ module ExprNodes {
/** A control-flow node that wraps a `VariableReadAccess` AST expression. */
class VariableReadAccessCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "VariableReadAccessCfgNode" }
override VariableReadAccess e;
final override VariableReadAccess getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -617,6 +684,8 @@ module ExprNodes {
/** A control-flow node that wraps a `VariableWriteAccess` AST expression. */
class VariableWriteAccessCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "VariableWriteAccessCfgNode" }
override VariableWriteAccess e;
final override VariableWriteAccess getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -624,6 +693,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ConstantReadAccess` AST expression. */
class ConstantReadAccessCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "ConstantReadAccessCfgNode" }
override ConstantReadAccess e;
final override ConstantReadAccess getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -631,6 +702,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ConstantWriteAccess` AST expression. */
class ConstantWriteAccessCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "ConstantWriteAccessCfgNode" }
override ConstantWriteAccess e;
final override ConstantWriteAccess getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -638,6 +711,8 @@ module ExprNodes {
/** A control-flow node that wraps a `InstanceVariableWriteAccess` AST expression. */
class InstanceVariableWriteAccessCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "InstanceVariableWriteAccessCfgNode" }
override InstanceVariableWriteAccess e;
final override InstanceVariableWriteAccess getExpr() { result = ExprCfgNode.super.getExpr() }
@@ -645,6 +720,8 @@ module ExprNodes {
/** A control-flow node that wraps a `StringInterpolationComponent` AST expression. */
class StringInterpolationComponentCfgNode extends StringComponentCfgNode, StmtSequenceCfgNode {
override string getAPrimaryQlClass() { result = "StringInterpolationComponentCfgNode" }
StringInterpolationComponentCfgNode() { this.getNode() instanceof StringInterpolationComponent }
final override ConstantValue getConstantValue() {
@@ -654,6 +731,8 @@ module ExprNodes {
/** A control-flow node that wraps a `RegExpInterpolationComponent` AST expression. */
class RegExpInterpolationComponentCfgNode extends RegExpComponentCfgNode, StmtSequenceCfgNode {
override string getAPrimaryQlClass() { result = "RegExpInterpolationComponentCfgNode" }
RegExpInterpolationComponentCfgNode() { this.getNode() instanceof RegExpInterpolationComponent }
final override ConstantValue getConstantValue() {
@@ -667,6 +746,8 @@ module ExprNodes {
/** A control-flow node that wraps a `StringlikeLiteral` AST expression. */
class StringlikeLiteralCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "StringlikeLiteralCfgNode" }
override StringlikeLiteralChildMapping e;
override StringlikeLiteral getExpr() { result = super.getExpr() }
@@ -680,6 +761,8 @@ module ExprNodes {
/** A control-flow node that wraps a `StringLiteral` AST expression. */
class StringLiteralCfgNode extends ExprCfgNode {
override string getAPrimaryQlClass() { result = "StringLiteralCfgNode" }
override StringLiteral e;
final override StringLiteral getExpr() { result = super.getExpr() }
@@ -687,6 +770,8 @@ module ExprNodes {
/** A control-flow node that wraps a `RegExpLiteral` AST expression. */
class RegExpLiteralCfgNode extends StringlikeLiteralCfgNode {
override string getAPrimaryQlClass() { result = "RegExpLiteralCfgNode" }
RegExpLiteralCfgNode() { e instanceof RegExpLiteral }
final override RegExpComponentCfgNode getComponent(int n) { result = super.getComponent(n) }
@@ -698,6 +783,8 @@ module ExprNodes {
/** A control-flow node that wraps a `ComparisonOperation` AST expression. */
class ComparisonOperationCfgNode extends BinaryOperationCfgNode {
override string getAPrimaryQlClass() { result = "ComparisonOperationCfgNode" }
ComparisonOperationCfgNode() { e instanceof ComparisonOperation }
override ComparisonOperation getExpr() { result = super.getExpr() }
@@ -705,6 +792,8 @@ module ExprNodes {
/** A control-flow node that wraps a `RelationalOperation` AST expression. */
class RelationalOperationCfgNode extends ComparisonOperationCfgNode {
override string getAPrimaryQlClass() { result = "RelationalOperationCfgNode" }
RelationalOperationCfgNode() { e instanceof RelationalOperation }
final override RelationalOperation getExpr() { result = super.getExpr() }
@@ -712,6 +801,8 @@ module ExprNodes {
/** A control-flow node that wraps an `ElementReference` AST expression. */
class ElementReferenceCfgNode extends MethodCallCfgNode {
override string getAPrimaryQlClass() { result = "ElementReferenceCfgNode" }
ElementReferenceCfgNode() { e instanceof ElementReference }
final override ElementReference getExpr() { result = super.getExpr() }
@@ -723,6 +814,8 @@ module ExprNodes {
* explicit calls.
*/
class ArrayLiteralCfgNode extends MethodCallCfgNode {
override string getAPrimaryQlClass() { result = "ArrayLiteralCfgNode" }
ArrayLiteralCfgNode() {
exists(ConstantReadAccess array |
array = this.getReceiver().getExpr() and
@@ -739,6 +832,8 @@ module ExprNodes {
* explicit calls.
*/
class HashLiteralCfgNode extends MethodCallCfgNode {
override string getAPrimaryQlClass() { result = "HashLiteralCfgNode" }
HashLiteralCfgNode() {
exists(ConstantReadAccess array |
array = this.getReceiver().getExpr() and

View File

@@ -28,6 +28,9 @@ class CfgScope extends Scope instanceof CfgScope::Range_ {
* Only nodes that can be reached from an entry point are included in the CFG.
*/
class CfgNode extends TCfgNode {
/** Gets the name of the primary QL class for this node. */
string getAPrimaryQlClass() { none() }
/** Gets a textual representation of this control flow node. */
string toString() { none() }