Class: Rbs::Merge::Backends::RbsBackend::Parser

Inherits:
TreeHaver::Base::Parser
  • Object
show all
Defined in:
lib/rbs/merge/backends/rbs_backend.rb

Overview

RBS parser wrapper

Wraps the RBS gem parser to provide a TreeHaver-compatible API.

Instance Method Summary collapse

Constructor Details

#initializeParser

Create a new RBS parser instance

Raises:

  • (TreeHaver::NotAvailable)

    if rbs gem is not available



164
165
166
167
# File 'lib/rbs/merge/backends/rbs_backend.rb', line 164

def initialize
  super()
  raise TreeHaver::NotAvailable, "rbs gem not available" unless RbsBackend.available?
end

Instance Method Details

#language=(lang) ⇒ void

This method returns an undefined value.

Set the language for this parser

Parameters:

  • lang (Language, Symbol)

    RBS language (should be :rbs or Language instance)



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/rbs/merge/backends/rbs_backend.rb', line 173

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

#parse(source) ⇒ Tree

Parse source code

Parameters:

  • source (String)

    the RBS source code to parse

Returns:

  • (Tree)

    parse result tree

Raises:

  • (TreeHaver::NotAvailable)

    if no language is set



195
196
197
198
199
200
201
202
203
204
# File 'lib/rbs/merge/backends/rbs_backend.rb', line 195

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

  buffer = ::RBS::Buffer.new(name: "merge.rbs", content: source)
  _buffer, directives, declarations = ::RBS::Parser.parse_signature(buffer)
  Tree.new(declarations, source: source, directives: directives)
rescue ::RBS::ParsingError => e
  # Return a tree with errors instead of raising
  Tree.new([], source: source, directives: [], errors: [e])
end