Skip to content

Commit 32bab0b

Browse files
authored
Merge pull request github#12654 from asgerf/rb/always-resolve-toplevel-namespace
RB: always resolve toplevel namespaces to their locally qualified name
2 parents a1a2eb3 + 179d0b3 commit 32bab0b

File tree

6 files changed

+159
-14
lines changed

6 files changed

+159
-14
lines changed

ruby/ql/lib/codeql/ruby/ast/internal/Module.qll

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ private module Cached {
2121
qName = getAnAssumedGlobalConst()
2222
or
2323
qName = namespaceDeclaration(_)
24+
or
25+
qName = getAnAssumedGlobalNamespacePrefix(_)
2426
} or
2527
TUnresolved(Namespace n) { not exists(namespaceDeclaration(n)) }
2628

@@ -36,6 +38,8 @@ private module Cached {
3638
TResolved(container) = resolveConstantReadAccess(n.getScopeExpr()) and
3739
result = scopeAppend(container, n.getName())
3840
)
41+
or
42+
result = getAnAssumedGlobalNamespacePrefix(n)
3943
}
4044

4145
cached
@@ -407,19 +411,48 @@ private module ResolveImpl {
407411
*/
408412
string getAnAssumedGlobalConst() {
409413
exists(ConstantAccess access |
410-
not exists(access.getScopeExpr()) and
411414
result = access.getName() and
412415
isToplevel(access)
413416
)
414417
}
415418

419+
private ConstantAccess getANamespaceScopeInTopLevel() {
420+
result.(Namespace).getEnclosingModule() instanceof Toplevel
421+
or
422+
result = getANamespaceScopeInTopLevel().getScopeExpr()
423+
}
424+
425+
/**
426+
* Gets the syntactical qualified name of the given constant access, which must be a top-level
427+
* namespace or scope prefix thereof.
428+
*
429+
* For example, for `module A::B::C` this gets `A`, `A::B`, and `A::B::C` for the two prefixes
430+
* and the module itself, respectively.
431+
*/
432+
string getAnAssumedGlobalNamespacePrefix(ConstantAccess access) {
433+
access = getANamespaceScopeInTopLevel() and
434+
(
435+
not exists(access.getScopeExpr()) and
436+
result = access.getName()
437+
or
438+
result =
439+
scopeAppend(getAnAssumedGlobalNamespacePrefix(access.getScopeExpr()), access.getName())
440+
)
441+
}
442+
416443
pragma[nomagic]
417444
private string isDefinedConstantNonRec(string container, string name) {
418445
result = resolveConstantWriteAccessNonRec(_, container, name)
419446
or
420447
result = [builtin(), getAnAssumedGlobalConst()] and
421448
name = result and
422449
container = "Object"
450+
or
451+
exists(ConstantAccess access |
452+
container = getAnAssumedGlobalNamespacePrefix(access.getScopeExpr()) and
453+
name = access.getName() and
454+
result = getAnAssumedGlobalNamespacePrefix(access)
455+
)
423456
}
424457

425458
pragma[nomagic]

ruby/ql/test/library-tests/modules/ancestors.expected

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
#-----| TrueClass
3737
#-----| super -> Object
3838

39+
#-----| UnresolvedNamespace::X1
40+
41+
#-----| UnresolvedNamespace::X1::X2
42+
43+
#-----| UnresolvedNamespace::X1::X2::X3
44+
3945
calls.rb:
4046
# 21| M
4147

@@ -272,3 +278,12 @@ unresolved_subclass.rb:
272278

273279
# 11| UnresolvedNamespace::A
274280
#-----| super -> Object
281+
282+
# 14| UnresolvedNamespace::X1::X2::X3::Subclass1
283+
#-----| super -> ResolvableBaseClass
284+
285+
# 17| UnresolvedNamespace::X1::X2::X3::Subclass2
286+
#-----| super -> UnresolvedNamespace::X1::X2::X3::Subclass1
287+
288+
# 21| UnresolvedNamespace::X1::X2::X3::A
289+
#-----| super -> Object

ruby/ql/test/library-tests/modules/methods.expected

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,15 @@ lookupMethod
660660
| unresolved_subclass.rb:11:1:12:3 | UnresolvedNamespace::A | new | calls.rb:117:5:117:16 | new |
661661
| unresolved_subclass.rb:11:1:12:3 | UnresolvedNamespace::A | puts | calls.rb:102:5:102:30 | puts |
662662
| unresolved_subclass.rb:11:1:12:3 | UnresolvedNamespace::A | to_s | calls.rb:172:5:173:7 | to_s |
663+
| unresolved_subclass.rb:14:1:15:3 | UnresolvedNamespace::X1::X2::X3::Subclass1 | new | calls.rb:117:5:117:16 | new |
664+
| unresolved_subclass.rb:14:1:15:3 | UnresolvedNamespace::X1::X2::X3::Subclass1 | puts | calls.rb:102:5:102:30 | puts |
665+
| unresolved_subclass.rb:14:1:15:3 | UnresolvedNamespace::X1::X2::X3::Subclass1 | to_s | calls.rb:172:5:173:7 | to_s |
666+
| unresolved_subclass.rb:17:1:18:3 | UnresolvedNamespace::X1::X2::X3::Subclass2 | new | calls.rb:117:5:117:16 | new |
667+
| unresolved_subclass.rb:17:1:18:3 | UnresolvedNamespace::X1::X2::X3::Subclass2 | puts | calls.rb:102:5:102:30 | puts |
668+
| unresolved_subclass.rb:17:1:18:3 | UnresolvedNamespace::X1::X2::X3::Subclass2 | to_s | calls.rb:172:5:173:7 | to_s |
669+
| unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A | new | calls.rb:117:5:117:16 | new |
670+
| unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A | puts | calls.rb:102:5:102:30 | puts |
671+
| unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A | to_s | calls.rb:172:5:173:7 | to_s |
663672
enclosingMethod
664673
| calls.rb:2:5:2:14 | call to puts | calls.rb:1:1:3:3 | foo |
665674
| calls.rb:2:5:2:14 | self | calls.rb:1:1:3:3 | foo |

ruby/ql/test/library-tests/modules/modules.expected

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ getModule
5151
| file://:0:0:0:0 | Symbol |
5252
| file://:0:0:0:0 | TrueClass |
5353
| file://:0:0:0:0 | UnresolvedNamespace |
54+
| file://:0:0:0:0 | UnresolvedNamespace::X1 |
55+
| file://:0:0:0:0 | UnresolvedNamespace::X1::X2 |
56+
| file://:0:0:0:0 | UnresolvedNamespace::X1::X2::X3 |
5457
| hello.rb:1:1:8:3 | EnglishWords |
5558
| hello.rb:11:1:16:3 | Greeting |
5659
| hello.rb:18:1:22:3 | HelloWorld |
@@ -97,6 +100,9 @@ getModule
97100
| unresolved_subclass.rb:4:1:5:3 | UnresolvedNamespace::Subclass1 |
98101
| unresolved_subclass.rb:7:1:8:3 | UnresolvedNamespace::Subclass2 |
99102
| unresolved_subclass.rb:11:1:12:3 | UnresolvedNamespace::A |
103+
| unresolved_subclass.rb:14:1:15:3 | UnresolvedNamespace::X1::X2::X3::Subclass1 |
104+
| unresolved_subclass.rb:17:1:18:3 | UnresolvedNamespace::X1::X2::X3::Subclass2 |
105+
| unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A |
100106
getADeclaration
101107
| calls.rb:21:1:34:3 | M | calls.rb:21:1:34:3 | M |
102108
| calls.rb:43:1:58:3 | C | calls.rb:43:1:58:3 | C |
@@ -113,7 +119,7 @@ getADeclaration
113119
| calls.rb:115:1:118:3 | Object | modules_rec.rb:1:1:11:26 | modules_rec.rb |
114120
| calls.rb:115:1:118:3 | Object | private.rb:1:1:105:40 | private.rb |
115121
| calls.rb:115:1:118:3 | Object | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb |
116-
| calls.rb:115:1:118:3 | Object | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
122+
| calls.rb:115:1:118:3 | Object | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
117123
| calls.rb:120:1:123:3 | Hash | calls.rb:120:1:123:3 | Hash |
118124
| calls.rb:125:1:138:3 | Array | calls.rb:125:1:138:3 | Array |
119125
| calls.rb:165:1:169:3 | S | calls.rb:165:1:169:3 | S |
@@ -197,6 +203,9 @@ getADeclaration
197203
| unresolved_subclass.rb:4:1:5:3 | UnresolvedNamespace::Subclass1 | unresolved_subclass.rb:4:1:5:3 | Subclass1 |
198204
| unresolved_subclass.rb:7:1:8:3 | UnresolvedNamespace::Subclass2 | unresolved_subclass.rb:7:1:8:3 | Subclass2 |
199205
| unresolved_subclass.rb:11:1:12:3 | UnresolvedNamespace::A | unresolved_subclass.rb:11:1:12:3 | A |
206+
| unresolved_subclass.rb:14:1:15:3 | UnresolvedNamespace::X1::X2::X3::Subclass1 | unresolved_subclass.rb:14:1:15:3 | Subclass1 |
207+
| unresolved_subclass.rb:17:1:18:3 | UnresolvedNamespace::X1::X2::X3::Subclass2 | unresolved_subclass.rb:17:1:18:3 | Subclass2 |
208+
| unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A | unresolved_subclass.rb:21:1:22:3 | A |
200209
getSuperClass
201210
| calls.rb:43:1:58:3 | C | calls.rb:115:1:118:3 | Object |
202211
| calls.rb:65:1:69:3 | D | calls.rb:43:1:58:3 | C |
@@ -259,6 +268,9 @@ getSuperClass
259268
| unresolved_subclass.rb:4:1:5:3 | UnresolvedNamespace::Subclass1 | unresolved_subclass.rb:1:1:2:3 | ResolvableBaseClass |
260269
| unresolved_subclass.rb:7:1:8:3 | UnresolvedNamespace::Subclass2 | unresolved_subclass.rb:4:1:5:3 | UnresolvedNamespace::Subclass1 |
261270
| unresolved_subclass.rb:11:1:12:3 | UnresolvedNamespace::A | calls.rb:115:1:118:3 | Object |
271+
| unresolved_subclass.rb:14:1:15:3 | UnresolvedNamespace::X1::X2::X3::Subclass1 | unresolved_subclass.rb:1:1:2:3 | ResolvableBaseClass |
272+
| unresolved_subclass.rb:17:1:18:3 | UnresolvedNamespace::X1::X2::X3::Subclass2 | unresolved_subclass.rb:14:1:15:3 | UnresolvedNamespace::X1::X2::X3::Subclass1 |
273+
| unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A | calls.rb:115:1:118:3 | Object |
262274
getAPrependedModule
263275
| calls.rb:115:1:118:3 | Object | calls.rb:171:1:174:3 | A |
264276
| calls.rb:171:1:174:3 | A | toplevel_self_singleton.rb:2:5:5:7 | A::B |
@@ -419,6 +431,28 @@ resolveConstantReadAccess
419431
| unresolved_subclass.rb:7:40:7:69 | Subclass1 | UnresolvedNamespace::Subclass1 |
420432
| unresolved_subclass.rb:11:7:11:25 | UnresolvedNamespace | UnresolvedNamespace |
421433
| unresolved_subclass.rb:11:32:11:50 | UnresolvedNamespace | UnresolvedNamespace |
434+
| unresolved_subclass.rb:14:7:14:25 | UnresolvedNamespace | UnresolvedNamespace |
435+
| unresolved_subclass.rb:14:7:14:29 | X1 | UnresolvedNamespace::X1 |
436+
| unresolved_subclass.rb:14:7:14:33 | X2 | UnresolvedNamespace::X1::X2 |
437+
| unresolved_subclass.rb:14:7:14:37 | X3 | UnresolvedNamespace::X1::X2::X3 |
438+
| unresolved_subclass.rb:14:52:14:70 | ResolvableBaseClass | ResolvableBaseClass |
439+
| unresolved_subclass.rb:17:7:17:25 | UnresolvedNamespace | UnresolvedNamespace |
440+
| unresolved_subclass.rb:17:7:17:29 | X1 | UnresolvedNamespace::X1 |
441+
| unresolved_subclass.rb:17:7:17:33 | X2 | UnresolvedNamespace::X1::X2 |
442+
| unresolved_subclass.rb:17:7:17:37 | X3 | UnresolvedNamespace::X1::X2::X3 |
443+
| unresolved_subclass.rb:17:52:17:70 | UnresolvedNamespace | UnresolvedNamespace |
444+
| unresolved_subclass.rb:17:52:17:74 | X1 | UnresolvedNamespace::X1 |
445+
| unresolved_subclass.rb:17:52:17:78 | X2 | UnresolvedNamespace::X1::X2 |
446+
| unresolved_subclass.rb:17:52:17:82 | X3 | UnresolvedNamespace::X1::X2::X3 |
447+
| unresolved_subclass.rb:17:52:17:93 | Subclass1 | UnresolvedNamespace::X1::X2::X3::Subclass1 |
448+
| unresolved_subclass.rb:21:7:21:25 | UnresolvedNamespace | UnresolvedNamespace |
449+
| unresolved_subclass.rb:21:7:21:29 | X1 | UnresolvedNamespace::X1 |
450+
| unresolved_subclass.rb:21:7:21:33 | X2 | UnresolvedNamespace::X1::X2 |
451+
| unresolved_subclass.rb:21:7:21:37 | X3 | UnresolvedNamespace::X1::X2::X3 |
452+
| unresolved_subclass.rb:21:44:21:62 | UnresolvedNamespace | UnresolvedNamespace |
453+
| unresolved_subclass.rb:21:44:21:66 | X1 | UnresolvedNamespace::X1 |
454+
| unresolved_subclass.rb:21:44:21:70 | X2 | UnresolvedNamespace::X1::X2 |
455+
| unresolved_subclass.rb:21:44:21:74 | X3 | UnresolvedNamespace::X1::X2::X3 |
422456
resolveConstantWriteAccess
423457
| calls.rb:21:1:34:3 | M | M |
424458
| calls.rb:43:1:58:3 | C | C |
@@ -523,6 +557,9 @@ resolveConstantWriteAccess
523557
| unresolved_subclass.rb:4:1:5:3 | Subclass1 | UnresolvedNamespace::Subclass1 |
524558
| unresolved_subclass.rb:7:1:8:3 | Subclass2 | UnresolvedNamespace::Subclass2 |
525559
| unresolved_subclass.rb:11:1:12:3 | A | UnresolvedNamespace::A |
560+
| unresolved_subclass.rb:14:1:15:3 | Subclass1 | UnresolvedNamespace::X1::X2::X3::Subclass1 |
561+
| unresolved_subclass.rb:17:1:18:3 | Subclass2 | UnresolvedNamespace::X1::X2::X3::Subclass2 |
562+
| unresolved_subclass.rb:21:1:22:3 | A | UnresolvedNamespace::X1::X2::X3::A |
526563
enclosingModule
527564
| calls.rb:1:1:3:3 | foo | calls.rb:1:1:651:24 | calls.rb |
528565
| calls.rb:2:5:2:14 | call to puts | calls.rb:1:1:651:24 | calls.rb |
@@ -1878,15 +1915,41 @@ enclosingModule
18781915
| toplevel_self_singleton.rb:30:13:30:19 | self | toplevel_self_singleton.rb:25:5:33:7 | class << ... |
18791916
| toplevel_self_singleton.rb:31:13:31:20 | call to call_you | toplevel_self_singleton.rb:25:5:33:7 | class << ... |
18801917
| toplevel_self_singleton.rb:31:13:31:20 | self | toplevel_self_singleton.rb:25:5:33:7 | class << ... |
1881-
| unresolved_subclass.rb:1:1:2:3 | ResolvableBaseClass | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1882-
| unresolved_subclass.rb:4:1:5:3 | Subclass1 | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1883-
| unresolved_subclass.rb:4:7:4:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1884-
| unresolved_subclass.rb:4:40:4:58 | ResolvableBaseClass | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1885-
| unresolved_subclass.rb:7:1:8:3 | Subclass2 | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1886-
| unresolved_subclass.rb:7:7:7:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1887-
| unresolved_subclass.rb:7:40:7:58 | UnresolvedNamespace | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1888-
| unresolved_subclass.rb:7:40:7:69 | Subclass1 | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1889-
| unresolved_subclass.rb:11:1:12:3 | A | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1890-
| unresolved_subclass.rb:11:7:11:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1891-
| unresolved_subclass.rb:11:32:11:50 | UnresolvedNamespace | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1892-
| unresolved_subclass.rb:11:32:11:53 | B | unresolved_subclass.rb:1:1:12:4 | unresolved_subclass.rb |
1918+
| unresolved_subclass.rb:1:1:2:3 | ResolvableBaseClass | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1919+
| unresolved_subclass.rb:4:1:5:3 | Subclass1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1920+
| unresolved_subclass.rb:4:7:4:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1921+
| unresolved_subclass.rb:4:40:4:58 | ResolvableBaseClass | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1922+
| unresolved_subclass.rb:7:1:8:3 | Subclass2 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1923+
| unresolved_subclass.rb:7:7:7:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1924+
| unresolved_subclass.rb:7:40:7:58 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1925+
| unresolved_subclass.rb:7:40:7:69 | Subclass1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1926+
| unresolved_subclass.rb:11:1:12:3 | A | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1927+
| unresolved_subclass.rb:11:7:11:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1928+
| unresolved_subclass.rb:11:32:11:50 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1929+
| unresolved_subclass.rb:11:32:11:53 | B | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1930+
| unresolved_subclass.rb:14:1:15:3 | Subclass1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1931+
| unresolved_subclass.rb:14:7:14:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1932+
| unresolved_subclass.rb:14:7:14:29 | X1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1933+
| unresolved_subclass.rb:14:7:14:33 | X2 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1934+
| unresolved_subclass.rb:14:7:14:37 | X3 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1935+
| unresolved_subclass.rb:14:52:14:70 | ResolvableBaseClass | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1936+
| unresolved_subclass.rb:17:1:18:3 | Subclass2 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1937+
| unresolved_subclass.rb:17:7:17:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1938+
| unresolved_subclass.rb:17:7:17:29 | X1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1939+
| unresolved_subclass.rb:17:7:17:33 | X2 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1940+
| unresolved_subclass.rb:17:7:17:37 | X3 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1941+
| unresolved_subclass.rb:17:52:17:70 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1942+
| unresolved_subclass.rb:17:52:17:74 | X1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1943+
| unresolved_subclass.rb:17:52:17:78 | X2 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1944+
| unresolved_subclass.rb:17:52:17:82 | X3 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1945+
| unresolved_subclass.rb:17:52:17:93 | Subclass1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1946+
| unresolved_subclass.rb:21:1:22:3 | A | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1947+
| unresolved_subclass.rb:21:7:21:25 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1948+
| unresolved_subclass.rb:21:7:21:29 | X1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1949+
| unresolved_subclass.rb:21:7:21:33 | X2 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1950+
| unresolved_subclass.rb:21:7:21:37 | X3 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1951+
| unresolved_subclass.rb:21:44:21:62 | UnresolvedNamespace | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1952+
| unresolved_subclass.rb:21:44:21:66 | X1 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1953+
| unresolved_subclass.rb:21:44:21:70 | X2 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1954+
| unresolved_subclass.rb:21:44:21:74 | X3 | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |
1955+
| unresolved_subclass.rb:21:44:21:77 | B | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb |

ruby/ql/test/library-tests/modules/superclasses.expected

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
#-----| TrueClass
3737
#-----| -> Object
3838

39+
#-----| UnresolvedNamespace::X1
40+
41+
#-----| UnresolvedNamespace::X1::X2
42+
43+
#-----| UnresolvedNamespace::X1::X2::X3
44+
3945
calls.rb:
4046
# 21| M
4147

@@ -262,3 +268,12 @@ unresolved_subclass.rb:
262268

263269
# 11| UnresolvedNamespace::A
264270
#-----| -> Object
271+
272+
# 14| UnresolvedNamespace::X1::X2::X3::Subclass1
273+
#-----| -> ResolvableBaseClass
274+
275+
# 17| UnresolvedNamespace::X1::X2::X3::Subclass2
276+
#-----| -> UnresolvedNamespace::X1::X2::X3::Subclass1
277+
278+
# 21| UnresolvedNamespace::X1::X2::X3::A
279+
#-----| -> Object

ruby/ql/test/library-tests/modules/unresolved_subclass.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,13 @@ class UnresolvedNamespace::Subclass2 < UnresolvedNamespace::Subclass1
1010
# Ensure Object is a transitive superclass of this
1111
class UnresolvedNamespace::A < UnresolvedNamespace::B
1212
end
13+
14+
class UnresolvedNamespace::X1::X2::X3::Subclass1 < ResolvableBaseClass
15+
end
16+
17+
class UnresolvedNamespace::X1::X2::X3::Subclass2 < UnresolvedNamespace::X1::X2::X3::Subclass1
18+
end
19+
20+
# Ensure Object is a transitive superclass of this
21+
class UnresolvedNamespace::X1::X2::X3::A < UnresolvedNamespace::X1::X2::X3::B
22+
end

0 commit comments

Comments
 (0)