Skip to content
This repository has been archived by the owner on Mar 16, 2023. It is now read-only.

Commit

Permalink
Merge pull request #185 from mvidner/fix_nested_loops
Browse files Browse the repository at this point in the history
Handle nested loops correctly (fixes #178)
  • Loading branch information
Yorick Peterse committed Jun 25, 2016
2 parents d7bcfe8 + a0160f6 commit 6f67533
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 3 deletions.
11 changes: 8 additions & 3 deletions lib/ruby-lint/analysis/loop_keywords.rb
Expand Up @@ -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.
#
Expand All @@ -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

Expand All @@ -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
Expand Down
7 changes: 7 additions & 0 deletions spec/ruby-lint/analysis/loop_keywords_spec.rb
Expand Up @@ -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)
Expand Down

0 comments on commit 6f67533

Please sign in to comment.