From 52529d590b5bba1d3bb60cc7f5ea7e9bd1d91be7 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 1 Jul 2021 10:48:35 +0200 Subject: [PATCH] Model private methods and "main objects" --- ql/src/codeql_ruby/AST.qll | 3 + ql/src/codeql_ruby/ast/Method.qll | 53 ++++ ql/src/codeql_ruby/ast/Module.qll | 12 +- ql/src/codeql_ruby/ast/internal/Module.qll | 10 +- .../controlflow/ControlFlowGraph.qll | 3 + .../dataflow/internal/DataFlowDispatch.qll | 12 +- .../library-tests/modules/ancestors.expected | 35 ++- .../library-tests/modules/callgraph.expected | 21 +- ql/test/library-tests/modules/callgraph.ql | 2 + .../library-tests/modules/methods.expected | 240 ++---------------- .../library-tests/modules/modules.expected | 35 +-- .../modules/superclasses.expected | 35 ++- 12 files changed, 194 insertions(+), 267 deletions(-) diff --git a/ql/src/codeql_ruby/AST.qll b/ql/src/codeql_ruby/AST.qll index 31573b523db..2afd80a0a71 100644 --- a/ql/src/codeql_ruby/AST.qll +++ b/ql/src/codeql_ruby/AST.qll @@ -53,6 +53,9 @@ class AstNode extends TAstNode { /** Gets the location of this node. */ Location getLocation() { result = getLocation(this) } + /** Gets the file of this node. */ + final File getFile() { result = this.getLocation().getFile() } + /** Gets a child node of this `AstNode`. */ final AstNode getAChild() { result = this.getAChild(_) } diff --git a/ql/src/codeql_ruby/ast/Method.qll b/ql/src/codeql_ruby/ast/Method.qll index a059d9bc1f9..de91b4fcf45 100644 --- a/ql/src/codeql_ruby/ast/Method.qll +++ b/ql/src/codeql_ruby/ast/Method.qll @@ -33,6 +33,11 @@ class MethodBase extends Callable, BodyStmt, Scope, TMethodBase { } } +/** A call to `private`. */ +private class Private extends MethodCall { + Private() { this.getMethodName() = "private" } +} + /** A normal method. */ class Method extends MethodBase, TMethod { private Generated::Method g; @@ -58,6 +63,54 @@ class Method extends MethodBase, TMethod { */ final predicate isSetter() { g.getName() instanceof Generated::Setter } + /** + * Holds if this method is private. All methods with the name prefix + * `private` are private below: + * + * ```rb + * class C + * private def private1 + * end + * + * def public + * end + * + * def private2 + * end + * private :private2 + * + * private + * + * def private3 + * end + * + * def private4 + * end + * end + * ``` + */ + predicate isPrivate() { + this = any(Private p).getArgument(0) + or + exists(ClassDeclaration c, Private p, SymbolLiteral s | + p.getArgument(0) = s and + p = c.getAStmt() and + this.getName() = s.getValueText() and + this = c.getAStmt() + ) + or + exists(ClassDeclaration c, int i, int j | + c.getStmt(i).(Private).getNumberOfArguments() = 0 and + this = c.getStmt(j) and + j > i + ) + or + // Top-level methods are private members of the special "main object" (except + // when run through `irb`), see e.g. + // https://codequizzes.wordpress.com/2014/04/23/rubys-main-object-top-level-context/ + this.getEnclosingModule() instanceof Toplevel + } + final override Parameter getParameter(int n) { toGenerated(result) = g.getParameters().getChild(n) } diff --git a/ql/src/codeql_ruby/ast/Module.qll b/ql/src/codeql_ruby/ast/Module.qll index c3f11063ab6..e3629c5fa6f 100644 --- a/ql/src/codeql_ruby/ast/Module.qll +++ b/ql/src/codeql_ruby/ast/Module.qll @@ -29,6 +29,11 @@ class Module extends TModule { this = TResolved(result) or exists(Namespace n | this = TUnresolved(n) and result = "...::" + n.toString()) + or + exists(Toplevel t | + this = TMain(t) and + result = "Main(" + t.toString() + ")" + ) } /** Gets the location of this module. */ @@ -47,6 +52,11 @@ class Module extends TModule { weight, count(n.getAStmt()) desc, loc.getFile().getAbsolutePath(), loc.getStartLine(), loc.getStartColumn() ) + or + exists(Toplevel t | + this = TMain(t) and + result = t.getLocation() + ) } } @@ -114,7 +124,7 @@ class Toplevel extends ModuleBase, TToplevel { pred = "getBeginBlock" and result = this.getBeginBlock(_) } - final override Module getModule() { result = TResolved("Object") } + final override Module getModule() { result = TMain(this) } final override string toString() { result = g.getLocation().getFile().getBaseName() } } diff --git a/ql/src/codeql_ruby/ast/internal/Module.qll b/ql/src/codeql_ruby/ast/internal/Module.qll index 2f632993a70..c5b9e56f252 100644 --- a/ql/src/codeql_ruby/ast/internal/Module.qll +++ b/ql/src/codeql_ruby/ast/internal/Module.qll @@ -25,7 +25,8 @@ private module Cached { or qName = namespaceDeclaration(_) } or - TUnresolved(Namespace n) { not exists(namespaceDeclaration(n)) } + TUnresolved(Namespace n) { not exists(namespaceDeclaration(n)) } or + TMain(Toplevel t) cached string namespaceDeclaration(Namespace n) { @@ -61,11 +62,14 @@ private module Cached { result = resolveScopeExpr(d.getSuperclassExpr()) ) or - result = TResolved("Object") and forex(ClassDeclaration d | d = cls.getADeclaration() | not exists(resolveScopeExpr(d.getSuperclassExpr())) - ) + ) and + result = TMain(cls.getADeclaration().getEnclosingModule()) ) + or + cls = TMain(_) and + result = TResolved("Object") } cached diff --git a/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll b/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll index 519d2b30dad..e5775f4a893 100644 --- a/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll +++ b/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll @@ -39,6 +39,9 @@ class CfgNode extends TCfgNode { /** Gets the location of this control flow node. */ Location getLocation() { none() } + /** Gets the file of this control flow node. */ + final File getFile() { result = this.getLocation().getFile() } + /** Holds if this control flow node has conditional successors. */ final predicate isCondition() { exists(this.getASuccessor(any(BooleanSuccessor bs))) } diff --git a/ql/src/codeql_ruby/dataflow/internal/DataFlowDispatch.qll b/ql/src/codeql_ruby/dataflow/internal/DataFlowDispatch.qll index 1b717cc2d02..7cf94752f2d 100644 --- a/ql/src/codeql_ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ql/src/codeql_ruby/dataflow/internal/DataFlowDispatch.qll @@ -84,7 +84,15 @@ class DataFlowCall extends CfgNodes::ExprNodes::CallCfgNode { exists(string method | exists(Module tp | this.instanceMethodCall(tp, method) and - result = lookupMethod(tp, method) + result = lookupMethod(tp, method) and + if result.(Method).isPrivate() + then + exists(Self self | + self = this.getReceiver().getExpr() and + pragma[only_bind_out](self.getEnclosingModule().getModule().getSuperClass*()) = + pragma[only_bind_out](result.getEnclosingModule().getModule()) + ) + else any() ) or exists(DataFlow::LocalSourceNode sourceNode | @@ -158,7 +166,7 @@ private DataFlow::LocalSourceNode trackInstance(Module tp, TypeTracker t) { exists(Self self, Toplevel enclosing | self = result.asExpr().getExpr() and enclosing = self.getEnclosingModule() and - tp = TResolved("Object") and + tp = TMain(enclosing) and not self.getEnclosingMethod().getEnclosingModule() = enclosing ) or diff --git a/ql/test/library-tests/modules/ancestors.expected b/ql/test/library-tests/modules/ancestors.expected index a9c235619fd..46ef47f475d 100644 --- a/ql/test/library-tests/modules/ancestors.expected +++ b/ql/test/library-tests/modules/ancestors.expected @@ -1,3 +1,19 @@ +calls.rb: +# 1| Main(calls.rb) +#-----| super -> Object + +hello.rb: +# 1| Main(hello.rb) +#-----| super -> Object + +modules.rb: +# 1| Main(modules.rb) +#-----| super -> Object + +private.rb: +# 1| Main(private.rb) +#-----| super -> Object + calls.rb: # 102| Hash #-----| super -> Object @@ -51,7 +67,8 @@ calls.rb: private.rb: # 1| C -#-----| super -> Object +#-----| super -> Main(calls.rb) +#-----| super -> Main(private.rb) #-----| include -> M calls.rb: @@ -59,10 +76,10 @@ calls.rb: #-----| super -> C # 82| String -#-----| super -> Object +#-----| super -> Main(calls.rb) # 144| S -#-----| super -> Object +#-----| super -> Main(calls.rb) # 150| A #-----| super -> S @@ -74,7 +91,7 @@ hello.rb: # 1| EnglishWords # 11| Greeting -#-----| super -> Object +#-----| super -> Main(hello.rb) #-----| include -> EnglishWords # 18| HelloWorld @@ -86,7 +103,7 @@ modules.rb: # 4| Foo # 37| Bar -#-----| super -> Object +#-----| super -> Main(modules.rb) # 60| MyModuleInGlobalScope @@ -106,17 +123,15 @@ modules.rb: # 107| MM # 112| YY -#-----| super -> Object +#-----| super -> Main(modules.rb) # 115| XX # 5| Foo::Bar # 19| Foo::ClassInFoo -#-----| super -> Object # 30| Foo::ClassInAnotherDefinitionOfFoo -#-----| super -> Object # 116| XX::YY #-----| super -> YY @@ -130,17 +145,14 @@ modules.rb: # 84| Other::Foo1 # 6| Foo::Bar::ClassInFooBar -#-----| super -> Object # 71| Test::Foo2::Foo2 # 108| MM::MM # 49| Foo::Bar::ClassInAnotherDefinitionOfFooBar -#-----| super -> Object # 66| Test::Foo1::Bar -#-----| super -> Object # 91| Test::Foo1::Y @@ -149,6 +161,5 @@ modules.rb: # 103| Test::Foo2::Y # 72| Test::Foo2::Foo2::Bar -#-----| super -> Object # 120| Test::Foo1::Bar::Baz diff --git a/ql/test/library-tests/modules/callgraph.expected b/ql/test/library-tests/modules/callgraph.expected index 577d7a09b32..651cd679093 100644 --- a/ql/test/library-tests/modules/callgraph.expected +++ b/ql/test/library-tests/modules/callgraph.expected @@ -61,7 +61,6 @@ getTarget | calls.rb:162:1:162:5 | call to new | calls.rb:99:5:99:16 | new | | calls.rb:162:1:162:14 | call to s_method | calls.rb:145:5:147:7 | s_method | | calls.rb:167:1:167:15 | call to private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:167:1:167:15 | call to private_on_main | private.rb:21:1:22:3 | private_on_main | | hello.rb:12:5:12:24 | call to include | calls.rb:92:5:92:20 | include | | hello.rb:14:16:14:20 | call to hello | hello.rb:2:5:4:7 | hello | | hello.rb:20:16:20:20 | call to super | hello.rb:13:5:15:7 | message | @@ -81,14 +80,10 @@ getTarget | private.rb:12:3:12:9 | call to private | calls.rb:94:5:94:20 | private | | private.rb:24:1:24:5 | call to new | calls.rb:99:5:99:16 | new | | private.rb:25:1:25:5 | call to new | calls.rb:99:5:99:16 | new | -| private.rb:25:1:25:14 | call to private2 | private.rb:8:3:9:5 | private2 | | private.rb:26:1:26:5 | call to new | calls.rb:99:5:99:16 | new | -| private.rb:26:1:26:14 | call to private3 | private.rb:14:3:15:5 | private3 | | private.rb:27:1:27:5 | call to new | calls.rb:99:5:99:16 | new | -| private.rb:27:1:27:14 | call to private4 | private.rb:17:3:18:5 | private4 | | private.rb:28:1:28:5 | call to new | calls.rb:99:5:99:16 | new | | private.rb:28:1:28:12 | call to public | private.rb:5:3:6:5 | public | -| private.rb:30:1:30:15 | call to private_on_main | calls.rb:164:1:165:3 | private_on_main | | private.rb:30:1:30:15 | call to private_on_main | private.rb:21:1:22:3 | private_on_main | unresolvedCall | calls.rb:19:5:19:14 | call to instance_m | @@ -106,3 +101,19 @@ unresolvedCall | calls.rb:133:28:133:39 | call to capitalize | | calls.rb:135:32:135:36 | call to abs | | private.rb:24:1:24:14 | call to private1 | +| private.rb:25:1:25:14 | call to private2 | +| private.rb:26:1:26:14 | call to private3 | +| private.rb:27:1:27:14 | call to private4 | +privateMethod +| calls.rb:1:1:3:3 | foo | +| calls.rb:62:1:65:3 | optional_arg | +| calls.rb:67:1:69:3 | call_block | +| calls.rb:71:1:75:3 | foo | +| calls.rb:119:1:121:3 | funny | +| calls.rb:137:1:139:3 | indirect | +| calls.rb:164:1:165:3 | private_on_main | +| private.rb:2:11:3:5 | private1 | +| private.rb:8:3:9:5 | private2 | +| private.rb:14:3:15:5 | private3 | +| private.rb:17:3:18:5 | private4 | +| private.rb:21:1:22:3 | private_on_main | diff --git a/ql/test/library-tests/modules/callgraph.ql b/ql/test/library-tests/modules/callgraph.ql index 5710b9a3324..bc8a9d6f9f9 100644 --- a/ql/test/library-tests/modules/callgraph.ql +++ b/ql/test/library-tests/modules/callgraph.ql @@ -3,3 +3,5 @@ import ruby query Callable getTarget(Call call) { result = call.getATarget() } query predicate unresolvedCall(Call call) { not exists(call.getATarget()) } + +query predicate privateMethod(Method m) { m.isPrivate() } diff --git a/ql/test/library-tests/modules/methods.expected b/ql/test/library-tests/modules/methods.expected index 4e229abf912..09fda0b3ec4 100644 --- a/ql/test/library-tests/modules/methods.expected +++ b/ql/test/library-tests/modules/methods.expected @@ -1,4 +1,11 @@ getMethod +| calls.rb:1:1:167:16 | Main(calls.rb) | call_block | calls.rb:67:1:69:3 | call_block | +| calls.rb:1:1:167:16 | Main(calls.rb) | foo | calls.rb:1:1:3:3 | foo | +| calls.rb:1:1:167:16 | Main(calls.rb) | foo | calls.rb:71:1:75:3 | foo | +| calls.rb:1:1:167:16 | Main(calls.rb) | funny | calls.rb:119:1:121:3 | funny | +| calls.rb:1:1:167:16 | Main(calls.rb) | indirect | calls.rb:137:1:139:3 | indirect | +| calls.rb:1:1:167:16 | Main(calls.rb) | optional_arg | calls.rb:62:1:65:3 | optional_arg | +| calls.rb:1:1:167:16 | Main(calls.rb) | private_on_main | calls.rb:164:1:165:3 | private_on_main | | calls.rb:15:1:24:3 | M | instance_m | calls.rb:16:5:16:23 | instance_m | | calls.rb:51:1:55:3 | D | baz | calls.rb:52:5:54:7 | baz | | calls.rb:77:1:80:3 | Integer | abs | calls.rb:79:5:79:16 | abs | @@ -9,15 +16,7 @@ getMethod | calls.rb:90:1:95:3 | Module | module_eval | calls.rb:91:5:91:24 | module_eval | | calls.rb:90:1:95:3 | Module | prepend | calls.rb:93:5:93:20 | prepend | | calls.rb:90:1:95:3 | Module | private | calls.rb:94:5:94:20 | private | -| calls.rb:97:1:100:3 | Object | call_block | calls.rb:67:1:69:3 | call_block | -| calls.rb:97:1:100:3 | Object | foo | calls.rb:1:1:3:3 | foo | -| calls.rb:97:1:100:3 | Object | foo | calls.rb:71:1:75:3 | foo | -| calls.rb:97:1:100:3 | Object | funny | calls.rb:119:1:121:3 | funny | -| calls.rb:97:1:100:3 | Object | indirect | calls.rb:137:1:139:3 | indirect | | calls.rb:97:1:100:3 | Object | new | calls.rb:99:5:99:16 | new | -| calls.rb:97:1:100:3 | Object | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| calls.rb:97:1:100:3 | Object | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:97:1:100:3 | Object | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:102:1:104:3 | Hash | [] | calls.rb:103:5:103:15 | [] | | calls.rb:106:1:117:3 | Array | [] | calls.rb:107:3:107:13 | [] | | calls.rb:106:1:117:3 | Array | foreach | calls.rb:110:3:116:5 | foreach | @@ -40,7 +39,17 @@ getMethod | private.rb:1:1:19:3 | C | private3 | private.rb:14:3:15:5 | private3 | | private.rb:1:1:19:3 | C | private4 | private.rb:17:3:18:5 | private4 | | private.rb:1:1:19:3 | C | public | private.rb:5:3:6:5 | public | +| private.rb:1:1:30:15 | Main(private.rb) | private_on_main | private.rb:21:1:22:3 | private_on_main | lookupMethod +| calls.rb:1:1:167:16 | Main(calls.rb) | call_block | calls.rb:67:1:69:3 | call_block | +| calls.rb:1:1:167:16 | Main(calls.rb) | foo | calls.rb:1:1:3:3 | foo | +| calls.rb:1:1:167:16 | Main(calls.rb) | foo | calls.rb:71:1:75:3 | foo | +| calls.rb:1:1:167:16 | Main(calls.rb) | funny | calls.rb:119:1:121:3 | funny | +| calls.rb:1:1:167:16 | Main(calls.rb) | indirect | calls.rb:137:1:139:3 | indirect | +| calls.rb:1:1:167:16 | Main(calls.rb) | new | calls.rb:99:5:99:16 | new | +| calls.rb:1:1:167:16 | Main(calls.rb) | optional_arg | calls.rb:62:1:65:3 | optional_arg | +| calls.rb:1:1:167:16 | Main(calls.rb) | private_on_main | calls.rb:164:1:165:3 | private_on_main | +| calls.rb:1:1:167:16 | Main(calls.rb) | puts | calls.rb:87:5:87:17 | puts | | calls.rb:15:1:24:3 | M | instance_m | calls.rb:16:5:16:23 | instance_m | | calls.rb:51:1:55:3 | D | baz | calls.rb:52:5:54:7 | baz | | calls.rb:51:1:55:3 | D | call_block | calls.rb:67:1:69:3 | call_block | @@ -60,15 +69,7 @@ lookupMethod | calls.rb:51:1:55:3 | D | puts | calls.rb:87:5:87:17 | puts | | calls.rb:77:1:80:3 | Integer | abs | calls.rb:79:5:79:16 | abs | | calls.rb:77:1:80:3 | Integer | bit_length | calls.rb:78:5:78:23 | bit_length | -| calls.rb:77:1:80:3 | Integer | call_block | calls.rb:67:1:69:3 | call_block | -| calls.rb:77:1:80:3 | Integer | foo | calls.rb:1:1:3:3 | foo | -| calls.rb:77:1:80:3 | Integer | foo | calls.rb:71:1:75:3 | foo | -| calls.rb:77:1:80:3 | Integer | funny | calls.rb:119:1:121:3 | funny | -| calls.rb:77:1:80:3 | Integer | indirect | calls.rb:137:1:139:3 | indirect | | calls.rb:77:1:80:3 | Integer | new | calls.rb:99:5:99:16 | new | -| calls.rb:77:1:80:3 | Integer | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| calls.rb:77:1:80:3 | Integer | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:77:1:80:3 | Integer | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:77:1:80:3 | Integer | puts | calls.rb:87:5:87:17 | puts | | calls.rb:82:1:84:3 | String | call_block | calls.rb:67:1:69:3 | call_block | | calls.rb:82:1:84:3 | String | capitalize | calls.rb:83:5:83:23 | capitalize | @@ -79,56 +80,23 @@ lookupMethod | calls.rb:82:1:84:3 | String | new | calls.rb:99:5:99:16 | new | | calls.rb:82:1:84:3 | String | optional_arg | calls.rb:62:1:65:3 | optional_arg | | calls.rb:82:1:84:3 | String | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:82:1:84:3 | String | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:82:1:84:3 | String | puts | calls.rb:87:5:87:17 | puts | | calls.rb:86:1:88:3 | Kernel | puts | calls.rb:87:5:87:17 | puts | -| calls.rb:90:1:95:3 | Module | call_block | calls.rb:67:1:69:3 | call_block | -| calls.rb:90:1:95:3 | Module | foo | calls.rb:1:1:3:3 | foo | -| calls.rb:90:1:95:3 | Module | foo | calls.rb:71:1:75:3 | foo | -| calls.rb:90:1:95:3 | Module | funny | calls.rb:119:1:121:3 | funny | | calls.rb:90:1:95:3 | Module | include | calls.rb:92:5:92:20 | include | -| calls.rb:90:1:95:3 | Module | indirect | calls.rb:137:1:139:3 | indirect | | calls.rb:90:1:95:3 | Module | module_eval | calls.rb:91:5:91:24 | module_eval | | calls.rb:90:1:95:3 | Module | new | calls.rb:99:5:99:16 | new | -| calls.rb:90:1:95:3 | Module | optional_arg | calls.rb:62:1:65:3 | optional_arg | | calls.rb:90:1:95:3 | Module | prepend | calls.rb:93:5:93:20 | prepend | | calls.rb:90:1:95:3 | Module | private | calls.rb:94:5:94:20 | private | -| calls.rb:90:1:95:3 | Module | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:90:1:95:3 | Module | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:90:1:95:3 | Module | puts | calls.rb:87:5:87:17 | puts | -| calls.rb:97:1:100:3 | Object | call_block | calls.rb:67:1:69:3 | call_block | -| calls.rb:97:1:100:3 | Object | foo | calls.rb:1:1:3:3 | foo | -| calls.rb:97:1:100:3 | Object | foo | calls.rb:71:1:75:3 | foo | -| calls.rb:97:1:100:3 | Object | funny | calls.rb:119:1:121:3 | funny | -| calls.rb:97:1:100:3 | Object | indirect | calls.rb:137:1:139:3 | indirect | | calls.rb:97:1:100:3 | Object | new | calls.rb:99:5:99:16 | new | -| calls.rb:97:1:100:3 | Object | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| calls.rb:97:1:100:3 | Object | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:97:1:100:3 | Object | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:97:1:100:3 | Object | puts | calls.rb:87:5:87:17 | puts | | calls.rb:102:1:104:3 | Hash | [] | calls.rb:103:5:103:15 | [] | -| calls.rb:102:1:104:3 | Hash | call_block | calls.rb:67:1:69:3 | call_block | -| calls.rb:102:1:104:3 | Hash | foo | calls.rb:1:1:3:3 | foo | -| calls.rb:102:1:104:3 | Hash | foo | calls.rb:71:1:75:3 | foo | -| calls.rb:102:1:104:3 | Hash | funny | calls.rb:119:1:121:3 | funny | -| calls.rb:102:1:104:3 | Hash | indirect | calls.rb:137:1:139:3 | indirect | | calls.rb:102:1:104:3 | Hash | new | calls.rb:99:5:99:16 | new | -| calls.rb:102:1:104:3 | Hash | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| calls.rb:102:1:104:3 | Hash | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:102:1:104:3 | Hash | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:102:1:104:3 | Hash | puts | calls.rb:87:5:87:17 | puts | | calls.rb:106:1:117:3 | Array | [] | calls.rb:107:3:107:13 | [] | -| calls.rb:106:1:117:3 | Array | call_block | calls.rb:67:1:69:3 | call_block | -| calls.rb:106:1:117:3 | Array | foo | calls.rb:1:1:3:3 | foo | -| calls.rb:106:1:117:3 | Array | foo | calls.rb:71:1:75:3 | foo | | calls.rb:106:1:117:3 | Array | foreach | calls.rb:110:3:116:5 | foreach | -| calls.rb:106:1:117:3 | Array | funny | calls.rb:119:1:121:3 | funny | -| calls.rb:106:1:117:3 | Array | indirect | calls.rb:137:1:139:3 | indirect | | calls.rb:106:1:117:3 | Array | length | calls.rb:108:3:108:17 | length | | calls.rb:106:1:117:3 | Array | new | calls.rb:99:5:99:16 | new | -| calls.rb:106:1:117:3 | Array | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| calls.rb:106:1:117:3 | Array | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:106:1:117:3 | Array | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:106:1:117:3 | Array | puts | calls.rb:87:5:87:17 | puts | | calls.rb:144:1:148:3 | S | call_block | calls.rb:67:1:69:3 | call_block | | calls.rb:144:1:148:3 | S | foo | calls.rb:1:1:3:3 | foo | @@ -138,7 +106,6 @@ lookupMethod | calls.rb:144:1:148:3 | S | new | calls.rb:99:5:99:16 | new | | calls.rb:144:1:148:3 | S | optional_arg | calls.rb:62:1:65:3 | optional_arg | | calls.rb:144:1:148:3 | S | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:144:1:148:3 | S | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:144:1:148:3 | S | puts | calls.rb:87:5:87:17 | puts | | calls.rb:144:1:148:3 | S | s_method | calls.rb:145:5:147:7 | s_method | | calls.rb:150:1:153:3 | A | call_block | calls.rb:67:1:69:3 | call_block | @@ -149,7 +116,6 @@ lookupMethod | calls.rb:150:1:153:3 | A | new | calls.rb:99:5:99:16 | new | | calls.rb:150:1:153:3 | A | optional_arg | calls.rb:62:1:65:3 | optional_arg | | calls.rb:150:1:153:3 | A | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:150:1:153:3 | A | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:150:1:153:3 | A | puts | calls.rb:87:5:87:17 | puts | | calls.rb:150:1:153:3 | A | s_method | calls.rb:145:5:147:7 | s_method | | calls.rb:150:1:153:3 | A | to_s | calls.rb:151:5:152:7 | to_s | @@ -161,217 +127,56 @@ lookupMethod | calls.rb:155:1:158:3 | B | new | calls.rb:99:5:99:16 | new | | calls.rb:155:1:158:3 | B | optional_arg | calls.rb:62:1:65:3 | optional_arg | | calls.rb:155:1:158:3 | B | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| calls.rb:155:1:158:3 | B | private_on_main | private.rb:21:1:22:3 | private_on_main | | calls.rb:155:1:158:3 | B | puts | calls.rb:87:5:87:17 | puts | | calls.rb:155:1:158:3 | B | s_method | calls.rb:145:5:147:7 | s_method | | calls.rb:155:1:158:3 | B | to_s | calls.rb:156:5:157:7 | to_s | -| file://:0:0:0:0 | Class | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | Class | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | Class | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | Class | funny | calls.rb:119:1:121:3 | funny | | file://:0:0:0:0 | Class | include | calls.rb:92:5:92:20 | include | -| file://:0:0:0:0 | Class | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | Class | module_eval | calls.rb:91:5:91:24 | module_eval | | file://:0:0:0:0 | Class | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | Class | optional_arg | calls.rb:62:1:65:3 | optional_arg | | file://:0:0:0:0 | Class | prepend | calls.rb:93:5:93:20 | prepend | | file://:0:0:0:0 | Class | private | calls.rb:94:5:94:20 | private | -| file://:0:0:0:0 | Class | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | Class | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | Class | puts | calls.rb:87:5:87:17 | puts | -| file://:0:0:0:0 | Complex | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | Complex | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | Complex | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | Complex | funny | calls.rb:119:1:121:3 | funny | -| file://:0:0:0:0 | Complex | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | Complex | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | Complex | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| file://:0:0:0:0 | Complex | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | Complex | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | Complex | puts | calls.rb:87:5:87:17 | puts | -| file://:0:0:0:0 | FalseClass | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | FalseClass | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | FalseClass | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | FalseClass | funny | calls.rb:119:1:121:3 | funny | -| file://:0:0:0:0 | FalseClass | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | FalseClass | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | FalseClass | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| file://:0:0:0:0 | FalseClass | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | FalseClass | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | FalseClass | puts | calls.rb:87:5:87:17 | puts | -| file://:0:0:0:0 | Float | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | Float | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | Float | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | Float | funny | calls.rb:119:1:121:3 | funny | -| file://:0:0:0:0 | Float | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | Float | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | Float | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| file://:0:0:0:0 | Float | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | Float | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | Float | puts | calls.rb:87:5:87:17 | puts | -| file://:0:0:0:0 | NilClass | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | NilClass | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | NilClass | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | NilClass | funny | calls.rb:119:1:121:3 | funny | -| file://:0:0:0:0 | NilClass | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | NilClass | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | NilClass | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| file://:0:0:0:0 | NilClass | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | NilClass | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | NilClass | puts | calls.rb:87:5:87:17 | puts | -| file://:0:0:0:0 | Numeric | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | Numeric | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | Numeric | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | Numeric | funny | calls.rb:119:1:121:3 | funny | -| file://:0:0:0:0 | Numeric | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | Numeric | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | Numeric | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| file://:0:0:0:0 | Numeric | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | Numeric | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | Numeric | puts | calls.rb:87:5:87:17 | puts | -| file://:0:0:0:0 | Rational | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | Rational | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | Rational | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | Rational | funny | calls.rb:119:1:121:3 | funny | -| file://:0:0:0:0 | Rational | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | Rational | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | Rational | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| file://:0:0:0:0 | Rational | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | Rational | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | Rational | puts | calls.rb:87:5:87:17 | puts | -| file://:0:0:0:0 | TrueClass | call_block | calls.rb:67:1:69:3 | call_block | -| file://:0:0:0:0 | TrueClass | foo | calls.rb:1:1:3:3 | foo | -| file://:0:0:0:0 | TrueClass | foo | calls.rb:71:1:75:3 | foo | -| file://:0:0:0:0 | TrueClass | funny | calls.rb:119:1:121:3 | funny | -| file://:0:0:0:0 | TrueClass | indirect | calls.rb:137:1:139:3 | indirect | | file://:0:0:0:0 | TrueClass | new | calls.rb:99:5:99:16 | new | -| file://:0:0:0:0 | TrueClass | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| file://:0:0:0:0 | TrueClass | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| file://:0:0:0:0 | TrueClass | private_on_main | private.rb:21:1:22:3 | private_on_main | | file://:0:0:0:0 | TrueClass | puts | calls.rb:87:5:87:17 | puts | | hello.rb:1:1:8:3 | EnglishWords | hello | hello.rb:2:5:4:7 | hello | | hello.rb:1:1:8:3 | EnglishWords | world | hello.rb:5:5:7:7 | world | -| hello.rb:11:1:16:3 | Greeting | call_block | calls.rb:67:1:69:3 | call_block | -| hello.rb:11:1:16:3 | Greeting | foo | calls.rb:1:1:3:3 | foo | -| hello.rb:11:1:16:3 | Greeting | foo | calls.rb:71:1:75:3 | foo | -| hello.rb:11:1:16:3 | Greeting | funny | calls.rb:119:1:121:3 | funny | +| hello.rb:1:1:22:3 | Main(hello.rb) | new | calls.rb:99:5:99:16 | new | +| hello.rb:1:1:22:3 | Main(hello.rb) | puts | calls.rb:87:5:87:17 | puts | | hello.rb:11:1:16:3 | Greeting | hello | hello.rb:2:5:4:7 | hello | -| hello.rb:11:1:16:3 | Greeting | indirect | calls.rb:137:1:139:3 | indirect | | hello.rb:11:1:16:3 | Greeting | message | hello.rb:13:5:15:7 | message | | hello.rb:11:1:16:3 | Greeting | new | calls.rb:99:5:99:16 | new | -| hello.rb:11:1:16:3 | Greeting | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| hello.rb:11:1:16:3 | Greeting | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| hello.rb:11:1:16:3 | Greeting | private_on_main | private.rb:21:1:22:3 | private_on_main | | hello.rb:11:1:16:3 | Greeting | puts | calls.rb:87:5:87:17 | puts | | hello.rb:11:1:16:3 | Greeting | world | hello.rb:5:5:7:7 | world | -| hello.rb:18:1:22:3 | HelloWorld | call_block | calls.rb:67:1:69:3 | call_block | -| hello.rb:18:1:22:3 | HelloWorld | foo | calls.rb:1:1:3:3 | foo | -| hello.rb:18:1:22:3 | HelloWorld | foo | calls.rb:71:1:75:3 | foo | -| hello.rb:18:1:22:3 | HelloWorld | funny | calls.rb:119:1:121:3 | funny | | hello.rb:18:1:22:3 | HelloWorld | hello | hello.rb:2:5:4:7 | hello | -| hello.rb:18:1:22:3 | HelloWorld | indirect | calls.rb:137:1:139:3 | indirect | | hello.rb:18:1:22:3 | HelloWorld | message | hello.rb:19:5:21:7 | message | | hello.rb:18:1:22:3 | HelloWorld | new | calls.rb:99:5:99:16 | new | -| hello.rb:18:1:22:3 | HelloWorld | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| hello.rb:18:1:22:3 | HelloWorld | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| hello.rb:18:1:22:3 | HelloWorld | private_on_main | private.rb:21:1:22:3 | private_on_main | | hello.rb:18:1:22:3 | HelloWorld | puts | calls.rb:87:5:87:17 | puts | | hello.rb:18:1:22:3 | HelloWorld | world | hello.rb:5:5:7:7 | world | +| modules.rb:1:1:122:1 | Main(modules.rb) | new | calls.rb:99:5:99:16 | new | +| modules.rb:1:1:122:1 | Main(modules.rb) | puts | calls.rb:87:5:87:17 | puts | | modules.rb:4:1:24:3 | Foo | method_in_another_definition_of_foo | modules.rb:27:3:28:5 | method_in_another_definition_of_foo | | modules.rb:4:1:24:3 | Foo | method_in_foo | modules.rb:16:3:17:5 | method_in_foo | | modules.rb:5:3:14:5 | Foo::Bar | method_in_another_definition_of_foo_bar | modules.rb:52:3:53:5 | method_in_another_definition_of_foo_bar | | modules.rb:5:3:14:5 | Foo::Bar | method_in_foo_bar | modules.rb:9:5:10:7 | method_in_foo_bar | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | indirect | calls.rb:137:1:139:3 | indirect | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | new | calls.rb:99:5:99:16 | new | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | private_on_main | private.rb:21:1:22:3 | private_on_main | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | indirect | calls.rb:137:1:139:3 | indirect | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | new | calls.rb:99:5:99:16 | new | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | private_on_main | private.rb:21:1:22:3 | private_on_main | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | indirect | calls.rb:137:1:139:3 | indirect | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | new | calls.rb:99:5:99:16 | new | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | private_on_main | private.rb:21:1:22:3 | private_on_main | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:37:1:46:3 | Bar | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:37:1:46:3 | Bar | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:37:1:46:3 | Bar | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:37:1:46:3 | Bar | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:37:1:46:3 | Bar | indirect | calls.rb:137:1:139:3 | indirect | | modules.rb:37:1:46:3 | Bar | method_a | modules.rb:38:3:39:5 | method_a | | modules.rb:37:1:46:3 | Bar | method_b | modules.rb:41:3:42:5 | method_b | | modules.rb:37:1:46:3 | Bar | new | calls.rb:99:5:99:16 | new | -| modules.rb:37:1:46:3 | Bar | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:37:1:46:3 | Bar | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:37:1:46:3 | Bar | private_on_main | private.rb:21:1:22:3 | private_on_main | | modules.rb:37:1:46:3 | Bar | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | indirect | calls.rb:137:1:139:3 | indirect | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | new | calls.rb:99:5:99:16 | new | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | private_on_main | private.rb:21:1:22:3 | private_on_main | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | indirect | calls.rb:137:1:139:3 | indirect | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | new | calls.rb:99:5:99:16 | new | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | private_on_main | private.rb:21:1:22:3 | private_on_main | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | indirect | calls.rb:137:1:139:3 | indirect | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | new | calls.rb:99:5:99:16 | new | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | private_on_main | private.rb:21:1:22:3 | private_on_main | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:112:1:113:3 | YY | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:112:1:113:3 | YY | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:112:1:113:3 | YY | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:112:1:113:3 | YY | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:112:1:113:3 | YY | indirect | calls.rb:137:1:139:3 | indirect | | modules.rb:112:1:113:3 | YY | new | calls.rb:99:5:99:16 | new | -| modules.rb:112:1:113:3 | YY | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:112:1:113:3 | YY | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:112:1:113:3 | YY | private_on_main | private.rb:21:1:22:3 | private_on_main | | modules.rb:112:1:113:3 | YY | puts | calls.rb:87:5:87:17 | puts | -| modules.rb:116:7:117:9 | XX::YY | call_block | calls.rb:67:1:69:3 | call_block | -| modules.rb:116:7:117:9 | XX::YY | foo | calls.rb:1:1:3:3 | foo | -| modules.rb:116:7:117:9 | XX::YY | foo | calls.rb:71:1:75:3 | foo | -| modules.rb:116:7:117:9 | XX::YY | funny | calls.rb:119:1:121:3 | funny | -| modules.rb:116:7:117:9 | XX::YY | indirect | calls.rb:137:1:139:3 | indirect | | modules.rb:116:7:117:9 | XX::YY | new | calls.rb:99:5:99:16 | new | -| modules.rb:116:7:117:9 | XX::YY | optional_arg | calls.rb:62:1:65:3 | optional_arg | -| modules.rb:116:7:117:9 | XX::YY | private_on_main | calls.rb:164:1:165:3 | private_on_main | -| modules.rb:116:7:117:9 | XX::YY | private_on_main | private.rb:21:1:22:3 | private_on_main | | modules.rb:116:7:117:9 | XX::YY | puts | calls.rb:87:5:87:17 | puts | | private.rb:1:1:19:3 | C | baz | calls.rb:37:5:43:7 | baz | | private.rb:1:1:19:3 | C | call_block | calls.rb:67:1:69:3 | call_block | @@ -389,3 +194,6 @@ lookupMethod | private.rb:1:1:19:3 | C | private_on_main | private.rb:21:1:22:3 | private_on_main | | private.rb:1:1:19:3 | C | public | private.rb:5:3:6:5 | public | | private.rb:1:1:19:3 | C | puts | calls.rb:87:5:87:17 | puts | +| private.rb:1:1:30:15 | Main(private.rb) | new | calls.rb:99:5:99:16 | new | +| private.rb:1:1:30:15 | Main(private.rb) | private_on_main | private.rb:21:1:22:3 | private_on_main | +| private.rb:1:1:30:15 | Main(private.rb) | puts | calls.rb:87:5:87:17 | puts | diff --git a/ql/test/library-tests/modules/modules.expected b/ql/test/library-tests/modules/modules.expected index b7402d83003..eb65baacc32 100644 --- a/ql/test/library-tests/modules/modules.expected +++ b/ql/test/library-tests/modules/modules.expected @@ -1,4 +1,5 @@ getModule +| calls.rb:1:1:167:16 | Main(calls.rb) | | calls.rb:15:1:24:3 | M | | calls.rb:51:1:55:3 | D | | calls.rb:77:1:80:3 | Integer | @@ -23,9 +24,11 @@ getModule | file://:0:0:0:0 | Symbol | | file://:0:0:0:0 | TrueClass | | hello.rb:1:1:8:3 | EnglishWords | +| hello.rb:1:1:22:3 | Main(hello.rb) | | hello.rb:11:1:16:3 | Greeting | | hello.rb:18:1:22:3 | HelloWorld | | modules.rb:1:1:2:3 | Empty | +| modules.rb:1:1:122:1 | Main(modules.rb) | | modules.rb:4:1:24:3 | Foo | | modules.rb:5:3:14:5 | Foo::Bar | | modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | @@ -56,27 +59,27 @@ getModule | modules.rb:116:7:117:9 | XX::YY | | modules.rb:120:1:121:3 | Test::Foo1::Bar::Baz | | private.rb:1:1:19:3 | C | +| private.rb:1:1:30:15 | Main(private.rb) | getADeclaration +| calls.rb:1:1:167:16 | Main(calls.rb) | calls.rb:1:1:167:16 | calls.rb | | calls.rb:15:1:24:3 | M | calls.rb:15:1:24:3 | M | | calls.rb:51:1:55:3 | D | calls.rb:51:1:55:3 | D | | calls.rb:77:1:80:3 | Integer | calls.rb:77:1:80:3 | Integer | | calls.rb:82:1:84:3 | String | calls.rb:82:1:84:3 | String | | calls.rb:86:1:88:3 | Kernel | calls.rb:86:1:88:3 | Kernel | | calls.rb:90:1:95:3 | Module | calls.rb:90:1:95:3 | Module | -| calls.rb:97:1:100:3 | Object | calls.rb:1:1:167:16 | calls.rb | | calls.rb:97:1:100:3 | Object | calls.rb:97:1:100:3 | Object | -| calls.rb:97:1:100:3 | Object | hello.rb:1:1:22:3 | hello.rb | -| calls.rb:97:1:100:3 | Object | modules.rb:1:1:122:1 | modules.rb | -| calls.rb:97:1:100:3 | Object | private.rb:1:1:30:15 | private.rb | | calls.rb:102:1:104:3 | Hash | calls.rb:102:1:104:3 | Hash | | calls.rb:106:1:117:3 | Array | calls.rb:106:1:117:3 | Array | | calls.rb:144:1:148:3 | S | calls.rb:144:1:148:3 | S | | calls.rb:150:1:153:3 | A | calls.rb:150:1:153:3 | A | | calls.rb:155:1:158:3 | B | calls.rb:155:1:158:3 | B | | hello.rb:1:1:8:3 | EnglishWords | hello.rb:1:1:8:3 | EnglishWords | +| hello.rb:1:1:22:3 | Main(hello.rb) | hello.rb:1:1:22:3 | hello.rb | | hello.rb:11:1:16:3 | Greeting | hello.rb:11:1:16:3 | Greeting | | hello.rb:18:1:22:3 | HelloWorld | hello.rb:18:1:22:3 | HelloWorld | | modules.rb:1:1:2:3 | Empty | modules.rb:1:1:2:3 | Empty | +| modules.rb:1:1:122:1 | Main(modules.rb) | modules.rb:1:1:122:1 | modules.rb | | modules.rb:4:1:24:3 | Foo | modules.rb:4:1:24:3 | Foo | | modules.rb:4:1:24:3 | Foo | modules.rb:26:1:35:3 | Foo | | modules.rb:5:3:14:5 | Foo::Bar | modules.rb:5:3:14:5 | Bar | @@ -111,15 +114,17 @@ getADeclaration | modules.rb:120:1:121:3 | Test::Foo1::Bar::Baz | modules.rb:120:1:121:3 | Baz | | private.rb:1:1:19:3 | C | calls.rb:29:1:44:3 | C | | private.rb:1:1:19:3 | C | private.rb:1:1:19:3 | C | +| private.rb:1:1:30:15 | Main(private.rb) | private.rb:1:1:30:15 | private.rb | getSuperClass +| calls.rb:1:1:167:16 | Main(calls.rb) | calls.rb:97:1:100:3 | Object | | calls.rb:51:1:55:3 | D | private.rb:1:1:19:3 | C | | calls.rb:77:1:80:3 | Integer | file://:0:0:0:0 | Numeric | -| calls.rb:82:1:84:3 | String | calls.rb:97:1:100:3 | Object | +| calls.rb:82:1:84:3 | String | calls.rb:1:1:167:16 | Main(calls.rb) | | calls.rb:90:1:95:3 | Module | calls.rb:97:1:100:3 | Object | | calls.rb:97:1:100:3 | Object | file://:0:0:0:0 | BasicObject | | calls.rb:102:1:104:3 | Hash | calls.rb:97:1:100:3 | Object | | calls.rb:106:1:117:3 | Array | calls.rb:97:1:100:3 | Object | -| calls.rb:144:1:148:3 | S | calls.rb:97:1:100:3 | Object | +| calls.rb:144:1:148:3 | S | calls.rb:1:1:167:16 | Main(calls.rb) | | calls.rb:150:1:153:3 | A | calls.rb:144:1:148:3 | S | | calls.rb:155:1:158:3 | B | calls.rb:144:1:148:3 | S | | file://:0:0:0:0 | Class | calls.rb:90:1:95:3 | Module | @@ -130,18 +135,16 @@ getSuperClass | file://:0:0:0:0 | Numeric | calls.rb:97:1:100:3 | Object | | file://:0:0:0:0 | Rational | file://:0:0:0:0 | Numeric | | file://:0:0:0:0 | TrueClass | calls.rb:97:1:100:3 | Object | -| hello.rb:11:1:16:3 | Greeting | calls.rb:97:1:100:3 | Object | +| hello.rb:1:1:22:3 | Main(hello.rb) | calls.rb:97:1:100:3 | Object | +| hello.rb:11:1:16:3 | Greeting | hello.rb:1:1:22:3 | Main(hello.rb) | | hello.rb:18:1:22:3 | HelloWorld | hello.rb:11:1:16:3 | Greeting | -| modules.rb:6:5:7:7 | Foo::Bar::ClassInFooBar | calls.rb:97:1:100:3 | Object | -| modules.rb:19:3:20:5 | Foo::ClassInFoo | calls.rb:97:1:100:3 | Object | -| modules.rb:30:3:31:5 | Foo::ClassInAnotherDefinitionOfFoo | calls.rb:97:1:100:3 | Object | -| modules.rb:37:1:46:3 | Bar | calls.rb:97:1:100:3 | Object | -| modules.rb:49:3:50:5 | Foo::Bar::ClassInAnotherDefinitionOfFooBar | calls.rb:97:1:100:3 | Object | -| modules.rb:66:5:67:7 | Test::Foo1::Bar | calls.rb:97:1:100:3 | Object | -| modules.rb:72:5:73:7 | Test::Foo2::Foo2::Bar | calls.rb:97:1:100:3 | Object | -| modules.rb:112:1:113:3 | YY | calls.rb:97:1:100:3 | Object | +| modules.rb:1:1:122:1 | Main(modules.rb) | calls.rb:97:1:100:3 | Object | +| modules.rb:37:1:46:3 | Bar | modules.rb:1:1:122:1 | Main(modules.rb) | +| modules.rb:112:1:113:3 | YY | modules.rb:1:1:122:1 | Main(modules.rb) | | modules.rb:116:7:117:9 | XX::YY | modules.rb:112:1:113:3 | YY | -| private.rb:1:1:19:3 | C | calls.rb:97:1:100:3 | Object | +| private.rb:1:1:19:3 | C | calls.rb:1:1:167:16 | Main(calls.rb) | +| private.rb:1:1:19:3 | C | private.rb:1:1:30:15 | Main(private.rb) | +| private.rb:1:1:30:15 | Main(private.rb) | calls.rb:97:1:100:3 | Object | getAPrependedModule | modules.rb:101:1:105:3 | PrependTest | modules.rb:63:1:81:3 | Test | getAnIncludedModule diff --git a/ql/test/library-tests/modules/superclasses.expected b/ql/test/library-tests/modules/superclasses.expected index b1948a9976e..c305b3cc929 100644 --- a/ql/test/library-tests/modules/superclasses.expected +++ b/ql/test/library-tests/modules/superclasses.expected @@ -1,3 +1,19 @@ +calls.rb: +# 1| Main(calls.rb) +#-----| -> Object + +hello.rb: +# 1| Main(hello.rb) +#-----| -> Object + +modules.rb: +# 1| Main(modules.rb) +#-----| -> Object + +private.rb: +# 1| Main(private.rb) +#-----| -> Object + calls.rb: # 102| Hash #-----| -> Object @@ -50,17 +66,18 @@ calls.rb: private.rb: # 1| C -#-----| -> Object +#-----| -> Main(calls.rb) +#-----| -> Main(private.rb) calls.rb: # 51| D #-----| -> C # 82| String -#-----| -> Object +#-----| -> Main(calls.rb) # 144| S -#-----| -> Object +#-----| -> Main(calls.rb) # 150| A #-----| -> S @@ -72,7 +89,7 @@ hello.rb: # 1| EnglishWords # 11| Greeting -#-----| -> Object +#-----| -> Main(hello.rb) # 18| HelloWorld #-----| -> Greeting @@ -83,7 +100,7 @@ modules.rb: # 4| Foo # 37| Bar -#-----| -> Object +#-----| -> Main(modules.rb) # 60| MyModuleInGlobalScope @@ -100,17 +117,15 @@ modules.rb: # 107| MM # 112| YY -#-----| -> Object +#-----| -> Main(modules.rb) # 115| XX # 5| Foo::Bar # 19| Foo::ClassInFoo -#-----| -> Object # 30| Foo::ClassInAnotherDefinitionOfFoo -#-----| -> Object # 116| XX::YY #-----| -> YY @@ -124,17 +139,14 @@ modules.rb: # 84| Other::Foo1 # 6| Foo::Bar::ClassInFooBar -#-----| -> Object # 71| Test::Foo2::Foo2 # 108| MM::MM # 49| Foo::Bar::ClassInAnotherDefinitionOfFooBar -#-----| -> Object # 66| Test::Foo1::Bar -#-----| -> Object # 91| Test::Foo1::Y @@ -143,6 +155,5 @@ modules.rb: # 103| Test::Foo2::Y # 72| Test::Foo2::Foo2::Bar -#-----| -> Object # 120| Test::Foo1::Bar::Baz