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



105
106
107
108
109
# File 'lib/tree_haver/backends/rust.rb', line 105

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)


96
97
98
# File 'lib/tree_haver/backends/rust.rb', line 96

def backend
  @backend
end

#nameString (readonly)

The registered language name

Returns:

  • (String)


92
93
94
# File 'lib/tree_haver/backends/rust.rb', line 92

def name
  @name
end

#pathString? (readonly)

The path this language was loaded from (if known)

Returns:

  • (String, nil)


100
101
102
# File 'lib/tree_haver/backends/rust.rb', line 100

def path
  @path
end

Class Method Details

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

rubocop:disable Lint/UnusedMethodArgument



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/tree_haver/backends/rust.rb', line 144

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



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

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)


127
128
129
# File 'lib/tree_haver/backends/rust.rb', line 127

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