Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix complex condition in for/while/until #480

Merged
merged 2 commits into from
Aug 8, 2017

Conversation

aycabta
Copy link
Member

@aycabta aycabta commented Aug 4, 2017

The parse_statements method calls skip_optional_do_after_expression in case of for/while/until tokens. The skip_optional_do_after_expression uses get_end_token for checking end of loop condition expressions, but it's not correct, because the end is detected by only do token, newline and semi-colon token.

For example,

class Foo
  def blah()
    for i in (k+1)...n do
    end
    for i in (k+1)...n
    end
  end
end

This code is highlighted below:

broken

<pre>
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">blah</span>()
    <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> (<span class="ruby-identifier">k</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>)<span class="ruby-operator">...</span><span class="ruby-identifier">n</span> <span class="ruby-keyword">do</span>
    <span class="ruby-keyword">end</span>
    <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> (<span class="ruby-identifier">k</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>)<span class="ruby-operator">...</span><span class="ruby-identifier">n</span>
    <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
</pre>

I think this is broken. This Pull Request fixes it:

correct

<pre>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">blah</span>()
  <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> (<span class="ruby-identifier">k</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>)<span class="ruby-operator">...</span><span class="ruby-identifier">n</span> <span class="ruby-keyword">do</span>
  <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> (<span class="ruby-identifier">k</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>)<span class="ruby-operator">...</span><span class="ruby-identifier">n</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
</pre>

The parse_statements method calls
skip_optional_do_after_expression method
in case of for/while/until tokens.
The skip_optional_do_after_expression method uses get_end_token method
for checking end of loop condition expressions,
but it's not correct,
because the end is detected by only
"do" token, newline and semi-colon token.
This commit fixes it.
@hsbt hsbt self-assigned this Aug 5, 2017
@aycabta aycabta force-pushed the fix-complex-condition-in-for branch from cfcd5f2 to 1917d08 Compare August 5, 2017 13:26
@aycabta aycabta force-pushed the fix-complex-condition-in-for branch from 1917d08 to c0efaf5 Compare August 5, 2017 13:58
@hsbt
Copy link
Member

hsbt commented Aug 8, 2017

Confirmed. Thanks.

@hsbt hsbt merged commit 68bd8f5 into ruby:master Aug 8, 2017
@aycabta aycabta deleted the fix-complex-condition-in-for branch August 8, 2017 12:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

2 participants