From 6a96c55003404575c8098eaa2a3b41af8b472770 Mon Sep 17 00:00:00 2001 From: Justin Collins Date: Wed, 20 Mar 2013 12:42:56 -0700 Subject: [PATCH] Convert simple `if` to `or` on assignment --- lib/brakeman/processors/alias_processor.rb | 28 ++++++++++++++++++++++ test/tests/test_alias_processor.rb | 14 +++++++++++ 2 files changed, 42 insertions(+) diff --git a/lib/brakeman/processors/alias_processor.rb b/lib/brakeman/processors/alias_processor.rb index d8094046..9589b378 100644 --- a/lib/brakeman/processors/alias_processor.rb +++ b/lib/brakeman/processors/alias_processor.rb @@ -388,6 +388,8 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor exps = [exp.then_clause, exp.else_clause] end + exps.compact! + exps.each do |e| @inside_if << [] unless no_branch or @ignore_ifs @@ -619,11 +621,37 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor end end + def value_from_if exp + if node_type? exp.else_clause, :block or node_type? exp.then_clause, :block + #If either clause is more than a single expression, just use entire + #if expression for now + exp + elsif exp.else_clause.nil? + exp.then_clause + elsif exp.then_clause.nil? + exp.else_clause + else + condition = exp.condition + + if true? condition + exp.then_clause + elsif false? condition + exp.else_clause + else + Sexp.new(:or, exp.then_clause, exp.else_clause).line(exp.line) + end + end + end + #Set variable to given value. #Creates "branched" versions of values when appropriate. #Avoids creating multiple branched versions inside same #if branch. def set_value var, value, line = nil + if node_type? value, :if + value = value_from_if(value) + end + unless @ignore_ifs current_val = env[var] current_if = @inside_if.last diff --git a/test/tests/test_alias_processor.rb b/test/tests/test_alias_processor.rb index f7b092bc..19063e98 100644 --- a/test/tests/test_alias_processor.rb +++ b/test/tests/test_alias_processor.rb @@ -223,4 +223,18 @@ class AliasProcessorTests < Test::Unit::TestCase [w, x, y] RUBY end + + def test_assignment_of_simple_if_expression + assert_alias "1 or 2", <<-RUBY + x = (test ? 1 : 2) + x + RUBY + end + + def test_assignment_of_forced_if_expression + assert_alias "1", <<-RUBY + x = (true ? 1 : 2) + x + RUBY + end end -- GitLab