Skip to content

Commit 0ccbe3e

Browse files
committed
Ruby: Make module graph queries avoid relying on evalaution order.
1 parent ffb25b7 commit 0ccbe3e

File tree

4 files changed

+66
-44
lines changed

4 files changed

+66
-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

+23-12
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,33 @@
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 = rank[result](Module m | not exists(locationModuleRank(m)) | m order by m.toString())
22+
}
23+
24+
int moduleRank(Module node) {
25+
result = locationModuleRank(node) + max(stringModuleRank(_))
26+
or
27+
result = stringModuleRank(node)
28+
}
29+
830
query predicate nodes(Module node, string key, string value) {
931
key = "semmle.label" and value = node.toString()
1032
or
1133
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()
34+
value = moduleRank(node).toString()
2435
}
2536

2637
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

+23-12
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,33 @@
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 = rank[result](Module m | not exists(locationModuleRank(m)) | m order by m.toString())
22+
}
23+
24+
int moduleRank(Module node) {
25+
result = locationModuleRank(node) + max(stringModuleRank(_))
26+
or
27+
result = stringModuleRank(node)
28+
}
29+
830
query predicate nodes(Module node, string key, string value) {
931
key = "semmle.label" and value = node.toString()
1032
or
1133
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()
34+
value = moduleRank(node).toString()
2435
}
2536

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

0 commit comments

Comments
 (0)