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

Support multi-versioning for Prism::Translation::Parser #2419

Commits on Feb 15, 2024

  1. Support multi-versioning for Prism::Translation::Parser

    ## Summary
    
    Fixes ruby#2356.
    
    I'm working on integrating Prism into RuboCop.
    
    This PR introduces `Prism::Translation::Parser33` and `Prism::Translation::Parser34`, named
    in accordance with the following comments.
    rubocop/rubocop#12600 (comment)
    
    Currently, `Prism::Translation::Parser` always operates in Ruby 3.4 mode.
    This means it will not parse as Ruby 3.3 even if `TargetRubyVersion: 80_82_73_83_77.33` is specified.
    
    Therefore, the `it` introduced in Ruby 3.4 is parsed incompatibly with Ruby 3.3. In Ruby 3.3,
    the expected name for an `lvar` is `:it`, not `:"0it"`.
    
    ### Expected AST
    
    The following is an expected AST when parsing Ruby 3.3 code:
    
    ```console
    $ bundle exec ruby -rprism -rprism/translation/parser33 -ve "p Prism::Translation::Parser33.parse('items.map { it.do_something }')"
    ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin22]
    s(:block,
      s(:send,
        s(:send, nil, :items), :map),
      s(:args),
      s(:send,
        s(:send, nil, :it), :do_something))
    ```
    
    ### Actual AST
    
    The following is an actual AST when parsing Ruby 3.3 code:
    
    ```console
    $ ruby -rprism -ve "p Prism::Translation::Parser.parse('items.map { it.do_something }')"
    ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin22]
    s(:block,
      s(:send,
        s(:send, nil, :items), :map),
      s(:args),
      s(:send,
        s(:lvar, :"0it"), :do_something))
    ```
    
    `Prism::Translation::Parser33` and `Prism::Translation::Parser34` aim to correspond to Ruby 3.3 and Ruby 3.4, respectively.
    
    And, The hack of specifying `TargetRubyVersion: 80_82_73_83_77.33` is expected to become unnecessary in the future,
    but the behavior will be maintained until RuboCop's support is finalized:
    rubocop/rubocop#12600 (comment)
    
    ## Additional Information
    
    A private method named `convert_for_prism` is prepared to convert the `version` from Parser to the `version` expected by Prism.
    For example, a Parser-compatible value is `3.3`, whereas Prism expects `"3.3.0"`.
    
    `Parser#version` is not used in RuboCop, but it's unclear how it is utilized in other libraries that rely on the Parser gem.
    
    Therefore, logic to maintain compatibility between Parser and Prism is implemented.
    koic committed Feb 15, 2024
    Configuration menu
    Copy the full SHA
    62d3991 View commit details
    Browse the repository at this point in the history