Skip to content
  • Kevin Newton's avatar
    51d3d6ac
    [ruby/prism] Support forwarding flags on scopes · 51d3d6ac
    Kevin Newton authored
    When parent scopes around an eval are forwarding parameters (like
    *, **, &, or ...) we need to know that information when we are in
    the parser. As such, we need to support passing that information
    into the scopes option. In order to do this, unfortunately we need
    a bunch of changes.
    
    The scopes option was previously an array of array of strings.
    These corresponded to the names of the locals in the parent scopes.
    We still support this, but now additionally support passing in a
    Prism::Scope instance at each index in the array. This Prism::Scope
    class holds both the names of the locals as well as an array of
    forwarding parameter names (symbols corresponding to the forwarding
    parameters). There is convenience function on the Prism module that
    creates a Prism::Scope object using Prism.scope.
    
    In JavaScript, we now additionally support an object much the same
    as the Ruby side. In Java, we now have a ParsingOptions.Scope class
    that holds that information. In the dump APIs, these objects in all
    3 languages will add an additional byte for the forwarding flags in
    the middle of the scopes serialization.
    
    All of this is in service of properly parsing the following code:
    
    ```ruby
    def foo(*) = eval("bar(*)")
    ```
    
    https://github.com/ruby/prism/commit/21abb6b7c4
    51d3d6ac
    [ruby/prism] Support forwarding flags on scopes
    Kevin Newton authored
    When parent scopes around an eval are forwarding parameters (like
    *, **, &, or ...) we need to know that information when we are in
    the parser. As such, we need to support passing that information
    into the scopes option. In order to do this, unfortunately we need
    a bunch of changes.
    
    The scopes option was previously an array of array of strings.
    These corresponded to the names of the locals in the parent scopes.
    We still support this, but now additionally support passing in a
    Prism::Scope instance at each index in the array. This Prism::Scope
    class holds both the names of the locals as well as an array of
    forwarding parameter names (symbols corresponding to the forwarding
    parameters). There is convenience function on the Prism module that
    creates a Prism::Scope object using Prism.scope.
    
    In JavaScript, we now additionally support an object much the same
    as the Ruby side. In Java, we now have a ParsingOptions.Scope class
    that holds that information. In the dump APIs, these objects in all
    3 languages will add an additional byte for the forwarding flags in
    the middle of the scopes serialization.
    
    All of this is in service of properly parsing the following code:
    
    ```ruby
    def foo(*) = eval("bar(*)")
    ```
    
    https://github.com/ruby/prism/commit/21abb6b7c4
Loading