Merge pull request #15370 from hvitved/ruby/erb-flow

Ruby: Model flow through `ViewComponent` render methods
This commit is contained in:
Tom Hvitved
2024-01-31 13:24:10 +01:00
committed by GitHub
22 changed files with 728 additions and 302 deletions

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* Flow is now tracked through Rails `render` calls, when the argument is a `ViewComponent`. In this case, data flow is tracked into the accompanying `.html.erb` file.

View File

@@ -38,3 +38,4 @@ private import codeql.ruby.frameworks.Yaml
private import codeql.ruby.frameworks.Sequel
private import codeql.ruby.frameworks.Ldap
private import codeql.ruby.frameworks.Jwt
private import codeql.ruby.frameworks.ViewComponent

View File

@@ -2,7 +2,7 @@ private import codeql.ruby.AST
private import codeql.ruby.CFG
private import DataFlowPrivate
private import codeql.ruby.typetracking.internal.TypeTrackingImpl
private import codeql.ruby.ast.internal.Module
private import codeql.ruby.ast.internal.Module as Module
private import FlowSummaryImpl as FlowSummaryImpl
private import codeql.ruby.dataflow.FlowSummary
private import codeql.ruby.dataflow.SSA
@@ -82,6 +82,12 @@ abstract class LibraryCallable extends string {
Call getACallSimple() { none() }
}
/** A callable defined in library code, which should be taken into account in type tracking. */
abstract class LibraryCallableToIncludeInTypeTracking extends LibraryCallable {
bindingset[this]
LibraryCallableToIncludeInTypeTracking() { exists(this) }
}
/**
* A callable. This includes callables from source code, as well as callables
* defined in library code.
@@ -184,6 +190,91 @@ class NormalCall extends DataFlowCall, TNormalCall {
override Location getLocation() { result = c.getLocation() }
}
/**
* Provides modeling of flow through the `render` method of view components.
*
* ```rb
* # view.rb
* class View < ViewComponent::Base
* def initialize(x)
* @x = x
* end
*
* def foo
* sink(@x)
* end
* end
* ```
*
* ```erb
* # view.html.erb
* <%= foo() %> # 1
* ```
*
* ```rb
* # app.rb
* class App
* def run
* view = View.new(taint) # 2
* render(view) # 3
* end
* end
* ```
*
* The `render` call (3) is modeled using a flow summary. The summary specifies
* that the first argument (`view`) will have a special method invoked on it (we
* call the method `__invoke__toplevel__erb__`), which targets the top-level of the
* matching ERB file (`view.html.erb`). The `view` argument will flow into the receiver
* of the synthesized method call, from there into the implicit `self` parameter of
* the ERB file, and from there to the implicit `self` receiver of the call to `foo` (1).
*
* Since it is not actually possible to specify such flow summaries, we instead
* specify a call-back summary, and adjust the generated call to target the special
* `__invoke__toplevel__erb__` method.
*
* In order to resolve the target of the adjusted method call, we need to take
* the `render` summary into account when constructing the call graph. That is, we
* need to track the `View` instance (2) into the receiver of the adjusted method
* call, in order to figure out that the call target is in fact `view.html.erb`.
*/
private module ViewComponentRenderModeling {
private import codeql.ruby.frameworks.ViewComponent
private class RenderMethod extends SummarizedCallable, LibraryCallableToIncludeInTypeTracking {
RenderMethod() { this = "render view component" }
override MethodCall getACallSimple() { result.getMethodName() = "render" }
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
input = "Argument[0]" and
// use a call-back summary, and adjust it to a method call below
output = "Argument[0].Parameter[self]" and
preservesValue = true
}
}
private string invokeToplevelName() { result = "__invoke__toplevel__erb__" }
/** Holds if `call` should be adjusted to be a method call to `name` on `receiver`. */
predicate adjustedMethodCall(DataFlowCall call, FlowSummaryNode receiver, string name) {
exists(RenderMethod render |
call = TSummaryCall(render, receiver.getSummaryNode()) and
name = invokeToplevelName()
)
}
/** Holds if `self` belongs to the top-level of an ERB file with matching view class `view`. */
pragma[nomagic]
predicate selfInErbToplevel(SelfVariable self, ViewComponent::ComponentClass view) {
self.getDeclaringScope().(Toplevel).getFile() = view.getTemplate()
}
Toplevel lookupMethod(ViewComponent::ComponentClass m, string name) {
result.getFile() = m.getTemplate() and
name = invokeToplevelName()
}
}
/** A call for which we want to compute call targets. */
private class RelevantCall extends CfgNodes::ExprNodes::CallCfgNode {
pragma[nomagic]
@@ -200,6 +291,8 @@ private predicate methodCall(DataFlowCall call, DataFlow::Node receiver, string
method = rc.getExpr().(MethodCall).getMethodName() and
receiver.asExpr() = rc.getReceiver()
)
or
ViewComponentRenderModeling::adjustedMethodCall(call, receiver, method)
}
pragma[nomagic]
@@ -253,8 +346,11 @@ private predicate selfInMethod(SelfVariable self, MethodBase method, Module m) {
/** Holds if `self` belongs to the top-level. */
pragma[nomagic]
private predicate selfInToplevel(SelfVariable self, Module m) {
ViewComponentRenderModeling::selfInErbToplevel(self, m)
or
not ViewComponentRenderModeling::selfInErbToplevel(self, _) and
self.getDeclaringScope() instanceof Toplevel and
m = TResolved("Object")
m = Module::TResolved("Object")
}
/**
@@ -271,7 +367,7 @@ private predicate selfInToplevel(SelfVariable self, Module m) {
*/
private predicate asModulePattern(SsaDefinitionExtNode def, Module m) {
exists(AsPattern ap |
m = resolveConstantReadAccess(ap.getPattern()) and
m = Module::resolveConstantReadAccess(ap.getPattern()) and
def.getDefinitionExt().(Ssa::WriteDefinition).getWriteAccess().getAstNode() =
ap.getVariableAccess()
)
@@ -295,7 +391,7 @@ private predicate hasAdjacentTypeCheckedReads(
exists(
CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case
|
m = resolveConstantReadAccess(pattern.getExpr()) and
m = Module::resolveConstantReadAccess(pattern.getExpr()) and
cb.getLastNode() = pattern and
cb.controls(read2.getBasicBlock(),
any(SuccessorTypes::MatchingSuccessor match | match.getValue() = true)) and
@@ -313,7 +409,7 @@ predicate isUserDefinedNew(SingletonMethod new) {
exists(Expr object | singletonMethod(new, "new", object) |
selfInModule(object.(SelfVariableReadAccess).getVariable(), _)
or
exists(resolveConstantReadAccess(object))
exists(Module::resolveConstantReadAccess(object))
)
}
@@ -351,7 +447,7 @@ private predicate extendCall(DataFlow::ExprNode receiver, Module m) {
extendCall.getMethodName() = "extend" and
exists(DataFlow::LocalSourceNode sourceNode | sourceNode.flowsTo(extendCall.getArgument(_)) |
selfInModule(sourceNode.(SelfLocalSourceNode).getVariable(), m) or
m = resolveConstantReadAccess(sourceNode.asExpr().getExpr())
m = Module::resolveConstantReadAccess(sourceNode.asExpr().getExpr())
) and
receiver = extendCall.getReceiver()
)
@@ -364,10 +460,16 @@ private predicate extendCallModule(Module m, Module n) {
receiver.flowsTo(e) and extendCall(e, n)
|
selfInModule(receiver.(SelfLocalSourceNode).getVariable(), m) or
m = resolveConstantReadAccess(receiver.asExpr().getExpr())
m = Module::resolveConstantReadAccess(receiver.asExpr().getExpr())
)
}
private CfgScope lookupMethod(Module m, string name) {
result = Module::lookupMethod(m, name)
or
result = ViewComponentRenderModeling::lookupMethod(m, name)
}
/**
* Gets a method available in module `m`, or in one of `m`'s transitive
* sub classes when `exact = false`.
@@ -377,7 +479,7 @@ private CfgScope lookupMethod(Module m, string name, boolean exact) {
result = lookupMethod(m, name) and
exact in [false, true]
or
result = lookupMethodInSubClasses(m, name) and
result = Module::lookupMethodInSubClasses(m, name) and
exact = false
}
@@ -490,7 +592,7 @@ private module TrackModuleInput implements CallGraphConstruction::Simple::InputS
class State = Module;
predicate start(DataFlow::Node start, Module m) {
m = resolveConstantReadAccess(start.asExpr().getExpr())
m = Module::resolveConstantReadAccess(start.asExpr().getExpr())
}
// We exclude steps into `self` parameters, and instead rely on the type of the
@@ -547,55 +649,55 @@ private module TrackInstanceInput implements CallGraphConstruction::InputSig {
pragma[nomagic]
private predicate isInstanceNoCall(DataFlow::Node n, Module tp, boolean exact) {
n.asExpr().getExpr() instanceof NilLiteral and
tp = TResolved("NilClass") and
tp = Module::TResolved("NilClass") and
exact = true
or
n.asExpr().getExpr().(BooleanLiteral).isFalse() and
tp = TResolved("FalseClass") and
tp = Module::TResolved("FalseClass") and
exact = true
or
n.asExpr().getExpr().(BooleanLiteral).isTrue() and
tp = TResolved("TrueClass") and
tp = Module::TResolved("TrueClass") and
exact = true
or
n.asExpr().getExpr() instanceof IntegerLiteral and
tp = TResolved("Integer") and
tp = Module::TResolved("Integer") and
exact = true
or
n.asExpr().getExpr() instanceof FloatLiteral and
tp = TResolved("Float") and
tp = Module::TResolved("Float") and
exact = true
or
n.asExpr().getExpr() instanceof RationalLiteral and
tp = TResolved("Rational") and
tp = Module::TResolved("Rational") and
exact = true
or
n.asExpr().getExpr() instanceof ComplexLiteral and
tp = TResolved("Complex") and
tp = Module::TResolved("Complex") and
exact = true
or
n.asExpr().getExpr() instanceof StringlikeLiteral and
tp = TResolved("String") and
tp = Module::TResolved("String") and
exact = true
or
n.asExpr() instanceof CfgNodes::ExprNodes::ArrayLiteralCfgNode and
tp = TResolved("Array") and
tp = Module::TResolved("Array") and
exact = true
or
n.asExpr() instanceof CfgNodes::ExprNodes::HashLiteralCfgNode and
tp = TResolved("Hash") and
tp = Module::TResolved("Hash") and
exact = true
or
n.asExpr().getExpr() instanceof MethodBase and
tp = TResolved("Symbol") and
tp = Module::TResolved("Symbol") and
exact = true
or
n.asParameter() instanceof BlockParameter and
tp = TResolved("Proc") and
tp = Module::TResolved("Proc") and
exact = true
or
n.asExpr().getExpr() instanceof Lambda and
tp = TResolved("Proc") and
tp = Module::TResolved("Proc") and
exact = true
or
// `self` reference in method or top-level (but not in module or singleton method,
@@ -646,11 +748,11 @@ private module TrackInstanceInput implements CallGraphConstruction::InputSig {
isInstance(start, tp, exact)
or
exists(Module m |
(if m.isClass() then tp = TResolved("Class") else tp = TResolved("Module")) and
(if m.isClass() then tp = Module::TResolved("Class") else tp = Module::TResolved("Module")) and
exact = true
|
// needed for e.g. `C.new`
m = resolveConstantReadAccess(start.asExpr().getExpr())
m = Module::resolveConstantReadAccess(start.asExpr().getExpr())
or
// needed for e.g. `self.include`
selfInModule(start.(SelfLocalSourceNode).getVariable(), m)
@@ -805,7 +907,7 @@ private predicate singletonMethodOnModule(MethodBase method, string name, Module
)
or
exists(DataFlow::LocalSourceNode sourceNode |
m = resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
m = Module::resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
flowsToSingletonMethodObject(sourceNode, method, name)
)
or
@@ -821,7 +923,7 @@ private MethodBase lookupSingletonMethodDirect(Module m, string name) {
or
exists(DataFlow::LocalSourceNode sourceNode |
sourceNode = trackModuleAccess(m) and
not m = resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
not m = Module::resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
flowsToSingletonMethodObject(sourceNode, result, name)
)
}
@@ -847,7 +949,7 @@ private MethodBase lookupSingletonMethodInSubClasses(Module m, string name) {
// The 'self' inside such a singleton method could then be any class, leading to self-calls
// being resolved to arbitrary singleton methods.
// To remedy this, we do not allow following super-classes all the way to Object.
not m = TResolved("Object") and
not m = Module::TResolved("Object") and
exists(Module sub |
sub.getSuperClass() = m // not `getAnImmediateAncestor` because singleton methods cannot be included
|
@@ -901,7 +1003,7 @@ predicate singletonMethodOnInstance(MethodBase method, string name, Expr object)
singletonMethod(method, name, object) and
not selfInModule(object.(SelfVariableReadAccess).getVariable(), _) and
// cannot use `trackModuleAccess` because of negative recursion
not exists(resolveConstantReadAccess(object))
not exists(Module::resolveConstantReadAccess(object))
or
exists(DataFlow::ExprNode receiver, Module other |
extendCall(receiver, other) and
@@ -948,7 +1050,7 @@ private module TrackSingletonMethodOnInstanceInput implements CallGraphConstruct
RelevantCall call, DataFlow::Node arg, DataFlow::ParameterNode p,
CfgNodes::ExprCfgNode nodeFromPreExpr
|
callStep(call, arg, p) and
sourceCallStep(call, arg, p) and
nodeTo.getPreUpdateNode() = arg and
summary.toString() = "return" and
(

View File

@@ -236,6 +236,14 @@ module LocalFlow {
nodeTo.(BlockArgumentNode).getParameterNode(true) = nodeFrom
}
predicate flowSummaryLocalStep(
FlowSummaryNode nodeFrom, FlowSummaryNode nodeTo, FlowSummaryImpl::Public::SummarizedCallable c
) {
FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom.getSummaryNode(),
nodeTo.getSummaryNode(), true) and
c = nodeFrom.getSummarizedCallable()
}
predicate localMustFlowStep(Node node1, Node node2) {
LocalFlow::localFlowSsaParamInput(node1, node2)
or
@@ -522,7 +530,8 @@ private module Cached {
p instanceof HashSplatParameter or
p instanceof SplatParameter
} or
TSelfParameterNode(MethodBase m) or
TSelfMethodParameterNode(MethodBase m) or
TSelfToplevelParameterNode(Toplevel t) or
TLambdaSelfReferenceNode(Callable c) { lambdaCreationExpr(_, _, c) } or
TBlockParameterNode(MethodBase m) or
TBlockArgumentNode(CfgNodes::ExprNodes::CallCfgNode yield) {
@@ -562,6 +571,8 @@ private module Cached {
} or
TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn)
class TSelfParameterNode = TSelfMethodParameterNode or TSelfToplevelParameterNode;
class TSourceParameterNode =
TNormalParameterNode or TBlockParameterNode or TSelfParameterNode or
TSynthHashSplatParameterNode or TSynthSplatParameterNode;
@@ -593,8 +604,7 @@ private module Cached {
not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _)
)
or
FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom.(FlowSummaryNode).getSummaryNode(),
nodeTo.(FlowSummaryNode).getSummaryNode(), true)
LocalFlow::flowSummaryLocalStep(nodeFrom, nodeTo, _)
or
VariableCapture::valueStep(nodeFrom, nodeTo)
}
@@ -627,6 +637,8 @@ private module Cached {
LocalFlow::localFlowSsaInputFromRead(_, nodeFrom, nodeTo)
or
VariableCapture::flowInsensitiveStep(nodeFrom, nodeTo)
or
LocalFlow::flowSummaryLocalStep(nodeFrom, nodeTo, any(LibraryCallableToIncludeInTypeTracking c))
}
/** Holds if `n` wraps an SSA definition without ingoing flow. */
@@ -961,32 +973,64 @@ private module ParameterNodes {
* The value of the `self` parameter at function entry, viewed as a node in a data
* flow graph.
*/
class SelfParameterNodeImpl extends ParameterNodeImpl, TSelfParameterNode {
abstract class SelfParameterNodeImpl extends ParameterNodeImpl, TSelfParameterNode {
/** Gets the corresponding SSA `self` definition, if any. */
abstract Ssa::SelfDefinition getSelfDefinition();
/** Gets the underlying `self` variable. */
abstract SelfVariable getSelfVariable();
final override Parameter getParameter() { none() }
final override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) {
c = TCfgScope(this.getCfgScope()) and pos.isSelf()
}
final override string toStringImpl() { result = "self in " + this.getCfgScope() }
}
/**
* The value of the `self` parameter at method entry, viewed as a node in a data
* flow graph.
*/
class SelfMethodParameterNodeImpl extends SelfParameterNodeImpl, TSelfMethodParameterNode {
private MethodBase method;
SelfParameterNodeImpl() { this = TSelfParameterNode(method) }
SelfMethodParameterNodeImpl() { this = TSelfMethodParameterNode(method) }
final MethodBase getMethod() { result = method }
/** Gets the corresponding SSA `self` definition, if any. */
Ssa::SelfDefinition getSelfDefinition() {
override Ssa::SelfDefinition getSelfDefinition() {
result.getSourceVariable().getDeclaringScope() = method
}
/** Gets the underlying `self` variable. */
final SelfVariable getSelfVariable() { result.getDeclaringScope() = method }
override Parameter getParameter() { none() }
override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) {
method = c.asCfgScope() and pos.isSelf()
}
final override SelfVariable getSelfVariable() { result.getDeclaringScope() = method }
override CfgScope getCfgScope() { result = method }
override Location getLocationImpl() { result = method.getLocation() }
}
override string toStringImpl() { result = "self in " + method }
/**
* The value of the `self` parameter at top-level entry, viewed as a node in a data
* flow graph.
*/
class SelfToplevelParameterNodeImpl extends SelfParameterNodeImpl, TSelfToplevelParameterNode {
private Toplevel t;
SelfToplevelParameterNodeImpl() { this = TSelfToplevelParameterNode(t) }
final Toplevel getToplevel() { result = t }
override Ssa::SelfDefinition getSelfDefinition() {
result.getSourceVariable().getDeclaringScope() = t
}
final override SelfVariable getSelfVariable() { result.getDeclaringScope() = t }
override CfgScope getCfgScope() { result = t }
override Location getLocationImpl() { result = t.getLocation() }
}
/**

View File

@@ -1067,7 +1067,7 @@ class ModuleNode instanceof Module {
* Does not take inheritance into account.
*/
ParameterNode getAnOwnInstanceSelf() {
result = TSelfParameterNode(this.getAnOwnInstanceMethod().asCallableAstNode())
result = TSelfMethodParameterNode(this.getAnOwnInstanceMethod().asCallableAstNode())
}
/**

View File

@@ -0,0 +1,29 @@
/**
* Provides modeling for the `view_component` gem.
*/
private import codeql.ruby.AST
/**
* Provides modeling for the `view_component` gem.
*/
module ViewComponent {
/**
* A subclass of `ViewComponent::Base`.
*/
class ComponentClass extends Module {
ComponentClass() { this.getAnAncestor().getQualifiedName() = "ViewComponent::Base" }
/**
* Returns the template file for this component.
*/
ErbFile getTemplate() {
result.getAbsolutePath() =
this.getADeclaration()
.getLocation()
.getFile()
.getAbsolutePath()
.replaceAll(".rb", ".html.erb")
}
}
}

View File

@@ -55,6 +55,10 @@ private module Config implements DataFlow::StateConfigSig {
}
predicate isBarrier(DataFlow::Node node, FlowState state) { node.(Sanitizer).getAState() = state }
predicate isBarrierIn(DataFlow::Node node) { node instanceof Source }
int fieldFlowBranchLimit() { result = 10 }
}
/**

View File

@@ -28,11 +28,11 @@ private predicate flowThrough(DataFlowPublic::ParameterNode param) {
/** Holds if there is flow from `arg` to `p` via the call `call`, not counting `new -> initialize` call steps. */
pragma[nomagic]
private predicate callStepNoInitialize(
ExprNodes::CallCfgNode call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
DataFlowDispatch::DataFlowCall call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
) {
exists(DataFlowDispatch::ParameterPosition pos |
argumentPositionMatch(call, arg, pos) and
p.isSourceParameterOf(DataFlowDispatch::getTarget(DataFlowDispatch::TNormalCall(call)), pos)
p.isSourceParameterOf(DataFlowDispatch::getTarget(call), pos)
)
}
@@ -93,7 +93,7 @@ private predicate localFieldStep(DataFlow::Node pred, DataFlow::Node succ) {
}
pragma[noinline]
private predicate argumentPositionMatch(
private predicate sourceArgumentPositionMatch(
ExprNodes::CallCfgNode call, DataFlowPrivate::ArgumentNode arg,
DataFlowDispatch::ParameterPosition ppos
) {
@@ -105,22 +105,53 @@ private predicate argumentPositionMatch(
}
pragma[noinline]
private predicate viableParam(
ExprNodes::CallCfgNode call, DataFlowPrivate::ParameterNodeImpl p,
private predicate argumentPositionMatch(
DataFlowDispatch::DataFlowCall call, DataFlowPrivate::ArgumentNode arg,
DataFlowDispatch::ParameterPosition ppos
) {
exists(Cfg::CfgScope callable |
DataFlowDispatch::getTarget(DataFlowDispatch::TNormalCall(call)) = callable or
DataFlowDispatch::getInitializeTarget(call) = callable
sourceArgumentPositionMatch(call.asCall(), arg, ppos)
or
exists(DataFlowDispatch::ArgumentPosition apos |
DataFlowDispatch::parameterMatch(ppos, apos) and
arg.argumentOf(call, apos) and
call.getEnclosingCallable().asLibraryCallable() instanceof
DataFlowDispatch::LibraryCallableToIncludeInTypeTracking
)
}
pragma[noinline]
private predicate viableParam(
DataFlowDispatch::DataFlowCall call, DataFlowPrivate::ParameterNodeImpl p,
DataFlowDispatch::ParameterPosition ppos
) {
exists(DataFlowDispatch::DataFlowCallable callable |
DataFlowDispatch::getTarget(call) = callable.asCfgScope() or
DataFlowDispatch::getInitializeTarget(call.asCall()) = callable.asCfgScope() or
call.asCall().getAstNode() =
callable
.asLibraryCallable()
.(DataFlowDispatch::LibraryCallableToIncludeInTypeTracking)
.getACallSimple()
|
p.isSourceParameterOf(callable, ppos)
p.isParameterOf(callable, ppos)
)
}
/** Holds if there is flow from `arg` to `p` via the source-code call `call`. */
pragma[nomagic]
predicate sourceCallStep(
ExprNodes::CallCfgNode call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
) {
exists(DataFlowDispatch::ParameterPosition pos |
sourceArgumentPositionMatch(call, arg, pos) and
viableParam(DataFlowDispatch::TNormalCall(call), p, pos)
)
}
/** Holds if there is flow from `arg` to `p` via the call `call`. */
pragma[nomagic]
predicate callStep(
ExprNodes::CallCfgNode call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
DataFlowDispatch::DataFlowCall call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
) {
exists(DataFlowDispatch::ParameterPosition pos |
argumentPositionMatch(call, arg, pos) and
@@ -192,7 +223,7 @@ private module SummaryTypeTrackerInput implements SummaryTypeTracker::Input {
Node argumentOf(Node call, SummaryComponent arg, boolean isPostUpdate) {
exists(DataFlowDispatch::ParameterPosition pos, DataFlowPrivate::ArgumentNode n |
arg = FlowSummaryImpl::Private::SummaryComponent::argument(pos) and
argumentPositionMatch(call.asExpr(), n, pos)
sourceArgumentPositionMatch(call.asExpr(), n, pos)
|
isPostUpdate = false and result = n
or
@@ -272,7 +303,7 @@ module TypeTrackingInput implements Shared::TypeTrackingInput {
predicate levelStepCall(Node nodeFrom, LocalSourceNode nodeTo) {
exists(DataFlowPublic::ParameterNode param |
flowThrough(param) and
callStepNoInitialize(nodeTo.asExpr(), nodeFrom, param)
callStepNoInitialize(DataFlowDispatch::TNormalCall(nodeTo.asExpr()), nodeFrom, param)
)
}

View File

@@ -0,0 +1,104 @@
testFailures
edges
| main.rb:3:9:3:9 | x | main.rb:4:26:4:26 | x |
| main.rb:3:13:3:21 | call to source | main.rb:3:9:3:9 | x |
| main.rb:4:9:4:12 | view [@x] | main.rb:5:16:5:19 | view [@x] |
| main.rb:4:16:4:27 | call to new [@x] | main.rb:4:9:4:12 | view [@x] |
| main.rb:4:26:4:26 | x | main.rb:4:16:4:27 | call to new [@x] |
| main.rb:4:26:4:26 | x | view1.rb:5:20:5:20 | x |
| main.rb:5:16:5:19 | view [@x] | view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] |
| main.rb:10:16:10:19 | [post] view [@x] | main.rb:11:9:11:12 | view [@x] |
| main.rb:11:9:11:12 | view [@x] | view2.rb:2:5:4:7 | self in foo [@x] |
| main.rb:15:9:15:9 | x | main.rb:16:26:16:26 | x |
| main.rb:15:13:15:21 | call to source | main.rb:15:9:15:9 | x |
| main.rb:16:9:16:12 | view [@x] | main.rb:17:16:17:19 | view [@x] |
| main.rb:16:16:16:27 | call to new [@x] | main.rb:16:9:16:12 | view [@x] |
| main.rb:16:26:16:26 | x | main.rb:16:16:16:27 | call to new [@x] |
| main.rb:16:26:16:26 | x | view3.rb:2:20:2:20 | x |
| main.rb:17:16:17:19 | view [@x] | view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] |
| view1.html.erb:2:5:2:9 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] |
| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | view1.html.erb:2:5:2:9 | self [@x] |
| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | view1.html.erb:7:1:7:5 | self [@x] |
| view1.html.erb:6:1:6:14 | [post] self [@x] | view1.html.erb:7:1:7:5 | self [@x] |
| view1.html.erb:6:5:6:13 | call to source | view1.html.erb:6:1:6:14 | [post] self [@x] |
| view1.html.erb:6:5:6:13 | call to source | view1.rb:13:13:13:13 | x |
| view1.html.erb:7:1:7:5 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] |
| view1.html.erb:7:1:7:5 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] |
| view1.rb:5:20:5:20 | x | view1.rb:6:14:6:14 | x |
| view1.rb:6:14:6:14 | x | view1.rb:6:9:6:10 | [post] self [@x] |
| view1.rb:9:5:11:7 | self in foo [@x] | view1.rb:10:14:10:15 | self [@x] |
| view1.rb:10:14:10:15 | self [@x] | view1.rb:10:14:10:15 | @x |
| view1.rb:13:13:13:13 | x | view1.rb:14:14:14:14 | x |
| view1.rb:14:14:14:14 | x | view1.rb:14:9:14:10 | [post] self [@x] |
| view2.html.erb:3:1:3:14 | [post] self [@x] | main.rb:10:16:10:19 | [post] view [@x] |
| view2.html.erb:3:5:3:13 | call to source | view2.html.erb:3:1:3:14 | [post] self [@x] |
| view2.html.erb:3:5:3:13 | call to source | view2.rb:6:13:6:13 | x |
| view2.rb:2:5:4:7 | self in foo [@x] | view2.rb:3:14:3:15 | self [@x] |
| view2.rb:3:14:3:15 | self [@x] | view2.rb:3:14:3:15 | @x |
| view2.rb:6:13:6:13 | x | view2.rb:7:14:7:14 | x |
| view2.rb:7:14:7:14 | x | view2.rb:7:9:7:10 | [post] self [@x] |
| view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] | view3.html.erb:3:6:3:8 | self [@x] |
| view3.html.erb:3:6:3:8 | self [@x] | view3.html.erb:3:6:3:8 | call to get |
| view3.html.erb:3:6:3:8 | self [@x] | view3.rb:6:5:8:7 | self in get [@x] |
| view3.rb:2:20:2:20 | x | view3.rb:3:14:3:14 | x |
| view3.rb:3:14:3:14 | x | view3.rb:3:9:3:10 | [post] self [@x] |
| view3.rb:6:5:8:7 | self in get [@x] | view3.rb:7:9:7:10 | self [@x] |
| view3.rb:7:9:7:10 | self [@x] | view3.rb:7:9:7:10 | @x |
nodes
| main.rb:3:9:3:9 | x | semmle.label | x |
| main.rb:3:13:3:21 | call to source | semmle.label | call to source |
| main.rb:4:9:4:12 | view [@x] | semmle.label | view [@x] |
| main.rb:4:16:4:27 | call to new [@x] | semmle.label | call to new [@x] |
| main.rb:4:26:4:26 | x | semmle.label | x |
| main.rb:5:16:5:19 | view [@x] | semmle.label | view [@x] |
| main.rb:10:16:10:19 | [post] view [@x] | semmle.label | [post] view [@x] |
| main.rb:11:9:11:12 | view [@x] | semmle.label | view [@x] |
| main.rb:15:9:15:9 | x | semmle.label | x |
| main.rb:15:13:15:21 | call to source | semmle.label | call to source |
| main.rb:16:9:16:12 | view [@x] | semmle.label | view [@x] |
| main.rb:16:16:16:27 | call to new [@x] | semmle.label | call to new [@x] |
| main.rb:16:26:16:26 | x | semmle.label | x |
| main.rb:17:16:17:19 | view [@x] | semmle.label | view [@x] |
| view1.html.erb:2:5:2:9 | self [@x] | semmle.label | self [@x] |
| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | semmle.label | self in view1.html.erb [@x] |
| view1.html.erb:6:1:6:14 | [post] self [@x] | semmle.label | [post] self [@x] |
| view1.html.erb:6:5:6:13 | call to source | semmle.label | call to source |
| view1.html.erb:7:1:7:5 | self [@x] | semmle.label | self [@x] |
| view1.html.erb:7:1:7:5 | self [@x] | semmle.label | self [@x] |
| view1.rb:5:20:5:20 | x | semmle.label | x |
| view1.rb:6:9:6:10 | [post] self [@x] | semmle.label | [post] self [@x] |
| view1.rb:6:14:6:14 | x | semmle.label | x |
| view1.rb:9:5:11:7 | self in foo [@x] | semmle.label | self in foo [@x] |
| view1.rb:10:14:10:15 | @x | semmle.label | @x |
| view1.rb:10:14:10:15 | self [@x] | semmle.label | self [@x] |
| view1.rb:13:13:13:13 | x | semmle.label | x |
| view1.rb:14:9:14:10 | [post] self [@x] | semmle.label | [post] self [@x] |
| view1.rb:14:14:14:14 | x | semmle.label | x |
| view2.html.erb:3:1:3:14 | [post] self [@x] | semmle.label | [post] self [@x] |
| view2.html.erb:3:5:3:13 | call to source | semmle.label | call to source |
| view2.rb:2:5:4:7 | self in foo [@x] | semmle.label | self in foo [@x] |
| view2.rb:3:14:3:15 | @x | semmle.label | @x |
| view2.rb:3:14:3:15 | self [@x] | semmle.label | self [@x] |
| view2.rb:6:13:6:13 | x | semmle.label | x |
| view2.rb:7:9:7:10 | [post] self [@x] | semmle.label | [post] self [@x] |
| view2.rb:7:14:7:14 | x | semmle.label | x |
| view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] | semmle.label | self in view3.html.erb [@x] |
| view3.html.erb:3:6:3:8 | call to get | semmle.label | call to get |
| view3.html.erb:3:6:3:8 | self [@x] | semmle.label | self [@x] |
| view3.rb:2:20:2:20 | x | semmle.label | x |
| view3.rb:3:9:3:10 | [post] self [@x] | semmle.label | [post] self [@x] |
| view3.rb:3:14:3:14 | x | semmle.label | x |
| view3.rb:6:5:8:7 | self in get [@x] | semmle.label | self in get [@x] |
| view3.rb:7:9:7:10 | @x | semmle.label | @x |
| view3.rb:7:9:7:10 | self [@x] | semmle.label | self [@x] |
subpaths
| main.rb:4:26:4:26 | x | view1.rb:5:20:5:20 | x | view1.rb:6:9:6:10 | [post] self [@x] | main.rb:4:16:4:27 | call to new [@x] |
| main.rb:16:26:16:26 | x | view3.rb:2:20:2:20 | x | view3.rb:3:9:3:10 | [post] self [@x] | main.rb:16:16:16:27 | call to new [@x] |
| view1.html.erb:6:5:6:13 | call to source | view1.rb:13:13:13:13 | x | view1.rb:14:9:14:10 | [post] self [@x] | view1.html.erb:6:1:6:14 | [post] self [@x] |
| view2.html.erb:3:5:3:13 | call to source | view2.rb:6:13:6:13 | x | view2.rb:7:9:7:10 | [post] self [@x] | view2.html.erb:3:1:3:14 | [post] self [@x] |
| view3.html.erb:3:6:3:8 | self [@x] | view3.rb:6:5:8:7 | self in get [@x] | view3.rb:7:9:7:10 | @x | view3.html.erb:3:6:3:8 | call to get |
#select
| view1.rb:10:14:10:15 | @x | main.rb:3:13:3:21 | call to source | view1.rb:10:14:10:15 | @x | $@ | main.rb:3:13:3:21 | call to source | call to source |
| view1.rb:10:14:10:15 | @x | view1.html.erb:6:5:6:13 | call to source | view1.rb:10:14:10:15 | @x | $@ | view1.html.erb:6:5:6:13 | call to source | call to source |
| view2.rb:3:14:3:15 | @x | view2.html.erb:3:5:3:13 | call to source | view2.rb:3:14:3:15 | @x | $@ | view2.html.erb:3:5:3:13 | call to source | call to source |
| view3.html.erb:3:6:3:8 | call to get | main.rb:15:13:15:21 | call to source | view3.html.erb:3:6:3:8 | call to get | $@ | main.rb:15:13:15:21 | call to source | call to source |

View File

@@ -0,0 +1,13 @@
/**
* @kind path-problem
*/
import codeql.ruby.AST
import codeql.ruby.CFG
import TestUtilities.InlineFlowTest
import ValueFlowTest<DefaultFlowConfig>
import ValueFlow::PathGraph
from ValueFlow::PathNode source, ValueFlow::PathNode sink
where ValueFlow::flowPath(source, sink)
select sink, source, sink, "$@", source, source.toString()

View File

@@ -0,0 +1,25 @@
class App
def run1
x = source(1)
view = View1.new(x)
render(view)
end
def run2
view = View2.new
render(view)
view.foo
end
def run3
x = source(4)
view = View3.new(x)
render(view)
end
def run4
x = source(5)
view = View4.new(x)
render(view)
end
end

View File

@@ -0,0 +1,8 @@
<%# Flow through an ERB template %>
<%= foo() %>
<%# Flow out of an ERB template %>
<%
set(source(2))
foo()
%>

View File

@@ -0,0 +1,16 @@
class ViewComponent::Base
end
class View1 < ViewComponent::Base
def initialize(x)
@x = x
end
def foo
sink(@x) # $ hasValueFlow=1 $ hasValueFlow=2
end
def set(x)
@x = x
end
end

View File

@@ -0,0 +1,4 @@
<%# Flow out of an ERB template (side-effect) %>
<%
set(source(3))
%>

View File

@@ -0,0 +1,9 @@
class View2 < ViewComponent::Base
def foo
sink(@x) # $ hasValueFlow=3
end
def set(x)
@x = x
end
end

View File

@@ -0,0 +1,4 @@
<%# Flow into an ERB template %>
<%
sink(get) # $ hasValueFlow=4
%>

View File

@@ -0,0 +1,9 @@
class View3 < ViewComponent::Base
def initialize(x)
@x = x
end
def get
@x
end
end

View File

@@ -0,0 +1,15 @@
# This component has no corresponding template file, because it defines a `call` method instead.
class View4 < ViewComponent::Base
def initialize(x)
@x = x
end
def get
@x
end
def call
"hi"
end
end

View File

@@ -2401,6 +2401,7 @@
| local_dataflow.rb:1:1:7:3 | self in foo | local_dataflow.rb:1:1:7:3 | self (foo) |
| local_dataflow.rb:1:1:150:3 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) |
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a |
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a |
| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b |

View File

@@ -2844,6 +2844,7 @@
| local_dataflow.rb:1:1:7:3 | synthetic splat parameter | local_dataflow.rb:1:9:1:9 | a |
| local_dataflow.rb:1:1:150:3 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) |
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a |
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a |
| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b |

View File

@@ -3,25 +3,25 @@ track
| params_flow.rb:1:1:3:3 | self in taint | type tracker without call steps | params_flow.rb:1:1:3:3 | self in taint |
| params_flow.rb:1:1:3:3 | synthetic splat parameter | type tracker without call steps | params_flow.rb:1:1:3:3 | synthetic splat parameter |
| params_flow.rb:1:1:3:3 | taint | type tracker without call steps | params_flow.rb:1:1:3:3 | taint |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:1:1:3:3 | self in taint |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:5:1:7:3 | self in sink |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:9:1:12:3 | self in positional |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:16:1:19:3 | self in keyword |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:25:1:31:3 | self in kwargs |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:49:1:53:3 | self in posargs |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:64:1:66:3 | self in splatstuff |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:69:1:76:3 | self in splatmid |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:83:1:91:3 | self in pos_many |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:98:1:103:3 | self in splatmidsmall |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:120:1:126:3 | self in destruct |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:133:1:135:3 | self in splatall |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:167:1:169:3 | self in splatSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:181:1:183:3 | self in positionSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:200:1:205:3 | self in foo |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker without call steps | params_flow.rb:1:1:207:15 | self (params_flow.rb) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:1:1:3:3 | self in taint |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:5:1:7:3 | self in sink |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:9:1:12:3 | self in positional |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:16:1:19:3 | self in keyword |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:25:1:31:3 | self in kwargs |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:49:1:53:3 | self in posargs |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:64:1:66:3 | self in splatstuff |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:69:1:76:3 | self in splatmid |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:83:1:91:3 | self in pos_many |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:98:1:103:3 | self in splatmidsmall |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:120:1:126:3 | self in destruct |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:133:1:135:3 | self in splatall |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:167:1:169:3 | self in splatSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:181:1:183:3 | self in positionSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:200:1:205:3 | self in foo |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker without call steps | params_flow.rb:1:1:207:15 | self in params_flow.rb |
| params_flow.rb:1:11:1:11 | x | type tracker with call steps | params_flow.rb:5:10:5:10 | x |
| params_flow.rb:1:11:1:11 | x | type tracker with call steps | params_flow.rb:9:16:9:17 | p1 |
| params_flow.rb:1:11:1:11 | x | type tracker with call steps | params_flow.rb:9:20:9:21 | p2 |
@@ -3692,215 +3692,216 @@ trackEnd
| params_flow.rb:1:1:3:3 | self in taint | params_flow.rb:1:1:3:3 | self in taint |
| params_flow.rb:1:1:3:3 | synthetic splat parameter | params_flow.rb:1:1:3:3 | synthetic splat parameter |
| params_flow.rb:1:1:3:3 | taint | params_flow.rb:1:1:3:3 | taint |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:1:1:3:3 | self in taint |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:1:1:207:15 | self (params_flow.rb) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:5:1:7:3 | self (sink) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:5:1:7:3 | self in sink |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:6:5:6:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:9:1:12:3 | self (positional) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:9:1:12:3 | self in positional |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:10:5:10:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:11:5:11:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:14:1:14:30 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:14:12:14:19 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:14:22:14:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:16:1:19:3 | self (keyword) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:16:1:19:3 | self in keyword |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:17:5:17:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:18:5:18:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:21:1:21:35 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:21:13:21:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:21:27:21:34 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:22:1:22:35 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:22:13:22:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:22:27:22:34 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:23:1:23:41 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:23:16:23:23 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:23:33:23:40 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:25:1:31:3 | self (kwargs) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:25:1:31:3 | self in kwargs |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:26:5:26:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:27:5:27:22 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:28:5:28:22 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:29:5:29:22 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:30:5:30:22 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:1:33:58 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:12:33:19 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:26:33:34 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:41:33:49 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:34:14:34:22 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:35:1:35:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:35:12:35:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:37:16:37:24 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:37:34:37:42 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:38:1:38:14 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:40:16:40:24 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:41:1:41:30 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:41:13:41:21 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:43:9:43:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:44:1:44:28 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:44:12:44:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:46:9:46:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:46:20:46:28 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:47:1:47:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:49:1:53:3 | self (posargs) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:49:1:53:3 | self in posargs |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:50:5:50:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:51:5:51:21 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:52:5:52:21 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:55:1:55:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:55:9:55:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:55:20:55:28 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:57:9:57:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:58:1:58:25 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:58:9:58:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:60:9:60:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:60:20:60:28 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:61:1:61:14 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:63:8:63:16 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:64:1:66:3 | self (splatstuff) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:64:1:66:3 | self in splatstuff |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:65:5:65:13 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:67:1:67:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:69:1:76:3 | self (splatmid) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:69:1:76:3 | self in splatmid |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:70:5:70:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:71:5:71:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:72:5:72:13 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:73:5:73:13 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:74:5:74:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:75:5:75:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:1:78:63 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:10:78:18 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:21:78:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:32:78:40 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:43:78:51 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:54:78:62 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:9:80:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:20:80:28 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:31:80:39 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:42:80:50 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:81:1:81:37 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:81:10:81:18 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:81:28:81:36 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:83:1:91:3 | self (pos_many) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:83:1:91:3 | self in pos_many |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:84:5:84:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:85:5:85:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:86:5:86:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:87:5:87:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:88:5:88:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:89:5:89:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:90:5:90:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:9:93:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:20:93:28 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:31:93:39 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:42:93:50 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:1:94:48 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:10:94:18 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:21:94:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:39:94:47 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:1:96:88 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:10:96:18 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:21:96:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:34:96:42 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:45:96:53 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:56:96:64 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:68:96:76 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:79:96:87 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:98:1:103:3 | self (splatmidsmall) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:98:1:103:3 | self in splatmidsmall |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:99:5:99:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:100:5:100:18 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:101:5:101:18 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:102:5:102:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:1:105:49 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:15:105:23 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:28:105:36 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:39:105:47 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:1:106:46 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:15:106:23 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:26:106:34 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:37:106:45 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:108:1:112:3 | self (splat_followed_by_keyword_param) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:109:5:109:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:110:5:110:13 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:111:5:111:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:1:114:67 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:33:114:41 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:44:114:52 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:58:114:66 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:117:3:117:14 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:117:19:117:27 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:118:1:118:14 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:120:1:126:3 | self (destruct) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:120:1:126:3 | self in destruct |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:121:5:121:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:122:5:122:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:123:5:123:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:124:5:124:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:125:5:125:10 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:1:128:61 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:11:128:19 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:22:128:30 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:35:128:43 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:50:128:58 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:130:9:130:17 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:130:20:130:28 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:131:1:131:46 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:131:17:131:25 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:133:1:135:3 | self (splatall) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:133:1:135:3 | self in splatall |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:134:5:134:16 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:1:137:44 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:12:137:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:23:137:31 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:34:137:42 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:143:24:143:32 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:144:1:144:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:145:1:145:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:146:1:146:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:149:1:149:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:150:1:150:42 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:150:33:150:41 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:151:1:151:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:157:24:157:32 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:158:1:158:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:159:1:159:27 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:160:1:160:20 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:163:1:163:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:164:1:164:40 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:164:31:164:39 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:165:1:165:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:167:1:169:3 | self in splatSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:171:17:171:25 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:172:1:172:19 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:173:1:173:25 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:174:1:174:19 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:177:1:177:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:178:1:178:30 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:178:21:178:29 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:179:1:179:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:181:1:183:3 | self in positionSideEffect |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:185:14:185:22 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:186:1:186:16 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:187:1:187:25 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:188:1:188:16 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:191:1:191:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:192:1:192:33 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:192:24:192:32 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:193:1:193:11 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:196:10:196:18 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:200:1:205:3 | self (foo) |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:200:1:205:3 | self in foo |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:201:5:201:15 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:202:5:202:15 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:203:5:203:15 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:204:5:204:15 | self |
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:207:1:207:14 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:1:1:3:3 | self in taint |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:1:1:207:15 | self (params_flow.rb) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:1:1:207:15 | self in params_flow.rb |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:5:1:7:3 | self (sink) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:5:1:7:3 | self in sink |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:6:5:6:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:9:1:12:3 | self (positional) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:9:1:12:3 | self in positional |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:10:5:10:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:11:5:11:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:14:1:14:30 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:14:12:14:19 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:14:22:14:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:16:1:19:3 | self (keyword) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:16:1:19:3 | self in keyword |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:17:5:17:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:18:5:18:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:21:1:21:35 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:21:13:21:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:21:27:21:34 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:22:1:22:35 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:22:13:22:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:22:27:22:34 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:23:1:23:41 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:23:16:23:23 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:23:33:23:40 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:25:1:31:3 | self (kwargs) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:25:1:31:3 | self in kwargs |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:26:5:26:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:27:5:27:22 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:28:5:28:22 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:29:5:29:22 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:30:5:30:22 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:1:33:58 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:12:33:19 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:26:33:34 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:41:33:49 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:34:14:34:22 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:35:1:35:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:35:12:35:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:37:16:37:24 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:37:34:37:42 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:38:1:38:14 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:40:16:40:24 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:41:1:41:30 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:41:13:41:21 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:43:9:43:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:44:1:44:28 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:44:12:44:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:46:9:46:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:46:20:46:28 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:47:1:47:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:49:1:53:3 | self (posargs) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:49:1:53:3 | self in posargs |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:50:5:50:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:51:5:51:21 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:52:5:52:21 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:55:1:55:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:55:9:55:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:55:20:55:28 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:57:9:57:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:58:1:58:25 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:58:9:58:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:60:9:60:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:60:20:60:28 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:61:1:61:14 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:63:8:63:16 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:64:1:66:3 | self (splatstuff) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:64:1:66:3 | self in splatstuff |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:65:5:65:13 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:67:1:67:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:69:1:76:3 | self (splatmid) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:69:1:76:3 | self in splatmid |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:70:5:70:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:71:5:71:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:72:5:72:13 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:73:5:73:13 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:74:5:74:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:75:5:75:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:1:78:63 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:10:78:18 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:21:78:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:32:78:40 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:43:78:51 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:54:78:62 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:9:80:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:20:80:28 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:31:80:39 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:42:80:50 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:81:1:81:37 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:81:10:81:18 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:81:28:81:36 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:83:1:91:3 | self (pos_many) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:83:1:91:3 | self in pos_many |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:84:5:84:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:85:5:85:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:86:5:86:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:87:5:87:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:88:5:88:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:89:5:89:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:90:5:90:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:9:93:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:20:93:28 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:31:93:39 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:42:93:50 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:1:94:48 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:10:94:18 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:21:94:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:39:94:47 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:1:96:88 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:10:96:18 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:21:96:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:34:96:42 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:45:96:53 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:56:96:64 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:68:96:76 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:79:96:87 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:98:1:103:3 | self (splatmidsmall) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:98:1:103:3 | self in splatmidsmall |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:99:5:99:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:100:5:100:18 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:101:5:101:18 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:102:5:102:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:1:105:49 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:15:105:23 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:28:105:36 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:39:105:47 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:1:106:46 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:15:106:23 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:26:106:34 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:37:106:45 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:108:1:112:3 | self (splat_followed_by_keyword_param) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:109:5:109:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:110:5:110:13 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:111:5:111:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:1:114:67 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:33:114:41 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:44:114:52 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:58:114:66 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:117:3:117:14 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:117:19:117:27 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:118:1:118:14 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:120:1:126:3 | self (destruct) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:120:1:126:3 | self in destruct |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:121:5:121:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:122:5:122:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:123:5:123:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:124:5:124:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:125:5:125:10 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:1:128:61 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:11:128:19 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:22:128:30 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:35:128:43 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:50:128:58 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:130:9:130:17 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:130:20:130:28 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:131:1:131:46 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:131:17:131:25 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:133:1:135:3 | self (splatall) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:133:1:135:3 | self in splatall |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:134:5:134:16 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:1:137:44 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:12:137:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:23:137:31 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:34:137:42 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:143:24:143:32 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:144:1:144:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:145:1:145:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:146:1:146:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:149:1:149:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:150:1:150:42 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:150:33:150:41 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:151:1:151:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:157:24:157:32 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:158:1:158:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:159:1:159:27 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:160:1:160:20 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:163:1:163:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:164:1:164:40 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:164:31:164:39 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:165:1:165:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:167:1:169:3 | self in splatSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:171:17:171:25 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:172:1:172:19 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:173:1:173:25 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:174:1:174:19 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:177:1:177:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:178:1:178:30 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:178:21:178:29 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:179:1:179:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:181:1:183:3 | self in positionSideEffect |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:185:14:185:22 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:186:1:186:16 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:187:1:187:25 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:188:1:188:16 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:191:1:191:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:192:1:192:33 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:192:24:192:32 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:193:1:193:11 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:196:10:196:18 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:200:1:205:3 | self (foo) |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:200:1:205:3 | self in foo |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:201:5:201:15 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:202:5:202:15 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:203:5:203:15 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:204:5:204:15 | self |
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:207:1:207:14 | self |
| params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x |
| params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x |
| params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x |

View File

@@ -1,8 +1,8 @@
track
| type_tracker.rb:1:1:10:3 | self (Container) | type tracker without call steps | type_tracker.rb:1:1:10:3 | self (Container) |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type tracker with call steps | type_tracker.rb:18:1:21:3 | self in positional |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type tracker with call steps | type_tracker.rb:25:1:28:3 | self in keyword |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type tracker without call steps | type_tracker.rb:1:1:53:4 | self (type_tracker.rb) |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type tracker with call steps | type_tracker.rb:18:1:21:3 | self in positional |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type tracker with call steps | type_tracker.rb:25:1:28:3 | self in keyword |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type tracker without call steps | type_tracker.rb:1:1:53:4 | self in type_tracker.rb |
| type_tracker.rb:2:5:5:7 | &block | type tracker without call steps | type_tracker.rb:2:5:5:7 | &block |
| type_tracker.rb:2:5:5:7 | field= | type tracker without call steps | type_tracker.rb:2:5:5:7 | field= |
| type_tracker.rb:2:5:5:7 | self in field= | type tracker with call steps | type_tracker.rb:7:5:9:7 | self in field |
@@ -346,19 +346,20 @@ track
| type_tracker.rb:52:5:52:13 | synthetic splat argument | type tracker without call steps | type_tracker.rb:52:5:52:13 | synthetic splat argument |
trackEnd
| type_tracker.rb:1:1:10:3 | self (Container) | type_tracker.rb:1:1:10:3 | self (Container) |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:1:1:53:4 | self (type_tracker.rb) |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:18:1:21:3 | self (positional) |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:18:1:21:3 | self in positional |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:19:5:19:11 | self |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:20:5:20:11 | self |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:23:1:23:16 | self |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:25:1:28:3 | self (keyword) |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:25:1:28:3 | self in keyword |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:26:5:26:11 | self |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:27:5:27:11 | self |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:30:1:30:21 | self |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:31:1:31:21 | self |
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:32:1:32:27 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:1:1:53:4 | self (type_tracker.rb) |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:1:1:53:4 | self in type_tracker.rb |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:18:1:21:3 | self (positional) |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:18:1:21:3 | self in positional |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:19:5:19:11 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:20:5:20:11 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:23:1:23:16 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:25:1:28:3 | self (keyword) |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:25:1:28:3 | self in keyword |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:26:5:26:11 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:27:5:27:11 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:30:1:30:21 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:31:1:31:21 | self |
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:32:1:32:27 | self |
| type_tracker.rb:2:5:5:7 | &block | type_tracker.rb:2:5:5:7 | &block |
| type_tracker.rb:2:5:5:7 | field= | type_tracker.rb:2:5:5:7 | field= |
| type_tracker.rb:2:5:5:7 | self in field= | type_tracker.rb:2:5:5:7 | self (field=) |