Skip to content

Level nesting error when formatting many cascading elsif clauses. #491

Open
@davebenvenuti

Description

@davebenvenuti

I noticed SyntaxTree.format has trouble with many (thousands) of subsequent elsif clauses. Here's an admittedly contrived example:

OS: macOS Sequoia 15.2
Ruby Version: ruby 3.3.4 (2024-07-09 revision be1089c8ec) [arm64-darwin23]
syntax_tree Version: 6.2.0

syntax_tree_nesting_error.rb

#!/usr/bin/env ruby

require "erb"
require "syntax_tree"

SyntaxTree.format(ERB.new(<<~RUBY, trim_mode: "-").result)
  def foo(x)
    if x == 0
      return :"0"
    <%- (1...5000).each do |i| -%>
    elsif x == <%= i %>
      return :"<%= i %>"
    <%- end -%>
    end
  end
RUBY

Output

ruby syntax_tree_nesting_error.rb
/Users/dave/.gem/ruby/3.3.4/gems/syntax_tree-6.2.0/lib/syntax_tree/parser.rb:2864:in `on_parse_error': nesting too deep (SyntaxTree::Parser::ParseError)
        from /Users/dave/.gem/ruby/3.3.4/gems/syntax_tree-6.2.0/lib/syntax_tree.rb:124:in `parse'
        from /Users/dave/.gem/ruby/3.3.4/gems/syntax_tree-6.2.0/lib/syntax_tree.rb:124:in `parse'
        from /Users/dave/.gem/ruby/3.3.4/gems/syntax_tree-6.2.0/lib/syntax_tree.rb:68:in `format'
        from syntax_tree_nesting_error.rb:6:in `<main>'

Interestingly, the same idea except with single-line conditionals works fine:

syntax_tree_single_line_conditionals.rb

#!/usr/bin/env ruby

require "erb"
require "syntax_tree"

SyntaxTree.format(ERB.new(<<~RUBY, trim_mode: "-").result)
  def foo(x)
    return :"0"
    <%- (1...5000).each do |i| -%>
    return :"<%= i %>" if x == <%= i %>
    <%- end -%>
  end
RUBY

This version runs without raising an error.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions