diff --git a/lib/ruby-lint/analysis/loop_keywords.rb b/lib/ruby-lint/analysis/loop_keywords.rb index 6a95f2f..927aa23 100644 --- a/lib/ruby-lint/analysis/loop_keywords.rb +++ b/lib/ruby-lint/analysis/loop_keywords.rb @@ -24,6 +24,11 @@ module Analysis class LoopKeywords < Base register 'loop_keywords' + def after_initialize + @loop_nesting = 0 + super + end + ## # List of keywords that can only be used inside a loop. # @@ -44,11 +49,11 @@ class LoopKeywords < Base STATEMENTS.each do |statement| define_method("on_#{statement}") do - @allow_keyword = true + @loop_nesting += 1 end define_method("after_#{statement}") do - @allow_keyword = false + @loop_nesting -= 1 end end @@ -57,7 +62,7 @@ class LoopKeywords < Base # @param [RubyLint::AST::Node] node # def verify_keyword(keyword, node) - if current_scope.type != :block and !@allow_keyword + if current_scope.type != :block and @loop_nesting.zero? error("#{keyword} can only be used inside a loop/block", node) end end diff --git a/spec/ruby-lint/analysis/loop_keywords_spec.rb b/spec/ruby-lint/analysis/loop_keywords_spec.rb index 022677b..c27d905 100644 --- a/spec/ruby-lint/analysis/loop_keywords_spec.rb +++ b/spec/ruby-lint/analysis/loop_keywords_spec.rb @@ -71,6 +71,13 @@ report.entries.should be_empty end + it 'does not error when using break inside outer nested loop' do + code = 'while true; while true; end; break; end' + report = build_report(code, described_class) + + report.entries.should be_empty + end + it 'does not error when using break inside an until loop' do code = 'until true; break; end' report = build_report(code, described_class)