Skip to content

Commit 97def4d

Browse files
committed
Ruby: Make module graph queries avoid relying on evalaution order.
1 parent 5c3f21b commit 97def4d

File tree

4 files changed

+82
-44
lines changed

4 files changed

+82
-44
lines changed

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

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
1+
#-----| BasicObject
2+
13
#-----| Class
24
#-----| super -> Module
35

4-
#-----| EsotericInstanceMethods
5-
6-
#-----| MyStruct
7-
8-
#-----| Struct
9-
10-
#-----| UnresolvedNamespace
11-
12-
#-----| BasicObject
13-
146
#-----| Complex
157
#-----| super -> Numeric
168

9+
#-----| EsotericInstanceMethods
10+
1711
#-----| FalseClass
1812
#-----| super -> Object
1913

2014
#-----| Float
2115
#-----| super -> Numeric
2216

17+
#-----| MyStruct
18+
2319
#-----| NilClass
2420
#-----| super -> Object
2521

@@ -31,11 +27,15 @@
3127
#-----| Rational
3228
#-----| super -> Numeric
3329

30+
#-----| Struct
31+
3432
#-----| Symbol
3533

3634
#-----| TrueClass
3735
#-----| super -> Object
3836

37+
#-----| UnresolvedNamespace
38+
3939
#-----| UnresolvedNamespace::X1
4040

4141
#-----| UnresolvedNamespace::X1::X2

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

+31-12
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,41 @@
55

66
import codeql.ruby.AST
77

8+
int locationModuleRank(Module node) {
9+
node =
10+
rank[result](Module m, Location l |
11+
l = m.getLocation()
12+
|
13+
m
14+
order by
15+
l.getFile().getBaseName(), l.getFile().getAbsolutePath(), l.getStartLine(),
16+
l.getStartColumn(), l.getEndLine(), l.getEndColumn(), m.toString()
17+
)
18+
}
19+
20+
int stringModuleRank(Module node) {
21+
node =
22+
rank[result](Module m |
23+
not exists(locationModuleRank(m))
24+
|
25+
m
26+
order by
27+
m.toString()
28+
)
29+
}
30+
31+
int moduleRank(Module node) {
32+
result = locationModuleRank(node) + max(stringModuleRank(_))
33+
or
34+
result = stringModuleRank(node)
35+
}
36+
37+
838
query predicate nodes(Module node, string key, string value) {
939
key = "semmle.label" and value = node.toString()
1040
or
1141
key = "semmle.order" and
12-
value =
13-
any(int i |
14-
node =
15-
rank[i](Module m, Location l |
16-
l = m.getLocation()
17-
|
18-
m
19-
order by
20-
l.getFile().getBaseName(), l.getFile().getAbsolutePath(), l.getStartLine(),
21-
l.getStartColumn(), l.getEndLine(), l.getEndColumn(), m.toString()
22-
)
23-
).toString()
42+
value = moduleRank(node).toString()
2443
}
2544

2645
Module getATarget(Module source, string value) {

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

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
1+
#-----| BasicObject
2+
13
#-----| Class
24
#-----| -> Module
35

4-
#-----| EsotericInstanceMethods
5-
6-
#-----| MyStruct
7-
8-
#-----| Struct
9-
10-
#-----| UnresolvedNamespace
11-
12-
#-----| BasicObject
13-
146
#-----| Complex
157
#-----| -> Numeric
168

9+
#-----| EsotericInstanceMethods
10+
1711
#-----| FalseClass
1812
#-----| -> Object
1913

2014
#-----| Float
2115
#-----| -> Numeric
2216

17+
#-----| MyStruct
18+
2319
#-----| NilClass
2420
#-----| -> Object
2521

@@ -31,11 +27,15 @@
3127
#-----| Rational
3228
#-----| -> Numeric
3329

30+
#-----| Struct
31+
3432
#-----| Symbol
3533

3634
#-----| TrueClass
3735
#-----| -> Object
3836

37+
#-----| UnresolvedNamespace
38+
3939
#-----| UnresolvedNamespace::X1
4040

4141
#-----| UnresolvedNamespace::X1::X2

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

+31-12
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,41 @@
55

66
import codeql.ruby.AST
77

8+
int locationModuleRank(Module node) {
9+
node =
10+
rank[result](Module m, Location l |
11+
l = m.getLocation()
12+
|
13+
m
14+
order by
15+
l.getFile().getBaseName(), l.getFile().getAbsolutePath(), l.getStartLine(),
16+
l.getStartColumn(), l.getEndLine(), l.getEndColumn(), m.toString()
17+
)
18+
}
19+
20+
int stringModuleRank(Module node) {
21+
node =
22+
rank[result](Module m |
23+
not exists(locationModuleRank(m))
24+
|
25+
m
26+
order by
27+
m.toString()
28+
)
29+
}
30+
31+
int moduleRank(Module node) {
32+
result = locationModuleRank(node) + max(stringModuleRank(_))
33+
or
34+
result = stringModuleRank(node)
35+
}
36+
37+
838
query predicate nodes(Module node, string key, string value) {
939
key = "semmle.label" and value = node.toString()
1040
or
1141
key = "semmle.order" and
12-
value =
13-
any(int i |
14-
node =
15-
rank[i](Module m, Location l |
16-
l = m.getLocation()
17-
|
18-
m
19-
order by
20-
l.getFile().getBaseName(), l.getFile().getAbsolutePath(), l.getStartLine(),
21-
l.getStartColumn(), l.getEndLine(), l.getEndColumn(), m.toString()
22-
)
23-
).toString()
42+
value = moduleRank(node).toString()
2443
}
2544

2645
query predicate edges(Module source, Module target, string key, string value) {

0 commit comments

Comments
 (0)