diff --git a/ql/src/codeql_ruby/ast/Call.qll b/ql/src/codeql_ruby/ast/Call.qll index 38d569e2021..c360677c065 100644 --- a/ql/src/codeql_ruby/ast/Call.qll +++ b/ql/src/codeql_ruby/ast/Call.qll @@ -83,6 +83,18 @@ class Call extends Expr { final Block getBlock() { result = range.getBlock() } } +/** + * An element reference; a call to the `[]` method. + * ```rb + * a[0] + * ``` + */ +class ElementReference extends Call, @element_reference { + final override ElementReference::Range range; + + final override string getAPrimaryQlClass() { result = "ElementReference" } +} + /** * A call to `yield`. * ```rb diff --git a/ql/src/codeql_ruby/ast/internal/AST.qll b/ql/src/codeql_ruby/ast/internal/AST.qll index 618aea0313a..9b64b14af6f 100644 --- a/ql/src/codeql_ruby/ast/internal/AST.qll +++ b/ql/src/codeql_ruby/ast/internal/AST.qll @@ -49,8 +49,6 @@ module AstNode { or this instanceof Generated::Array or - this instanceof Generated::ElementReference - or this instanceof Generated::Complex or this instanceof Generated::Character diff --git a/ql/src/codeql_ruby/ast/internal/Call.qll b/ql/src/codeql_ruby/ast/internal/Call.qll index 5d72f9c62b6..b8eb59965d6 100644 --- a/ql/src/codeql_ruby/ast/internal/Call.qll +++ b/ql/src/codeql_ruby/ast/internal/Call.qll @@ -13,7 +13,7 @@ module Call { abstract Block getBlock(); - final override string toString() { result = "call to " + this.getMethodName() } + override string toString() { result = "call to " + this.getMethodName() } } private class IdentifierCallRange extends Call::Range, @token_identifier { @@ -71,6 +71,22 @@ module Call { } } +module ElementReference { + class Range extends Call::Range, @element_reference { + final override Generated::ElementReference generated; + + final override Expr getReceiver() { result = generated.getObject() } + + final override string getMethodName() { result = "[]" } + + final override string toString() { result = "...[...]" } + + final override Expr getArgument(int n) { result = generated.getChild(n) } + + final override Block getBlock() { none() } + } +} + module YieldCall { class Range extends Call::Range, @yield { final override Generated::Yield generated; diff --git a/ql/test/library-tests/ast/calls/calls.expected b/ql/test/library-tests/ast/calls/calls.expected index 813b19f1ba8..0c6f5d2256e 100644 --- a/ql/test/library-tests/ast/calls/calls.expected +++ b/ql/test/library-tests/ast/calls/calls.expected @@ -84,6 +84,8 @@ callsWithArguments | calls.rb:36:3:36:16 | call to yield | yield | 1 | calls.rb:36:14:36:16 | 200 | | calls.rb:54:1:54:14 | call to some_func | some_func | 0 | calls.rb:54:11:54:13 | call to foo | | calls.rb:55:1:55:17 | call to some_func | some_func | 0 | calls.rb:55:11:55:16 | call to foo | +| calls.rb:234:1:234:8 | ...[...] | [] | 0 | calls.rb:234:5:234:7 | call to bar | +| calls.rb:235:1:235:14 | ...[...] | [] | 0 | calls.rb:235:8:235:13 | call to bar | | calls.rb:266:1:266:9 | call to foo | foo | 0 | calls.rb:266:5:266:8 | &... | | calls.rb:267:1:267:12 | call to foo | foo | 0 | calls.rb:267:5:267:11 | &... | | calls.rb:270:1:270:9 | call to foo | foo | 0 | calls.rb:270:5:270:8 | *... | @@ -156,7 +158,9 @@ callsWithReceiver | calls.rb:223:14:223:19 | call to foo | calls.rb:223:14:223:14 | X | | calls.rb:229:10:229:15 | call to bar | calls.rb:229:10:229:10 | X | | calls.rb:230:3:230:8 | call to baz | calls.rb:230:3:230:3 | X | +| calls.rb:234:1:234:8 | ...[...] | calls.rb:234:1:234:3 | call to foo | | calls.rb:235:1:235:6 | call to foo | calls.rb:235:1:235:1 | X | +| calls.rb:235:1:235:14 | ...[...] | calls.rb:235:1:235:6 | call to foo | | calls.rb:235:8:235:13 | call to bar | calls.rb:235:8:235:8 | X | | calls.rb:238:15:238:20 | call to baz | calls.rb:238:15:238:15 | X | | calls.rb:242:1:242:6 | call to foo | calls.rb:242:1:242:1 | X | diff --git a/ql/test/library-tests/controlflow/graph/Cfg.expected b/ql/test/library-tests/controlflow/graph/Cfg.expected index 98762e036bd..afdc353a404 100644 --- a/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -1038,14 +1038,14 @@ cfg.rb: # 68| puts #-----| -> items -# 68| ElementReference +# 68| ...[...] #-----| -> call to puts # 68| items #-----| -> 2 # 68| 2 -#-----| -> ElementReference +#-----| -> ...[...] # 69| print #-----| -> 42 @@ -1298,14 +1298,14 @@ cfg.rb: # 103| return #-----| return -> exit parameters (normal) -# 103| ElementReference +# 103| ...[...] #-----| -> return # 103| kwargs #-----| -> key # 103| key -#-----| -> ElementReference +#-----| -> ...[...] # 106| ... = ... #-----| -> food