diff --git a/ql/src/codeql_ruby/ast/Control.qll b/ql/src/codeql_ruby/ast/Control.qll index 5f2eaf0e8ee..1b3d1c752a1 100644 --- a/ql/src/codeql_ruby/ast/Control.qll +++ b/ql/src/codeql_ruby/ast/Control.qll @@ -40,10 +40,23 @@ class ConditionalExpr extends Expr { /** * An `if` or `elsif` expression. + * ```rb + * if x + * a += 1 + * elsif y + * a += 2 + * end * ``` */ -class IfOrElsifExpr extends ConditionalExpr { - override IfOrElsifExpr::Range range; +class IfExpr extends ConditionalExpr { + override IfExpr::Range range; + + final override string getAPrimaryQlClass() { result = "IfExpr" } + + final override string toString() { if isElsif() then result = "elsif ..." else result = "if ..." } + + /** Holds if this is an `elsif` expression. */ + final predicate isElsif() { this instanceof @elsif } /** Gets the 'then' branch of this `if`/`elsif` expression. */ final ExprSequence getThen() { result = range.getThen() } @@ -82,40 +95,6 @@ class IfOrElsifExpr extends ConditionalExpr { final Expr getElse() { result = range.getElse() } } -/** - * An `if` expression. - * ```rb - * if x - * y += 1 - * end - * ``` - */ -class IfExpr extends IfOrElsifExpr, @if { - final override IfExpr::Range range; - - final override string getAPrimaryQlClass() { result = "IfExpr" } - - final override string toString() { result = "if ..." } -} - -/** - * An `elsif` expression. - * ```rb - * if x - * a += 1 - * elsif y - * a += 2 - * end - * ``` - */ -class ElsifExpr extends IfOrElsifExpr, @elsif { - final override ElsifExpr::Range range; - - final override string getAPrimaryQlClass() { result = "ElsifExpr" } - - final override string toString() { result = "elsif ..." } -} - /** * An `unless` expression. * ```rb diff --git a/ql/src/codeql_ruby/ast/internal/Control.qll b/ql/src/codeql_ruby/ast/internal/Control.qll index 1da797b7668..7e4164a999b 100644 --- a/ql/src/codeql_ruby/ast/internal/Control.qll +++ b/ql/src/codeql_ruby/ast/internal/Control.qll @@ -15,16 +15,14 @@ module ConditionalExpr { } } -module IfOrElsifExpr { +module IfExpr { abstract class Range extends ConditionalExpr::Range { - abstract Expr getThen(); + abstract ExprSequence getThen(); abstract Expr getElse(); } -} -module IfExpr { - class Range extends IfOrElsifExpr::Range, @if { + private class IfRange extends IfExpr::Range, @if { final override Generated::If generated; final override Expr getCondition() { result = generated.getCondition() } @@ -39,10 +37,8 @@ module IfExpr { cond = false and result = getElse() } } -} -module ElsifExpr { - class Range extends IfOrElsifExpr::Range, @elsif { + private class ElsifRange extends IfExpr::Range, @elsif { final override Generated::Elsif generated; final override Expr getCondition() { result = generated.getCondition() } diff --git a/ql/test/library-tests/ast/control/ConditionalExpr.expected b/ql/test/library-tests/ast/control/ConditionalExpr.expected index 9dc6fca0a40..6d60d833215 100644 --- a/ql/test/library-tests/ast/control/ConditionalExpr.expected +++ b/ql/test/library-tests/ast/control/ConditionalExpr.expected @@ -4,13 +4,13 @@ conditionalExprs | conditionals.rb:15:1:19:3 | if ... | IfExpr | conditionals.rb:15:4:15:9 | ... == ... | conditionals.rb:17:1:18:5 | ...; ... | false | | conditionals.rb:22:1:30:3 | if ... | IfExpr | conditionals.rb:22:4:22:9 | ... == ... | conditionals.rb:22:11:23:5 | ...; ... | true | | conditionals.rb:22:1:30:3 | if ... | IfExpr | conditionals.rb:22:4:22:9 | ... == ... | conditionals.rb:24:1:29:5 | elsif ... | false | -| conditionals.rb:24:1:29:5 | elsif ... | ElsifExpr | conditionals.rb:24:7:24:12 | ... == ... | conditionals.rb:24:14:25:5 | ...; ... | true | -| conditionals.rb:24:1:29:5 | elsif ... | ElsifExpr | conditionals.rb:24:7:24:12 | ... == ... | conditionals.rb:26:1:29:5 | elsif ... | false | -| conditionals.rb:26:1:29:5 | elsif ... | ElsifExpr | conditionals.rb:26:7:26:12 | ... == ... | conditionals.rb:26:14:27:5 | ...; ... | true | -| conditionals.rb:26:1:29:5 | elsif ... | ElsifExpr | conditionals.rb:26:7:26:12 | ... == ... | conditionals.rb:28:1:29:5 | ...; ... | false | +| conditionals.rb:24:1:29:5 | elsif ... | IfExpr | conditionals.rb:24:7:24:12 | ... == ... | conditionals.rb:24:14:25:5 | ...; ... | true | +| conditionals.rb:24:1:29:5 | elsif ... | IfExpr | conditionals.rb:24:7:24:12 | ... == ... | conditionals.rb:26:1:29:5 | elsif ... | false | +| conditionals.rb:26:1:29:5 | elsif ... | IfExpr | conditionals.rb:26:7:26:12 | ... == ... | conditionals.rb:26:14:27:5 | ...; ... | true | +| conditionals.rb:26:1:29:5 | elsif ... | IfExpr | conditionals.rb:26:7:26:12 | ... == ... | conditionals.rb:28:1:29:5 | ...; ... | false | | conditionals.rb:33:1:37:3 | if ... | IfExpr | conditionals.rb:33:4:33:9 | ... == ... | conditionals.rb:33:10:34:5 | ...; ... | true | | conditionals.rb:33:1:37:3 | if ... | IfExpr | conditionals.rb:33:4:33:9 | ... == ... | conditionals.rb:35:1:36:5 | elsif ... | false | -| conditionals.rb:35:1:36:5 | elsif ... | ElsifExpr | conditionals.rb:35:7:35:12 | ... == ... | conditionals.rb:35:13:36:5 | ...; ... | true | +| conditionals.rb:35:1:36:5 | elsif ... | IfExpr | conditionals.rb:35:7:35:12 | ... == ... | conditionals.rb:35:13:36:5 | ...; ... | true | | conditionals.rb:40:1:42:3 | unless ... | UnlessExpr | conditionals.rb:40:8:40:12 | ... > ... | conditionals.rb:40:14:41:5 | ...; ... | false | | conditionals.rb:45:1:49:3 | unless ... | UnlessExpr | conditionals.rb:45:8:45:13 | ... == ... | conditionals.rb:45:14:46:5 | ...; ... | false | | conditionals.rb:45:1:49:3 | unless ... | UnlessExpr | conditionals.rb:45:8:45:13 | ... == ... | conditionals.rb:47:1:48:5 | ...; ... | true | @@ -18,14 +18,14 @@ conditionalExprs | conditionals.rb:55:1:55:18 | ... unless ... | UnlessModifierExpr | conditionals.rb:55:14:55:18 | ... < ... | conditionals.rb:55:1:55:5 | ... = ... | false | | conditionals.rb:58:5:58:25 | ... ? ... : ... | TernaryIfExpr | conditionals.rb:58:5:58:9 | ... > ... | conditionals.rb:58:13:58:17 | ... + ... | true | | conditionals.rb:58:5:58:25 | ... ? ... : ... | TernaryIfExpr | conditionals.rb:58:5:58:9 | ... > ... | conditionals.rb:58:21:58:25 | ... - ... | false | -ifOrElsifExprs -| conditionals.rb:10:1:12:3 | if ... | IfExpr | conditionals.rb:10:4:10:8 | ... > ... | conditionals.rb:10:10:11:5 | ...; ... | (none) | -| conditionals.rb:15:1:19:3 | if ... | IfExpr | conditionals.rb:15:4:15:9 | ... == ... | conditionals.rb:15:10:16:5 | ...; ... | ...; ... | -| conditionals.rb:22:1:30:3 | if ... | IfExpr | conditionals.rb:22:4:22:9 | ... == ... | conditionals.rb:22:11:23:5 | ...; ... | elsif ... | -| conditionals.rb:24:1:29:5 | elsif ... | ElsifExpr | conditionals.rb:24:7:24:12 | ... == ... | conditionals.rb:24:14:25:5 | ...; ... | elsif ... | -| conditionals.rb:26:1:29:5 | elsif ... | ElsifExpr | conditionals.rb:26:7:26:12 | ... == ... | conditionals.rb:26:14:27:5 | ...; ... | ...; ... | -| conditionals.rb:33:1:37:3 | if ... | IfExpr | conditionals.rb:33:4:33:9 | ... == ... | conditionals.rb:33:10:34:5 | ...; ... | elsif ... | -| conditionals.rb:35:1:36:5 | elsif ... | ElsifExpr | conditionals.rb:35:7:35:12 | ... == ... | conditionals.rb:35:13:36:5 | ...; ... | (none) | +ifExprs +| conditionals.rb:10:1:12:3 | if ... | IfExpr | conditionals.rb:10:4:10:8 | ... > ... | conditionals.rb:10:10:11:5 | ...; ... | (none) | false | +| conditionals.rb:15:1:19:3 | if ... | IfExpr | conditionals.rb:15:4:15:9 | ... == ... | conditionals.rb:15:10:16:5 | ...; ... | ...; ... | false | +| conditionals.rb:22:1:30:3 | if ... | IfExpr | conditionals.rb:22:4:22:9 | ... == ... | conditionals.rb:22:11:23:5 | ...; ... | elsif ... | false | +| conditionals.rb:24:1:29:5 | elsif ... | IfExpr | conditionals.rb:24:7:24:12 | ... == ... | conditionals.rb:24:14:25:5 | ...; ... | elsif ... | true | +| conditionals.rb:26:1:29:5 | elsif ... | IfExpr | conditionals.rb:26:7:26:12 | ... == ... | conditionals.rb:26:14:27:5 | ...; ... | ...; ... | true | +| conditionals.rb:33:1:37:3 | if ... | IfExpr | conditionals.rb:33:4:33:9 | ... == ... | conditionals.rb:33:10:34:5 | ...; ... | elsif ... | false | +| conditionals.rb:35:1:36:5 | elsif ... | IfExpr | conditionals.rb:35:7:35:12 | ... == ... | conditionals.rb:35:13:36:5 | ...; ... | (none) | true | unlessExprs | conditionals.rb:40:1:42:3 | unless ... | UnlessExpr | conditionals.rb:40:8:40:12 | ... > ... | conditionals.rb:40:14:41:5 | ...; ... | (none) | | conditionals.rb:45:1:49:3 | unless ... | UnlessExpr | conditionals.rb:45:8:45:13 | ... == ... | conditionals.rb:45:14:46:5 | ...; ... | ...; ... | diff --git a/ql/test/library-tests/ast/control/ConditionalExpr.ql b/ql/test/library-tests/ast/control/ConditionalExpr.ql index 7b139735537..48c1e2630c9 100644 --- a/ql/test/library-tests/ast/control/ConditionalExpr.ql +++ b/ql/test/library-tests/ast/control/ConditionalExpr.ql @@ -8,13 +8,14 @@ query predicate conditionalExprs( branch = e.getBranch(branchCond) } -query predicate ifOrElsifExprs( - IfOrElsifExpr e, string pClass, Expr cond, ExprSequence thenExpr, string elseStr +query predicate ifExprs( + IfExpr e, string pClass, Expr cond, ExprSequence thenExpr, string elseStr, boolean isElsif ) { pClass = e.getAPrimaryQlClass() and cond = e.getCondition() and thenExpr = e.getThen() and - if exists(e.getElse()) then elseStr = e.getElse().toString() else elseStr = "(none)" + (if exists(e.getElse()) then elseStr = e.getElse().toString() else elseStr = "(none)") and + if e.isElsif() then isElsif = true else isElsif = false } query predicate unlessExprs( diff --git a/ql/test/library-tests/ast/control/ControlExpr.expected b/ql/test/library-tests/ast/control/ControlExpr.expected index 6d6160fb180..3dcbc7b969b 100644 --- a/ql/test/library-tests/ast/control/ControlExpr.expected +++ b/ql/test/library-tests/ast/control/ControlExpr.expected @@ -3,10 +3,10 @@ | conditionals.rb:10:1:12:3 | if ... | IfExpr | | conditionals.rb:15:1:19:3 | if ... | IfExpr | | conditionals.rb:22:1:30:3 | if ... | IfExpr | -| conditionals.rb:24:1:29:5 | elsif ... | ElsifExpr | -| conditionals.rb:26:1:29:5 | elsif ... | ElsifExpr | +| conditionals.rb:24:1:29:5 | elsif ... | IfExpr | +| conditionals.rb:26:1:29:5 | elsif ... | IfExpr | | conditionals.rb:33:1:37:3 | if ... | IfExpr | -| conditionals.rb:35:1:36:5 | elsif ... | ElsifExpr | +| conditionals.rb:35:1:36:5 | elsif ... | IfExpr | | conditionals.rb:40:1:42:3 | unless ... | UnlessExpr | | conditionals.rb:45:1:49:3 | unless ... | UnlessExpr | | conditionals.rb:52:1:52:14 | ... if ... | IfModifierExpr |