Skip to content

Commit f83d2a7

Browse files
committed
Ruby: Avoid using toString where possible
1 parent ac1ebf2 commit f83d2a7

File tree

4 files changed

+84
-32
lines changed

4 files changed

+84
-32
lines changed

ruby/ql/src/utils/modeleditor/FrameworkModeAccessPaths.ql

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,38 @@
77
*/
88

99
private import ruby
10+
private import codeql.ruby.AST
1011
private import codeql.ruby.ApiGraphs
1112
private import queries.modeling.internal.Util as Util
1213

14+
string parameterDetails(DataFlow::ParameterNode paramNode) {
15+
exists(DataFlow::MethodNode methodNode | methodNode.getParameter(_) = paramNode |
16+
result = paramNode.getName()
17+
)
18+
or
19+
exists(DataFlow::MethodNode methodNode, string name |
20+
methodNode.getKeywordParameter(name) = paramNode
21+
|
22+
result = name + ":"
23+
)
24+
or
25+
exists(DataFlow::MethodNode methodNode | methodNode.getBlockParameter() = paramNode |
26+
result = "&" + paramNode.getName()
27+
or
28+
not exists(paramNode.getName()) and result = "&"
29+
)
30+
or
31+
exists(DataFlow::MethodNode methodNode | methodNode.getSelfParameter() = paramNode |
32+
result = "self"
33+
)
34+
or
35+
exists(DataFlow::MethodNode methodNode | methodNode.getHashSplatParameter() = paramNode |
36+
result = "**" + paramNode.getName()
37+
or
38+
not exists(paramNode.getName()) and result = "**"
39+
)
40+
}
41+
1342
predicate simpleParameters(string type, string path, string value, string details) {
1443
exists(DataFlow::MethodNode methodNode, DataFlow::ParameterNode paramNode |
1544
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
@@ -23,7 +52,7 @@ predicate simpleParameters(string type, string path, string value, string detail
2352
|
2453
Util::pathToMethod(methodNode, type, path) and
2554
value = Util::getArgumentPath(paramNode) and
26-
details = paramNode.toString()
55+
details = parameterDetails(paramNode)
2756
)
2857
}
2958

@@ -33,9 +62,11 @@ predicate blockArguments(string type, string path, string value, string details)
3362
callNode = methodNode.getABlockCall()
3463
|
3564
(
36-
exists(DataFlow::ExprNode argNode, int i | argNode = callNode.getPositionalArgument(i) |
65+
exists(DataFlow::VariableAccessNode argNode, int i |
66+
argNode = callNode.getPositionalArgument(i)
67+
|
3768
value = "Argument[block].Parameter[" + i + "]" and
38-
details = argNode.toString()
69+
details = argNode.asVariableAccessAstNode().getVariable().getName()
3970
)
4071
or
4172
exists(DataFlow::ExprNode argNode, string keyword |
@@ -45,7 +76,14 @@ predicate blockArguments(string type, string path, string value, string details)
4576
details = ":" + keyword
4677
)
4778
or
48-
value = "Argument[block]" and details = callNode.toString()
79+
value = "Argument[block]" and
80+
(
81+
details = callNode.getMethodName()
82+
or
83+
not exists(callNode.getMethodName()) and
84+
callNode.getExprNode().getExpr() instanceof YieldCall and
85+
details = "yield ..."
86+
)
4987
) and
5088
Util::pathToMethod(methodNode, type, path)
5189
)
Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,69 @@
11
input
22
| A | Method[bar] | Argument[0] | x | parameter |
3-
| A | Method[bar] | Argument[self] | self in bar | parameter |
3+
| A | Method[bar] | Argument[self] | self | parameter |
44
| A | Method[foo] | Argument[0] | x | parameter |
55
| A | Method[foo] | Argument[1] | y | parameter |
6-
| A | Method[foo] | Argument[2] | key1 | parameter |
7-
| A | Method[foo] | Argument[key1:] | key1 | parameter |
8-
| A | Method[foo] | Argument[self] | self in foo | parameter |
6+
| A | Method[foo] | Argument[2] | key1: | parameter |
7+
| A | Method[foo] | Argument[block] | call | parameter |
8+
| A | Method[foo] | Argument[block] | yield ... | parameter |
9+
| A | Method[foo] | Argument[block].Parameter[0] | x | parameter |
10+
| A | Method[foo] | Argument[block].Parameter[1] | y | parameter |
11+
| A | Method[foo] | Argument[block].Parameter[key2:] | :key2 | parameter |
12+
| A | Method[foo] | Argument[key1:] | key1: | parameter |
13+
| A | Method[foo] | Argument[self] | self | parameter |
914
| A! | Method[new] | Argument[0] | x | parameter |
1015
| A! | Method[new] | Argument[1] | y | parameter |
11-
| A! | Method[new] | Argument[self] | self in initialize | parameter |
16+
| A! | Method[new] | Argument[self] | self | parameter |
1217
| A! | Method[self_foo] | Argument[0] | x | parameter |
1318
| A! | Method[self_foo] | Argument[1] | y | parameter |
14-
| A! | Method[self_foo] | Argument[self] | self in self_foo | parameter |
19+
| A! | Method[self_foo] | Argument[self] | self | parameter |
1520
| A::ANested | Method[foo] | Argument[0] | x | parameter |
1621
| A::ANested | Method[foo] | Argument[1] | y | parameter |
17-
| A::ANested | Method[foo] | Argument[self] | self in foo | parameter |
22+
| A::ANested | Method[foo] | Argument[self] | self | parameter |
1823
| B | Method[foo] | Argument[0] | x | parameter |
1924
| B | Method[foo] | Argument[1] | y | parameter |
20-
| B | Method[foo] | Argument[self] | self in foo | parameter |
25+
| B | Method[foo] | Argument[self] | self | parameter |
2126
| M1 | Method[foo] | Argument[0] | x | parameter |
2227
| M1 | Method[foo] | Argument[1] | y | parameter |
23-
| M1 | Method[foo] | Argument[self] | self in foo | parameter |
28+
| M1 | Method[foo] | Argument[self] | self | parameter |
2429
| M1! | Method[self_foo] | Argument[0] | x | parameter |
2530
| M1! | Method[self_foo] | Argument[1] | y | parameter |
26-
| M1! | Method[self_foo] | Argument[self] | self in self_foo | parameter |
31+
| M1! | Method[self_foo] | Argument[self] | self | parameter |
2732
| OtherLib::A | Method[foo] | Argument[0] | x | parameter |
2833
| OtherLib::A | Method[foo] | Argument[1] | y | parameter |
29-
| OtherLib::A | Method[foo] | Argument[self] | self in foo | parameter |
34+
| OtherLib::A | Method[foo] | Argument[self] | self | parameter |
3035
output
3136
| A | Method[bar] | Argument[0] | x | parameter |
32-
| A | Method[bar] | Argument[self] | self in bar | parameter |
37+
| A | Method[bar] | Argument[self] | self | parameter |
3338
| A | Method[foo] | Argument[0] | x | parameter |
3439
| A | Method[foo] | Argument[1] | y | parameter |
35-
| A | Method[foo] | Argument[2] | key1 | parameter |
36-
| A | Method[foo] | Argument[key1:] | key1 | parameter |
37-
| A | Method[foo] | Argument[self] | self in foo | parameter |
40+
| A | Method[foo] | Argument[2] | key1: | parameter |
41+
| A | Method[foo] | Argument[block] | call | parameter |
42+
| A | Method[foo] | Argument[block] | yield ... | parameter |
43+
| A | Method[foo] | Argument[block].Parameter[0] | x | parameter |
44+
| A | Method[foo] | Argument[block].Parameter[1] | y | parameter |
45+
| A | Method[foo] | Argument[block].Parameter[key2:] | :key2 | parameter |
46+
| A | Method[foo] | Argument[key1:] | key1: | parameter |
47+
| A | Method[foo] | Argument[self] | self | parameter |
48+
| A | Method[foo] | ReturnValue | yield ... | return |
3849
| A! | Method[new] | Argument[0] | x | parameter |
3950
| A! | Method[new] | Argument[1] | y | parameter |
40-
| A! | Method[new] | Argument[self] | self in initialize | parameter |
51+
| A! | Method[new] | Argument[self] | self | parameter |
4152
| A! | Method[self_foo] | Argument[0] | x | parameter |
4253
| A! | Method[self_foo] | Argument[1] | y | parameter |
43-
| A! | Method[self_foo] | Argument[self] | self in self_foo | parameter |
54+
| A! | Method[self_foo] | Argument[self] | self | parameter |
4455
| A::ANested | Method[foo] | Argument[0] | x | parameter |
4556
| A::ANested | Method[foo] | Argument[1] | y | parameter |
46-
| A::ANested | Method[foo] | Argument[self] | self in foo | parameter |
57+
| A::ANested | Method[foo] | Argument[self] | self | parameter |
4758
| B | Method[foo] | Argument[0] | x | parameter |
4859
| B | Method[foo] | Argument[1] | y | parameter |
49-
| B | Method[foo] | Argument[self] | self in foo | parameter |
60+
| B | Method[foo] | Argument[self] | self | parameter |
5061
| M1 | Method[foo] | Argument[0] | x | parameter |
5162
| M1 | Method[foo] | Argument[1] | y | parameter |
52-
| M1 | Method[foo] | Argument[self] | self in foo | parameter |
63+
| M1 | Method[foo] | Argument[self] | self | parameter |
5364
| M1! | Method[self_foo] | Argument[0] | x | parameter |
5465
| M1! | Method[self_foo] | Argument[1] | y | parameter |
55-
| M1! | Method[self_foo] | Argument[self] | self in self_foo | parameter |
66+
| M1! | Method[self_foo] | Argument[self] | self | parameter |
5667
| OtherLib::A | Method[foo] | Argument[0] | x | parameter |
5768
| OtherLib::A | Method[foo] | Argument[1] | y | parameter |
58-
| OtherLib::A | Method[foo] | Argument[self] | self in foo | parameter |
69+
| OtherLib::A | Method[foo] | Argument[self] | self | parameter |

ruby/ql/test/query-tests/utils/modeleditor/FrameworkModeEndpoints.expected

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
| lib/module.rb:1:1:7:3 | M1 | mylib | M1 | | | false | module.rb | |
22
| lib/module.rb:2:3:3:5 | foo | mylib | M1 | foo | (x,y) | false | module.rb | |
33
| lib/module.rb:5:3:6:5 | self_foo | mylib | M1! | self_foo | (x,y) | false | module.rb | |
4-
| lib/mylib.rb:3:1:30:3 | A | mylib | A | | | false | mylib.rb | |
4+
| lib/mylib.rb:3:1:33:3 | A | mylib | A | | | false | mylib.rb | |
55
| lib/mylib.rb:4:3:5:5 | initialize | mylib | A! | new | (x,y) | false | mylib.rb | |
6-
| lib/mylib.rb:7:3:8:5 | foo | mylib | A | foo | (x,y,key1:) | false | mylib.rb | |
7-
| lib/mylib.rb:10:3:11:5 | bar | mylib | A | bar | (x) | false | mylib.rb | |
8-
| lib/mylib.rb:13:3:14:5 | self_foo | mylib | A! | self_foo | (x,y) | false | mylib.rb | |
9-
| lib/mylib.rb:21:3:29:5 | ANested | mylib | A::ANested | | | false | mylib.rb | |
10-
| lib/mylib.rb:22:5:23:7 | foo | mylib | A::ANested | foo | (x,y) | false | mylib.rb | |
6+
| lib/mylib.rb:7:3:11:5 | foo | mylib | A | foo | (x,y,key1:) | false | mylib.rb | |
7+
| lib/mylib.rb:13:3:14:5 | bar | mylib | A | bar | (x) | false | mylib.rb | |
8+
| lib/mylib.rb:16:3:17:5 | self_foo | mylib | A! | self_foo | (x,y) | false | mylib.rb | |
9+
| lib/mylib.rb:24:3:32:5 | ANested | mylib | A::ANested | | | false | mylib.rb | |
10+
| lib/mylib.rb:25:5:26:7 | foo | mylib | A::ANested | foo | (x,y) | false | mylib.rb | |
1111
| lib/other.rb:3:1:8:3 | B | mylib | B | | | false | other.rb | |
1212
| lib/other.rb:6:3:7:5 | foo | mylib | B | foo | (x,y) | false | other.rb | |
1313
| lib/other.rb:10:1:12:3 | C | mylib | C | | | false | other.rb | |

ruby/ql/test/query-tests/utils/modeleditor/lib/mylib.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ def initialize(x, y)
55
end
66

77
def foo(x, y, key1:, **kwargs, &block)
8+
block.call(x, y, key2: key1)
9+
10+
yield x, y, key2: key1
811
end
912

1013
def bar(x, *args)

0 commit comments

Comments
 (0)