Class: TreeHaver::Backends::Rust::Language

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/tree_haver/backends/rust.rb

Overview

Wrapper for tree_stump Language

Provides TreeHaver-compatible interface to tree_stump’s language loading.
tree_stump uses a registration-based API where languages are registered
by name, then referenced by that name when setting parser language.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, path: nil) ⇒ Language

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Language.

Parameters:

  • name (String)

    the registered language name

  • path (String, nil) (defaults to: nil)

    path language was loaded from



122
123
124
125
126
# File 'lib/tree_haver/backends/rust.rb', line 122

def initialize(name, path: nil)
  @name = name
  @backend = :rust
  @path = path
end

Instance Attribute Details

#backendSymbol (readonly)

The backend this language is for

Returns:

  • (Symbol)


113
114
115
# File 'lib/tree_haver/backends/rust.rb', line 113

def backend
  @backend
end

#nameString (readonly)

The registered language name

Returns:

  • (String)


109
110
111
# File 'lib/tree_haver/backends/rust.rb', line 109

def name
  @name
end

#pathString? (readonly)

The path this language was loaded from (if known)

Returns:

  • (String, nil)


117
118
119
# File 'lib/tree_haver/backends/rust.rb', line 117

def path
  @path
end

Class Method Details

.from_library(path, symbol: nil, name: nil) ⇒ Object Also known as: from_path

rubocop:disable Lint/UnusedMethodArgument



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/tree_haver/backends/rust.rb', line 161

def from_library(path, symbol: nil, name: nil) # rubocop:disable Lint/UnusedMethodArgument
  raise TreeHaver::NotAvailable, "tree_stump not available" unless Rust.available?

  # Validate the path exists before calling register_lang to provide a clear error
  raise TreeHaver::NotAvailable, "Language library not found: #{path}" unless File.exist?(path)

  # tree_stump uses TreeStump.register_lang(name, path) to register languages
  # The name is used to derive the symbol automatically (tree_sitter_<name>)
  # Use shared utility for consistent path parsing across backends
  lang_name = name || LibraryPathUtils.derive_language_name_from_path(path)
  ::TreeStump.register_lang(lang_name, path)
  new(lang_name, path: path)
rescue RuntimeError => e
  raise TreeHaver::NotAvailable, "Failed to load language from #{path}: #{e.message}"
end

Instance Method Details

#<=>(other) ⇒ Integer?

Compare languages for equality

Rust languages are equal if they have the same backend and name.
Name uniquely identifies a registered language in TreeStump.

Parameters:

  • other (Object)

    object to compare with

Returns:

  • (Integer, nil)

    -1, 0, 1, or nil if not comparable



135
136
137
138
139
140
# File 'lib/tree_haver/backends/rust.rb', line 135

def <=>(other)
  return unless other.is_a?(Language)
  return unless other.backend == @backend

  @name <=> other.name
end

#hashInteger

Hash value for this language (for use in Sets/Hashes)

Returns:

  • (Integer)


144
145
146
# File 'lib/tree_haver/backends/rust.rb', line 144

def hash
  [@backend, @name].hash
end