Class: TreeHaver::Backends::Prism::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/tree_haver/backends/prism.rb

Overview

Prism parser wrapper

Wraps Prism to provide a tree-sitter-like API for parsing Ruby code.

Instance Method Summary collapse

Constructor Details

#initializeParser

Create a new Prism parser instance

Raises:



179
180
181
182
183
# File 'lib/tree_haver/backends/prism.rb', line 179

def initialize
  raise TreeHaver::NotAvailable, "prism not available" unless Prism.available?
  @language = nil
  @options = {}
end

Instance Method Details

#language=(lang) ⇒ void

This method returns an undefined value.

Set the language for this parser

Note: TreeHaver::Parser unwraps language objects before calling this method. This backend receives the Language wrapper (since Prism::Language stores options).

Parameters:

  • lang (Language, Symbol)

    Prism language (should be :ruby or Language instance)



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/tree_haver/backends/prism.rb', line 192

def language=(lang)
  case lang
  when Language
    @language = lang
    @options = lang.options
  when Symbol, String
    if lang.to_sym == :ruby
      @language = Language.ruby
      @options = {}
    else
      raise ArgumentError,
        "Prism only supports Ruby parsing. Got: #{lang.inspect}"
    end
  else
    raise ArgumentError,
      "Expected Prism::Language or :ruby, got #{lang.class}"
  end
end

#parse(source) ⇒ Tree

Parse source code

Parameters:

  • source (String)

    the Ruby source code to parse

Returns:

  • (Tree)

    raw backend tree (wrapping happens in TreeHaver::Parser)

Raises:



216
217
218
219
220
221
222
# File 'lib/tree_haver/backends/prism.rb', line 216

def parse(source)
  raise TreeHaver::NotAvailable, "No language loaded (use parser.language = :ruby)" unless @language

  # Use Prism.parse with options
  prism_result = ::Prism.parse(source, **@options)
  Tree.new(prism_result, source)
end

#parse_string(old_tree, source) ⇒ Tree

Parse source code (compatibility with tree-sitter API)

Prism doesn’t support incremental parsing, so old_tree is ignored.

Parameters:

  • old_tree (TreeHaver::Tree, nil)

    ignored (no incremental parsing support)

  • source (String)

    the Ruby source code to parse

Returns:

  • (Tree)

    raw backend tree (wrapping happens in TreeHaver::Parser)



231
232
233
# File 'lib/tree_haver/backends/prism.rb', line 231

def parse_string(old_tree, source) # rubocop:disable Lint/UnusedMethodArgument
  parse(source)  # Prism doesn't support incremental parsing
end