Skip to content
  • schneems's avatar
    c638ffa7
    [ruby/syntax_suggest] Fix · c638ffa7
    schneems authored
    https://github.com/ruby/syntax_suggest/pull/187 Handle if/else with
    empty/comment
    line
    
    Reported in #187 this code:
    
    ```
    class Foo
      def foo
        if cond?
          foo
        else
          # comment
        end
      end
    
      # ...
    
      def bar
        if @recv
        end_is_missing_here
      end
    end
    ```
    
    Triggers an incorrect suggestion:
    
    ```
    Unmatched keyword, missing `end' ?
       1  class Foo
       2    def foo
    >  3      if cond?
    >  5      else
       8    end
      16  end
    ```
    
    Part of the issue is that while scanning we're using newlines to determine when to stop and pause. This is useful for determining logically smaller chunks to evaluate but in this case it causes us to pause before grabbing the "end" that is right below the newline. This problem is similar to https://github.com/ruby/syntax_suggest/pull/179.
    
    However in the case of expanding same indentation "neighbors" I want to always grab all empty values at the end of the scan. I don't want to do that when changing indentation levels as it affects scan results.
    
    There may be some way to normalize this behavior between the two, but the tests really don't like that change.
    
    To fix this issue for expanding against different indentation I needed a way to first try and grab any additional newlines with the ability to rollback that guess. In #192 I experimented with decoupling scanning from the AroundBlockScan logic. It also added the ability to take a snapshot of the current scanner and rollback to prior changes.
    
    With this ability in place now we:
    
    - Grab extra empties before looking at the above/below line for the matching keyword/end statement
    - If there's a match, grab it
    - If there's no match, discard the newlines we picked up in the evaluation
    
    That solves the issue.
    
    https://github.com/ruby/syntax_suggest/commit/513646b912
    c638ffa7
    [ruby/syntax_suggest] Fix
    schneems authored
    https://github.com/ruby/syntax_suggest/pull/187 Handle if/else with
    empty/comment
    line
    
    Reported in #187 this code:
    
    ```
    class Foo
      def foo
        if cond?
          foo
        else
          # comment
        end
      end
    
      # ...
    
      def bar
        if @recv
        end_is_missing_here
      end
    end
    ```
    
    Triggers an incorrect suggestion:
    
    ```
    Unmatched keyword, missing `end' ?
       1  class Foo
       2    def foo
    >  3      if cond?
    >  5      else
       8    end
      16  end
    ```
    
    Part of the issue is that while scanning we're using newlines to determine when to stop and pause. This is useful for determining logically smaller chunks to evaluate but in this case it causes us to pause before grabbing the "end" that is right below the newline. This problem is similar to https://github.com/ruby/syntax_suggest/pull/179.
    
    However in the case of expanding same indentation "neighbors" I want to always grab all empty values at the end of the scan. I don't want to do that when changing indentation levels as it affects scan results.
    
    There may be some way to normalize this behavior between the two, but the tests really don't like that change.
    
    To fix this issue for expanding against different indentation I needed a way to first try and grab any additional newlines with the ability to rollback that guess. In #192 I experimented with decoupling scanning from the AroundBlockScan logic. It also added the ability to take a snapshot of the current scanner and rollback to prior changes.
    
    With this ability in place now we:
    
    - Grab extra empties before looking at the above/below line for the matching keyword/end statement
    - If there's a match, grab it
    - If there's no match, discard the newlines we picked up in the evaluation
    
    That solves the issue.
    
    https://github.com/ruby/syntax_suggest/commit/513646b912
Loading