Skip to content

Commit aea0c6f

Browse files
authored
Merge pull request #190 from github/aibaars/fix-heredoc-parent
Fix Scope::parentOf for HeredocBody nodes
2 parents 3c80b32 + ce23ae3 commit aea0c6f

8 files changed

Lines changed: 77 additions & 49 deletions

File tree

ql/src/codeql_ruby/ast/Literal.qll

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
private import codeql_ruby.AST
22
private import internal.AST
3+
private import internal.Scope
34
private import internal.TreeSitter
45

56
/**
@@ -559,16 +560,6 @@ class CharacterLiteral extends Literal, TCharacterLiteral {
559560
final override string getAPrimaryQlClass() { result = "CharacterLiteral" }
560561
}
561562

562-
pragma[noinline]
563-
private predicate rankHeredocBody(File f, Generated::HeredocBody b, int i) {
564-
b =
565-
rank[i](Generated::HeredocBody b0 |
566-
f = b0.getLocation().getFile()
567-
|
568-
b0 order by b0.getLocation().getStartLine(), b0.getLocation().getStartColumn()
569-
)
570-
}
571-
572563
/**
573564
* A "here document". For example:
574565
* ```rb
@@ -627,20 +618,8 @@ class HereDoc extends StringlikeLiteral, THereDoc {
627618
)
628619
}
629620

630-
private Generated::HeredocBody getBody() {
631-
exists(int i, File f |
632-
g =
633-
rank[i](Generated::HeredocBeginning b |
634-
f = b.getLocation().getFile()
635-
|
636-
b order by b.getLocation().getStartLine(), b.getLocation().getStartColumn()
637-
) and
638-
rankHeredocBody(f, result, i)
639-
)
640-
}
641-
642621
final override StringComponent getComponent(int n) {
643-
toGenerated(result) = this.getBody().getChild(n)
622+
toGenerated(result) = getHereDocBody(g).getChild(n)
644623
}
645624

646625
final override string toString() { result = g.getValue() }

ql/src/codeql_ruby/ast/internal/Scope.qll

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,31 @@ module ModuleBase {
5959
class Range extends Scope::Range, TypeRange { }
6060
}
6161

62+
pragma[noinline]
63+
private predicate rankHeredocBody(File f, Generated::HeredocBody b, int i) {
64+
b =
65+
rank[i](Generated::HeredocBody b0 |
66+
f = b0.getLocation().getFile()
67+
|
68+
b0 order by b0.getLocation().getStartLine(), b0.getLocation().getStartColumn()
69+
)
70+
}
71+
72+
Generated::HeredocBody getHereDocBody(Generated::HeredocBeginning g) {
73+
exists(int i, File f |
74+
g =
75+
rank[i](Generated::HeredocBeginning b |
76+
f = b.getLocation().getFile()
77+
|
78+
b order by b.getLocation().getStartLine(), b.getLocation().getStartColumn()
79+
) and
80+
rankHeredocBody(f, result, i)
81+
)
82+
}
83+
6284
private Generated::AstNode parentOf(Generated::AstNode n) {
85+
n = getHereDocBody(result)
86+
or
6387
exists(Generated::AstNode parent | parent = n.getParent() |
6488
if
6589
n =

ql/test/library-tests/controlflow/graph/Cfg.expected

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,26 +1295,20 @@ cfg.rb:
12951295
#-----| -> call to puts
12961296

12971297
# 108| <<SQL
1298-
#-----| -> self
1298+
#-----| -> table
12991299

13001300
# 109| #{...}
1301-
#-----| -> self
1301+
#-----| -> type
13021302

1303-
# 109| call to table
1303+
# 109| table
13041304
#-----| -> #{...}
13051305

1306-
# 109| self
1307-
#-----| -> call to table
1308-
13091306
# 110| #{...}
13101307
#-----| -> ( ... )
13111308

1312-
# 110| call to type
1309+
# 110| type
13131310
#-----| -> #{...}
13141311

1315-
# 110| self
1316-
#-----| -> call to type
1317-
13181312
# 113| ... if ...
13191313
#-----| -> @field
13201314

ql/test/library-tests/variables/scopes.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,12 @@ def x.foo
3838
x = 4
3939
end
4040

41+
module M
42+
var = 1
43+
foo = <<-EOF
44+
#{var}
45+
#{fun}
46+
#{var2 = 10}
47+
#{var2}
48+
EOF
49+
end

ql/test/library-tests/variables/ssa.expected

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ definition
4848
| scopes.rb:13:4:13:32 | ... = ... | scopes.rb:13:11:13:11 | c |
4949
| scopes.rb:13:4:13:32 | ... = ... | scopes.rb:13:14:13:14 | d |
5050
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x |
51+
| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var |
52+
| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 |
5153
| ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b |
5254
| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i |
5355
| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i |
@@ -135,6 +137,8 @@ read
135137
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x |
136138
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x |
137139
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x |
140+
| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var |
141+
| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 |
138142
| ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b |
139143
| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i |
140144
| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i |
@@ -210,6 +214,8 @@ firstRead
210214
| scopes.rb:13:4:13:32 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c |
211215
| scopes.rb:13:4:13:32 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d |
212216
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x |
217+
| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var |
218+
| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 |
213219
| ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b |
214220
| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i |
215221
| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i |
@@ -279,6 +285,8 @@ lastRead
279285
| scopes.rb:13:4:13:32 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c |
280286
| scopes.rb:13:4:13:32 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d |
281287
| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x |
288+
| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var |
289+
| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 |
282290
| ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b |
283291
| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i |
284292
| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i |

ql/test/library-tests/variables/varaccess.expected

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,32 +98,37 @@ variableAccess
9898
| scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | scopes.rb:2:9:6:3 | do ... end |
9999
| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | do ... end |
100100
| scopes.rb:5:9:5:9 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | do ... end |
101-
| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
102-
| scopes.rb:8:6:8:6 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
101+
| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
102+
| scopes.rb:8:6:8:6 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
103103
| scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | scopes.rb:9:9:18:3 | do ... end |
104-
| scopes.rb:10:9:10:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
105-
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
106-
| scopes.rb:11:4:11:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
107-
| scopes.rb:12:9:12:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
108-
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
104+
| scopes.rb:10:9:10:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
105+
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
106+
| scopes.rb:11:4:11:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
107+
| scopes.rb:12:9:12:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
108+
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
109109
| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:9:9:18:3 | do ... end |
110110
| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:9:9:18:3 | do ... end |
111111
| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:9:9:18:3 | do ... end |
112-
| scopes.rb:14:9:14:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:40:1 | scopes.rb |
112+
| scopes.rb:14:9:14:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb |
113113
| scopes.rb:15:9:15:9 | b | scopes.rb:13:7:13:7 | b | scopes.rb:9:9:18:3 | do ... end |
114114
| scopes.rb:16:9:16:9 | c | scopes.rb:13:11:13:11 | c | scopes.rb:9:9:18:3 | do ... end |
115115
| scopes.rb:17:9:17:9 | d | scopes.rb:13:14:13:14 | d | scopes.rb:9:9:18:3 | do ... end |
116-
| scopes.rb:24:1:24:6 | script | scopes.rb:24:1:24:6 | script | scopes.rb:1:1:40:1 | scopes.rb |
117-
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:40:1 | scopes.rb |
118-
| scopes.rb:28:8:28:8 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:40:1 | scopes.rb |
116+
| scopes.rb:24:1:24:6 | script | scopes.rb:24:1:24:6 | script | scopes.rb:1:1:49:4 | scopes.rb |
117+
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb |
118+
| scopes.rb:28:8:28:8 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb |
119119
| scopes.rb:29:3:29:3 | x | scopes.rb:29:3:29:3 | x | scopes.rb:28:1:30:3 | B |
120-
| scopes.rb:31:10:31:10 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:40:1 | scopes.rb |
120+
| scopes.rb:31:10:31:10 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb |
121121
| scopes.rb:32:3:32:3 | x | scopes.rb:32:3:32:3 | x | scopes.rb:31:1:33:3 | class << ... |
122-
| scopes.rb:34:7:34:7 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:40:1 | scopes.rb |
123-
| scopes.rb:34:14:34:14 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:40:1 | scopes.rb |
122+
| scopes.rb:34:7:34:7 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb |
123+
| scopes.rb:34:14:34:14 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb |
124124
| scopes.rb:35:3:35:3 | x | scopes.rb:35:3:35:3 | x | scopes.rb:34:1:36:3 | C |
125-
| scopes.rb:37:5:37:5 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:40:1 | scopes.rb |
125+
| scopes.rb:37:5:37:5 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb |
126126
| scopes.rb:38:3:38:3 | x | scopes.rb:38:3:38:3 | x | scopes.rb:37:1:39:3 | foo |
127+
| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:41:1:49:3 | M |
128+
| scopes.rb:43:2:43:4 | foo | scopes.rb:43:2:43:4 | foo | scopes.rb:41:1:49:3 | M |
129+
| scopes.rb:44:5:44:7 | var | scopes.rb:42:2:42:4 | var | scopes.rb:41:1:49:3 | M |
130+
| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:41:1:49:3 | M |
131+
| scopes.rb:47:5:47:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:41:1:49:3 | M |
127132
| ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:1:1:16:3 | m |
128133
| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:1:1:16:3 | m |
129134
| ssa.rb:3:8:3:8 | i | ssa.rb:2:3:2:3 | i | ssa.rb:1:1:16:3 | m |
@@ -221,6 +226,9 @@ explicitWrite
221226
| scopes.rb:32:3:32:3 | x | scopes.rb:32:3:32:7 | ... = ... |
222227
| scopes.rb:35:3:35:3 | x | scopes.rb:35:3:35:7 | ... = ... |
223228
| scopes.rb:38:3:38:3 | x | scopes.rb:38:3:38:7 | ... = ... |
229+
| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:9 | ... = ... |
230+
| scopes.rb:43:2:43:4 | foo | scopes.rb:43:2:43:13 | ... = ... |
231+
| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:13 | ... = ... |
224232
| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:7 | ... = ... |
225233
| ssa.rb:6:5:6:5 | i | ssa.rb:6:5:6:9 | ... = ... |
226234
| ssa.rb:10:5:10:5 | i | ssa.rb:10:5:10:9 | ... = ... |
@@ -336,6 +344,8 @@ readAccess
336344
| scopes.rb:34:7:34:7 | x |
337345
| scopes.rb:34:14:34:14 | x |
338346
| scopes.rb:37:5:37:5 | x |
347+
| scopes.rb:44:5:44:7 | var |
348+
| scopes.rb:47:5:47:8 | var2 |
339349
| ssa.rb:3:8:3:8 | i |
340350
| ssa.rb:4:8:4:8 | i |
341351
| ssa.rb:5:6:5:6 | b |

ql/test/library-tests/variables/variable.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
| scopes.rb:32:3:32:3 | x |
6464
| scopes.rb:35:3:35:3 | x |
6565
| scopes.rb:38:3:38:3 | x |
66+
| scopes.rb:42:2:42:4 | var |
67+
| scopes.rb:43:2:43:4 | foo |
68+
| scopes.rb:46:5:46:8 | var2 |
6669
| ssa.rb:1:7:1:7 | b |
6770
| ssa.rb:2:3:2:3 | i |
6871
| ssa.rb:18:8:18:8 | x |

ql/test/library-tests/variables/varscopes.expected

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,15 @@
4646
| parameters.rb:49:1:51:3 | tuples |
4747
| parameters.rb:54:9:57:3 | do ... end |
4848
| scopes.rb:1:1:1:15 | a |
49-
| scopes.rb:1:1:40:1 | scopes.rb |
49+
| scopes.rb:1:1:49:4 | scopes.rb |
5050
| scopes.rb:2:9:6:3 | do ... end |
5151
| scopes.rb:9:9:18:3 | do ... end |
5252
| scopes.rb:26:1:26:12 | A |
5353
| scopes.rb:28:1:30:3 | B |
5454
| scopes.rb:31:1:33:3 | class << ... |
5555
| scopes.rb:34:1:36:3 | C |
5656
| scopes.rb:37:1:39:3 | foo |
57+
| scopes.rb:41:1:49:3 | M |
5758
| ssa.rb:1:1:16:3 | m |
5859
| ssa.rb:1:1:88:3 | ssa.rb |
5960
| ssa.rb:18:1:23:3 | m1 |

0 commit comments

Comments
 (0)