11private import codeql_ruby.AST
22private import codeql_ruby.ast.Constant
33private import internal.AST
4+ private import internal.Module
45private import internal.TreeSitter
56
7+ /**
8+ * A representation of a run-time `module` or `class` value.
9+ */
10+ class Module extends TModule {
11+ /** Get a declaration of this module, if any. */
12+ ModuleBase getADeclaration ( ) { result .getModule ( ) = this }
13+
14+ /** Gets a textual representation of this module. */
15+ string toString ( ) {
16+ this = TResolved ( result )
17+ or
18+ exists ( Namespace n | this = TUnresolved ( n ) and result = "...::" + n .toString ( ) )
19+ }
20+
21+ /** Gets the location of this module. */
22+ Location getLocation ( ) {
23+ exists ( Namespace n | this = TUnresolved ( n ) and result = n .getLocation ( ) )
24+ or
25+ result =
26+ min ( Namespace n , string qName , Location loc , int weight |
27+ this = TResolved ( qName ) and
28+ qName = namespaceDeclaration ( n ) and
29+ loc = n .getLocation ( ) and
30+ if exists ( loc .getFile ( ) .getRelativePath ( ) ) then weight = 0 else weight = 1
31+ |
32+ loc
33+ order by
34+ weight , count ( n .getAStmt ( ) ) desc , loc .getFile ( ) .getAbsolutePath ( ) , loc .getStartLine ( ) ,
35+ loc .getStartColumn ( )
36+ )
37+ }
38+ }
39+
640/**
741 * The base class for classes, singleton classes, and modules.
842 */
9- class ModuleBase extends BodyStmt , TModuleBase {
43+ class ModuleBase extends BodyStmt , Scope , TModuleBase {
1044 /** Gets a method defined in this module/class. */
1145 MethodBase getAMethod ( ) { result = this .getAStmt ( ) }
1246
1347 /** Gets the method named `name` in this module/class, if any. */
1448 MethodBase getMethod ( string name ) { result = this .getAMethod ( ) and result .getName ( ) = name }
1549
1650 /** Gets a class defined in this module/class. */
17- Class getAClass ( ) { result = this .getAStmt ( ) }
51+ ClassDeclaration getAClass ( ) { result = this .getAStmt ( ) }
1852
1953 /** Gets the class named `name` in this module/class, if any. */
20- Class getClass ( string name ) { result = this .getAClass ( ) and result .getName ( ) = name }
54+ ClassDeclaration getClass ( string name ) { result = this .getAClass ( ) and result .getName ( ) = name }
2155
2256 /** Gets a module defined in this module/class. */
23- Module getAModule ( ) { result = this .getAStmt ( ) }
57+ ModuleDeclaration getAModule ( ) { result = this .getAStmt ( ) }
2458
2559 /** Gets the module named `name` in this module/class, if any. */
26- Module getModule ( string name ) { result = this .getAModule ( ) and result .getName ( ) = name }
60+ ModuleDeclaration getModule ( string name ) {
61+ result = this .getAModule ( ) and result .getName ( ) = name
62+ }
63+
64+ /** Gets the representation of the run-time value of this module or class. */
65+ Module getModule ( ) { none ( ) }
2766}
2867
2968/**
@@ -62,6 +101,8 @@ class Toplevel extends ModuleBase, TToplevel {
62101 pred = "getBeginBlock" and result = this .getBeginBlock ( _)
63102 }
64103
104+ final override Module getModule ( ) { result = TResolved ( "Object" ) }
105+
65106 final override string toString ( ) { result = g .getLocation ( ) .getFile ( ) .getBaseName ( ) }
66107}
67108
@@ -132,6 +173,12 @@ class Namespace extends ModuleBase, ConstantWriteAccess, TNamespace {
132173 */
133174 override predicate hasGlobalScope ( ) { none ( ) }
134175
176+ final override Module getModule ( ) {
177+ result = any ( string qName | qName = namespaceDeclaration ( this ) | TResolved ( qName ) )
178+ or
179+ result = TUnresolved ( this )
180+ }
181+
135182 override AstNode getAChild ( string pred ) {
136183 result = ModuleBase .super .getAChild ( pred ) or
137184 result = ConstantWriteAccess .super .getAChild ( pred )
@@ -150,12 +197,12 @@ class Namespace extends ModuleBase, ConstantWriteAccess, TNamespace {
150197 * end
151198 * ```
152199 */
153- class Class extends Namespace , TClass {
200+ class ClassDeclaration extends Namespace , TClassDeclaration {
154201 private Generated:: Class g ;
155202
156- Class ( ) { this = TClass ( g ) }
203+ ClassDeclaration ( ) { this = TClassDeclaration ( g ) }
157204
158- final override string getAPrimaryQlClass ( ) { result = "Class " }
205+ final override string getAPrimaryQlClass ( ) { result = "ClassDeclaration " }
159206
160207 /**
161208 * Gets the `Expr` used as the superclass in the class definition, if any.
@@ -214,7 +261,7 @@ class SingletonClass extends ModuleBase, TSingletonClass {
214261
215262 SingletonClass ( ) { this = TSingletonClass ( g ) }
216263
217- final override string getAPrimaryQlClass ( ) { result = "Class " }
264+ final override string getAPrimaryQlClass ( ) { result = "ClassDeclaration " }
218265
219266 /**
220267 * Gets the expression resulting in the object on which the singleton class
@@ -249,7 +296,7 @@ class SingletonClass extends ModuleBase, TSingletonClass {
249296 * N.B. this class represents a single instance of a module definition. In the
250297 * following example, classes `Bar` and `Baz` are both defined in the module
251298 * `Foo`, but in two syntactically distinct definitions, meaning that there
252- * will be two instances of `Module ` in the database.
299+ * will be two instances of `ModuleDeclaration ` in the database.
253300 *
254301 * ```rb
255302 * module Foo
@@ -261,12 +308,12 @@ class SingletonClass extends ModuleBase, TSingletonClass {
261308 * end
262309 * ```
263310 */
264- class Module extends Namespace , TModule {
311+ class ModuleDeclaration extends Namespace , TModuleDeclaration {
265312 private Generated:: Module g ;
266313
267- Module ( ) { this = TModule ( g ) }
314+ ModuleDeclaration ( ) { this = TModuleDeclaration ( g ) }
268315
269- final override string getAPrimaryQlClass ( ) { result = "Module " }
316+ final override string getAPrimaryQlClass ( ) { result = "ModuleDeclaration " }
270317
271318 final override string getName ( ) {
272319 result = g .getName ( ) .( Generated:: Token ) .getValue ( ) or
0 commit comments