From 015b581f57af7a39949003231bbb6f882eecdeb8 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Fri, 12 Feb 2021 14:29:34 +0100 Subject: [PATCH] AST: add redo, retry, empty-statement --- ql/src/codeql_ruby/ast/Statement.qll | 33 +++++++++++++++++++ ql/src/codeql_ruby/ast/internal/AST.qll | 4 --- ql/src/codeql_ruby/ast/internal/Statement.qll | 24 ++++++++++++++ .../controlflow/graph/Cfg.expected | 8 ++--- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/ql/src/codeql_ruby/ast/Statement.qll b/ql/src/codeql_ruby/ast/Statement.qll index d9c284a416d..34e9481acd1 100644 --- a/ql/src/codeql_ruby/ast/Statement.qll +++ b/ql/src/codeql_ruby/ast/Statement.qll @@ -25,6 +25,15 @@ class Stmt extends AstNode { Callable getEnclosingCallable() { result = this.getCfgScope() } } +/** + * An empty statement (`;`). + */ +class EmptyStmt extends Stmt, @token_empty_statement { + final override EmptyStmt::Range range; + + final override string getAPrimaryQlClass() { result = "EmptyStmt" } +} + /** * A statement that may return a value: `return`, `break` and `next`. * @@ -82,3 +91,27 @@ class NextStmt extends ReturningStmt, @next { final override string getAPrimaryQlClass() { result = "NextStmt" } } + +/** + * A `redo` statement. + * ```rb + * redo + * ``` + */ +class RedoStmt extends Stmt, @redo { + final override RedoStmt::Range range; + + final override string getAPrimaryQlClass() { result = "RedoStmt" } +} + +/** + * A `retry` statement. + * ```rb + * retry + * ``` + */ +class RetryStmt extends Stmt, @retry { + final override RetryStmt::Range range; + + final override string getAPrimaryQlClass() { result = "RetryStmt" } +} diff --git a/ql/src/codeql_ruby/ast/internal/AST.qll b/ql/src/codeql_ruby/ast/internal/AST.qll index 38df294bf98..d39febed38d 100644 --- a/ql/src/codeql_ruby/ast/internal/AST.qll +++ b/ql/src/codeql_ruby/ast/internal/AST.qll @@ -51,10 +51,6 @@ module AstNode { or this instanceof Generated::Superclass or - this instanceof Generated::EmptyStatement - or - this instanceof Generated::Redo - or this instanceof Generated::Hash or this instanceof Generated::Array diff --git a/ql/src/codeql_ruby/ast/internal/Statement.qll b/ql/src/codeql_ruby/ast/internal/Statement.qll index b4fa88ce159..d9a5c9b294b 100644 --- a/ql/src/codeql_ruby/ast/internal/Statement.qll +++ b/ql/src/codeql_ruby/ast/internal/Statement.qll @@ -6,6 +6,14 @@ module Stmt { abstract class Range extends AstNode::Range { } } +module EmptyStmt { + class Range extends Stmt::Range, @token_empty_statement { + final override Generated::EmptyStatement generated; + + final override string toString() { result = ";" } + } +} + module ReturningStmt { abstract class Range extends Stmt::Range { abstract Generated::ArgumentList getArgumentList(); @@ -51,3 +59,19 @@ module NextStmt { final override Generated::ArgumentList getArgumentList() { result = generated.getChild() } } } + +module RedoStmt { + class Range extends Stmt::Range, @redo { + final override Generated::Redo generated; + + final override string toString() { result = "redo" } + } +} + +module RetryStmt { + class Range extends Stmt::Range, @retry { + final override Generated::Retry generated; + + final override string toString() { result = "retry" } + } +} diff --git a/ql/test/library-tests/controlflow/graph/Cfg.expected b/ql/test/library-tests/controlflow/graph/Cfg.expected index ced2fa6d3cb..610ff396d78 100644 --- a/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -1973,7 +1973,7 @@ cfg.rb: # 181| ... == ... #-----| false -> if ... -#-----| true -> Redo +#-----| true -> redo # 181| x #-----| -> 5 @@ -1981,7 +1981,7 @@ cfg.rb: # 181| 5 #-----| -> ... == ... -# 181| Redo +# 181| redo #-----| redo -> x # 182| call to puts @@ -2651,7 +2651,7 @@ loops.rb: # 16| ... > ... #-----| false -> elsif ... -#-----| true -> Redo +#-----| true -> redo # 16| x #-----| -> 10 @@ -2659,7 +2659,7 @@ loops.rb: # 16| 10 #-----| -> ... > ... -# 17| Redo +# 17| redo #-----| redo -> puts # 19| call to puts