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



124
125
126
127
128
# File 'lib/tree_haver/backends/rust.rb', line 124

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)


115
116
117
# File 'lib/tree_haver/backends/rust.rb', line 115

def backend
  @backend
end

#nameString (readonly)

The registered language name

Returns:

  • (String)


111
112
113
# File 'lib/tree_haver/backends/rust.rb', line 111

def name
  @name
end

#pathString? (readonly)

The path this language was loaded from (if known)

Returns:

  • (String, nil)


119
120
121
# File 'lib/tree_haver/backends/rust.rb', line 119

def path
  @path
end

Class Method Details

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

rubocop:disable Lint/UnusedMethodArgument



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

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



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

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)


146
147
148
# File 'lib/tree_haver/backends/rust.rb', line 146

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