ruby-syntax-tree / syntax_tree

Interact with the Ruby syntax tree
https://ruby-syntax-tree.github.io/syntax_tree/
MIT License
556 stars 54 forks source link

[Feature] Allow parsing top-level yield in Ruby 3.3 #457

Open davidwessman opened 2 months ago

davidwessman commented 2 months ago

Hello, thank you for a great gem!

I am working on https://github.com/davidwessman/syntax_tree-erb and ran into some errors when upgrading to Ruby 3.3.

In ERB-template rendered by Rails calls to yield will not raise an error for top-level yield. Probably because Rails compile the templates somehow. When I parse the ruby-code in an ERB-template I parse each tag by itself.

This causes errors:

Ruby 3.2.4, syntax_tree 6.2.0

stree ast -e 'yield'
(program (statements ((yield nil))))

Ruby 3.3.1, syntax_tree 6.2.0

stree ast -e 'yield'  
Error: Invalid yield
> 1 | yield
    | ^

I am using the Ruby-api, SyntaxTree.parse("yield"), would there be anyway to add some support to allow the top-level yield? Or do I need to wrap all the code I parse or something? That would make formatting much harder.

davidwessman commented 2 months ago

My solution for now is to replace yield with a placeholder: https://github.com/davidwessman/syntax_tree-erb/pull/78

davidwessman commented 2 months ago

Discussed it with Jean Boussier in Rails Performance Slack and he encouraged me to make an issue here and see if you had any better idea 🙂