Merge pull request #7317 from hvitved/ruby/param-node-refactor

Ruby: Restructure `ParameterNode(Impl)`
This commit is contained in:
Tom Hvitved
2021-12-07 16:29:49 +01:00
committed by GitHub
2 changed files with 30 additions and 4 deletions

View File

@@ -320,7 +320,9 @@ class ReturningStatementNode extends NodeImpl, TReturningNode {
}
private module ParameterNodes {
abstract class ParameterNodeImpl extends ParameterNode, NodeImpl {
abstract class ParameterNodeImpl extends NodeImpl {
abstract Parameter getParameter();
abstract predicate isSourceParameterOf(Callable c, int i);
predicate isParameterOf(DataFlowCallable c, int i) {
@@ -341,6 +343,10 @@ private module ParameterNodes {
override predicate isSourceParameterOf(Callable c, int i) { c.getParameter(i) = parameter }
override predicate isParameterOf(DataFlowCallable c, int i) {
this.isSourceParameterOf(c.asCallable(), i)
}
override CfgScope getCfgScope() { result = parameter.getCallable() }
override Location getLocationImpl() { result = parameter.getLocation() }
@@ -359,8 +365,14 @@ private module ParameterNodes {
final MethodBase getMethod() { result = method }
override Parameter getParameter() { none() }
override predicate isSourceParameterOf(Callable c, int i) { method = c and i = -1 }
override predicate isParameterOf(DataFlowCallable c, int i) {
this.isSourceParameterOf(c.asCallable(), i)
}
override CfgScope getCfgScope() { result = method }
override Location getLocationImpl() { result = method.getLocation() }
@@ -385,6 +397,10 @@ private module ParameterNodes {
override predicate isSourceParameterOf(Callable c, int i) { c = method and i = -2 }
override predicate isParameterOf(DataFlowCallable c, int i) {
this.isSourceParameterOf(c.asCallable(), i)
}
override CfgScope getCfgScope() { result = method }
override Location getLocationImpl() {
@@ -407,6 +423,8 @@ private module ParameterNodes {
SummaryParameterNode() { this = TSummaryParameterNode(sc, pos) }
override Parameter getParameter() { none() }
override predicate isSourceParameterOf(Callable c, int i) { none() }
override predicate isParameterOf(DataFlowCallable c, int i) { sc = c and i = pos }
@@ -442,7 +460,7 @@ class SummaryNode extends NodeImpl, TSummaryNode {
/** A data-flow node that represents a call argument. */
abstract class ArgumentNode extends Node {
/** Holds if this argument occurs at the given position in the given call. */
predicate argumentOf(DataFlowCall call, int pos) { this.sourceArgumentOf(call.asCall(), pos) }
abstract predicate argumentOf(DataFlowCall call, int pos);
abstract predicate sourceArgumentOf(CfgNodes::ExprNodes::CallCfgNode call, int pos);
@@ -457,6 +475,10 @@ private module ArgumentNodes {
ExplicitArgumentNode() { this.asExpr() = arg }
override predicate argumentOf(DataFlowCall call, int pos) {
this.sourceArgumentOf(call.asCall(), pos)
}
override predicate sourceArgumentOf(CfgNodes::ExprNodes::CallCfgNode call, int pos) {
arg.isArgumentOf(call, pos)
}
@@ -474,6 +496,10 @@ private module ArgumentNodes {
exists(CfgNodes::ExprNodes::CallCfgNode c | c.getBlock() = this.asExpr())
}
override predicate argumentOf(DataFlowCall call, int pos) {
this.sourceArgumentOf(call.asCall(), pos)
}
override predicate sourceArgumentOf(CfgNodes::ExprNodes::CallCfgNode call, int pos) {
pos = -2 and
(

View File

@@ -83,9 +83,9 @@ class ExprNode extends Node, TExprNode {
* The value of a parameter at function entry, viewed as a node in a data
* flow graph.
*/
class ParameterNode extends Node, TParameterNode {
class ParameterNode extends Node, TParameterNode instanceof ParameterNodeImpl {
/** Gets the parameter corresponding to this node, if any. */
Parameter getParameter() { none() }
final Parameter getParameter() { result = super.getParameter() }
}
/**