tree_haver 5.0.4 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/tree_haver/backend_context.rb +28 -0
- data/lib/tree_haver/backend_registry.rb +19 -432
- data/lib/tree_haver/contracts.rb +460 -0
- data/lib/tree_haver/kaitai_backend.rb +30 -0
- data/lib/tree_haver/language_pack.rb +190 -0
- data/lib/tree_haver/peg_backends.rb +76 -0
- data/lib/tree_haver/version.rb +1 -12
- data/lib/tree_haver.rb +7 -1316
- data.tar.gz.sig +0 -0
- metadata +34 -245
- metadata.gz.sig +0 -0
- data/CHANGELOG.md +0 -1366
- data/CITATION.cff +0 -20
- data/CODE_OF_CONDUCT.md +0 -134
- data/CONTRIBUTING.md +0 -359
- data/FUNDING.md +0 -74
- data/LICENSE.txt +0 -21
- data/README.md +0 -2347
- data/REEK +0 -0
- data/RUBOCOP.md +0 -71
- data/SECURITY.md +0 -21
- data/lib/tree_haver/backend_api.rb +0 -349
- data/lib/tree_haver/backends/citrus.rb +0 -487
- data/lib/tree_haver/backends/ffi.rb +0 -1009
- data/lib/tree_haver/backends/java.rb +0 -893
- data/lib/tree_haver/backends/mri.rb +0 -362
- data/lib/tree_haver/backends/parslet.rb +0 -560
- data/lib/tree_haver/backends/prism.rb +0 -471
- data/lib/tree_haver/backends/psych.rb +0 -375
- data/lib/tree_haver/backends/rust.rb +0 -239
- data/lib/tree_haver/base/language.rb +0 -98
- data/lib/tree_haver/base/node.rb +0 -322
- data/lib/tree_haver/base/parser.rb +0 -24
- data/lib/tree_haver/base/point.rb +0 -48
- data/lib/tree_haver/base/tree.rb +0 -128
- data/lib/tree_haver/base.rb +0 -12
- data/lib/tree_haver/citrus_grammar_finder.rb +0 -218
- data/lib/tree_haver/compat.rb +0 -43
- data/lib/tree_haver/grammar_finder.rb +0 -374
- data/lib/tree_haver/language.rb +0 -295
- data/lib/tree_haver/language_registry.rb +0 -190
- data/lib/tree_haver/library_path_utils.rb +0 -80
- data/lib/tree_haver/node.rb +0 -579
- data/lib/tree_haver/parser.rb +0 -438
- data/lib/tree_haver/parslet_grammar_finder.rb +0 -224
- data/lib/tree_haver/path_validator.rb +0 -353
- data/lib/tree_haver/point.rb +0 -27
- data/lib/tree_haver/rspec/dependency_tags.rb +0 -1392
- data/lib/tree_haver/rspec/testable_node.rb +0 -217
- data/lib/tree_haver/rspec.rb +0 -33
- data/lib/tree_haver/tree.rb +0 -258
- data/sig/tree_haver/backends.rbs +0 -352
- data/sig/tree_haver/grammar_finder.rbs +0 -29
- data/sig/tree_haver/path_validator.rbs +0 -32
- data/sig/tree_haver.rbs +0 -234
data/sig/tree_haver/backends.rbs
DELETED
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
# Type definitions for TreeHaver backends
|
|
2
|
-
|
|
3
|
-
module TreeHaver
|
|
4
|
-
module Backends
|
|
5
|
-
# MRI backend using ruby_tree_sitter
|
|
6
|
-
module MRI
|
|
7
|
-
# Check if the MRI backend is available
|
|
8
|
-
def self.available?: () -> bool
|
|
9
|
-
|
|
10
|
-
# Get capabilities supported by this backend
|
|
11
|
-
def self.capabilities: () -> Hash[Symbol, untyped]
|
|
12
|
-
|
|
13
|
-
class Language
|
|
14
|
-
# Load a language from a shared library path
|
|
15
|
-
def self.from_path: (String path) -> untyped
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
class Parser
|
|
19
|
-
# Create a new parser instance
|
|
20
|
-
def initialize: () -> void
|
|
21
|
-
|
|
22
|
-
# Set the language for this parser
|
|
23
|
-
def language=: (untyped lang) -> untyped
|
|
24
|
-
|
|
25
|
-
# Parse source code
|
|
26
|
-
def parse: (String source) -> untyped
|
|
27
|
-
|
|
28
|
-
# Parse source code with optional incremental parsing
|
|
29
|
-
def parse_string: (untyped? old_tree, String source) -> untyped
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
@parser: untyped
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
class Tree
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
class Node
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# FFI-based backend for calling libtree-sitter directly
|
|
44
|
-
module FFI
|
|
45
|
-
# Native FFI bindings to libtree-sitter
|
|
46
|
-
module Native
|
|
47
|
-
# Get list of candidate library names
|
|
48
|
-
def self.lib_candidates: () -> Array[String]
|
|
49
|
-
|
|
50
|
-
# Load the tree-sitter runtime library
|
|
51
|
-
def self.try_load!: () -> void
|
|
52
|
-
|
|
53
|
-
# Check if the library is loaded
|
|
54
|
-
def self.loaded?: () -> bool
|
|
55
|
-
|
|
56
|
-
# FFI struct representation of TSNode
|
|
57
|
-
class TSNode < ::FFI::Struct
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def self.ts_parser_new: () -> ::FFI::Pointer
|
|
61
|
-
|
|
62
|
-
def self.ts_parser_delete: (::FFI::Pointer ptr) -> void
|
|
63
|
-
|
|
64
|
-
def self.ts_parser_set_language: (::FFI::Pointer parser, ::FFI::Pointer language) -> bool
|
|
65
|
-
|
|
66
|
-
def self.ts_parser_parse_string: (::FFI::Pointer parser, ::FFI::Pointer old_tree, String source, Integer length) -> ::FFI::Pointer
|
|
67
|
-
|
|
68
|
-
def self.ts_tree_delete: (::FFI::Pointer ptr) -> void
|
|
69
|
-
|
|
70
|
-
def self.ts_tree_root_node: (::FFI::Pointer tree) -> TSNode
|
|
71
|
-
|
|
72
|
-
def self.ts_node_type: (TSNode node) -> String
|
|
73
|
-
|
|
74
|
-
def self.ts_node_child_count: (TSNode node) -> Integer
|
|
75
|
-
|
|
76
|
-
def self.ts_node_child: (TSNode node, Integer index) -> TSNode
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Check if the FFI backend is available
|
|
80
|
-
def self.available?: () -> bool
|
|
81
|
-
|
|
82
|
-
# Get capabilities supported by this backend
|
|
83
|
-
def self.capabilities: () -> Hash[Symbol, untyped]
|
|
84
|
-
|
|
85
|
-
class Language
|
|
86
|
-
# The FFI pointer to the TSLanguage struct
|
|
87
|
-
attr_reader pointer: ::FFI::Pointer
|
|
88
|
-
|
|
89
|
-
# Load a language from a shared library
|
|
90
|
-
def self.from_library: (String path, ?symbol: String?, ?name: String?) -> Language
|
|
91
|
-
|
|
92
|
-
# Alias for from_library
|
|
93
|
-
def self.from_path: (String path, ?symbol: String?, ?name: String?) -> Language
|
|
94
|
-
|
|
95
|
-
# Convert to FFI pointer
|
|
96
|
-
def to_ptr: () -> ::FFI::Pointer
|
|
97
|
-
|
|
98
|
-
private
|
|
99
|
-
|
|
100
|
-
def initialize: (::FFI::Pointer ptr) -> void
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
class Parser
|
|
104
|
-
# Create a new parser instance
|
|
105
|
-
def initialize: () -> void
|
|
106
|
-
|
|
107
|
-
# Get finalizer for cleanup
|
|
108
|
-
def self.finalizer: (::FFI::Pointer ptr) -> Proc
|
|
109
|
-
|
|
110
|
-
# Set the language for this parser
|
|
111
|
-
def language=: (Language lang) -> Language
|
|
112
|
-
|
|
113
|
-
# Parse source code into a syntax tree
|
|
114
|
-
def parse: (String source) -> Tree
|
|
115
|
-
|
|
116
|
-
private
|
|
117
|
-
|
|
118
|
-
@parser: ::FFI::Pointer
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
class Tree
|
|
122
|
-
# Get finalizer for cleanup
|
|
123
|
-
def self.finalizer: (::FFI::Pointer ptr) -> Proc
|
|
124
|
-
|
|
125
|
-
# Get the root node of the syntax tree
|
|
126
|
-
def root_node: () -> Node
|
|
127
|
-
|
|
128
|
-
private
|
|
129
|
-
|
|
130
|
-
def initialize: (::FFI::Pointer ptr) -> void
|
|
131
|
-
|
|
132
|
-
@ptr: ::FFI::Pointer
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
class Node
|
|
136
|
-
# Get the type name of this node
|
|
137
|
-
def type: () -> String
|
|
138
|
-
|
|
139
|
-
# Iterate over child nodes
|
|
140
|
-
def each: () { (Node child) -> void } -> nil
|
|
141
|
-
| () -> Enumerator[Node, nil]
|
|
142
|
-
|
|
143
|
-
private
|
|
144
|
-
|
|
145
|
-
def initialize: (Native::TSNode ts_node_value) -> void
|
|
146
|
-
|
|
147
|
-
@val: Native::TSNode
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Java backend for JRuby using java-tree-sitter
|
|
152
|
-
module Java
|
|
153
|
-
JAVA_PACKAGE: String
|
|
154
|
-
|
|
155
|
-
# Attempt to append JARs from ENV to JRuby classpath
|
|
156
|
-
def self.add_jars_from_env!: () -> void
|
|
157
|
-
|
|
158
|
-
# Check if the Java backend is available
|
|
159
|
-
def self.available?: () -> bool
|
|
160
|
-
|
|
161
|
-
# Reset the load state (for testing)
|
|
162
|
-
def self.reset!: () -> void
|
|
163
|
-
|
|
164
|
-
# Get the loaded Java classes
|
|
165
|
-
def self.java_classes: () -> Hash[Symbol, untyped]
|
|
166
|
-
|
|
167
|
-
# Get capabilities supported by this backend
|
|
168
|
-
def self.capabilities: () -> Hash[Symbol, untyped]
|
|
169
|
-
|
|
170
|
-
class Language
|
|
171
|
-
attr_reader impl: untyped
|
|
172
|
-
|
|
173
|
-
def initialize: (untyped impl) -> void
|
|
174
|
-
|
|
175
|
-
def self.from_library: (String path, ?symbol: String?, ?name: String?) -> Language
|
|
176
|
-
|
|
177
|
-
def self.from_path: (String path, ?symbol: String?, ?name: String?) -> Language
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
class Parser
|
|
181
|
-
def initialize: () -> void
|
|
182
|
-
|
|
183
|
-
def language=: (Language | untyped lang) -> void
|
|
184
|
-
|
|
185
|
-
def parse: (String source) -> Tree
|
|
186
|
-
|
|
187
|
-
def parse_string: (Tree? old_tree, String source) -> Tree
|
|
188
|
-
|
|
189
|
-
private
|
|
190
|
-
|
|
191
|
-
@parser: untyped
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
class Tree
|
|
195
|
-
attr_reader impl: untyped
|
|
196
|
-
|
|
197
|
-
def initialize: (untyped impl) -> void
|
|
198
|
-
|
|
199
|
-
def root_node: () -> Node
|
|
200
|
-
|
|
201
|
-
def edit: (
|
|
202
|
-
start_byte: Integer,
|
|
203
|
-
old_end_byte: Integer,
|
|
204
|
-
new_end_byte: Integer,
|
|
205
|
-
start_point: Hash[Symbol, Integer],
|
|
206
|
-
old_end_point: Hash[Symbol, Integer],
|
|
207
|
-
new_end_point: Hash[Symbol, Integer]
|
|
208
|
-
) -> void
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
class Node
|
|
212
|
-
attr_reader impl: untyped
|
|
213
|
-
|
|
214
|
-
def initialize: (untyped impl) -> void
|
|
215
|
-
|
|
216
|
-
def type: () -> String
|
|
217
|
-
|
|
218
|
-
def child_count: () -> Integer
|
|
219
|
-
|
|
220
|
-
def child: (Integer index) -> Node
|
|
221
|
-
|
|
222
|
-
def each: () { (Node) -> void } -> void
|
|
223
|
-
| () -> Enumerator[Node, nil]
|
|
224
|
-
|
|
225
|
-
def start_byte: () -> Integer
|
|
226
|
-
|
|
227
|
-
def end_byte: () -> Integer
|
|
228
|
-
|
|
229
|
-
def start_point: () -> Hash[Symbol, Integer]
|
|
230
|
-
|
|
231
|
-
def end_point: () -> Hash[Symbol, Integer]
|
|
232
|
-
|
|
233
|
-
def has_error?: () -> bool
|
|
234
|
-
|
|
235
|
-
def missing?: () -> bool
|
|
236
|
-
|
|
237
|
-
def text: () -> String
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
# Rust backend using tree_stump
|
|
242
|
-
module Rust
|
|
243
|
-
# Check if the Rust backend is available
|
|
244
|
-
def self.available?: () -> bool
|
|
245
|
-
|
|
246
|
-
# Reset the load state (for testing)
|
|
247
|
-
def self.reset!: () -> void
|
|
248
|
-
|
|
249
|
-
# Get capabilities supported by this backend
|
|
250
|
-
def self.capabilities: () -> Hash[Symbol, untyped]
|
|
251
|
-
|
|
252
|
-
class Language
|
|
253
|
-
# Load a language from a shared library path
|
|
254
|
-
def self.from_library: (String path, ?symbol: String?, ?name: String?) -> untyped
|
|
255
|
-
|
|
256
|
-
# Alias for from_library
|
|
257
|
-
def self.from_path: (String path) -> untyped
|
|
258
|
-
end
|
|
259
|
-
|
|
260
|
-
class Parser
|
|
261
|
-
# Create a new parser instance
|
|
262
|
-
def initialize: () -> void
|
|
263
|
-
|
|
264
|
-
# Set the language for this parser
|
|
265
|
-
def language=: (untyped lang) -> untyped
|
|
266
|
-
|
|
267
|
-
# Parse source code
|
|
268
|
-
def parse: (String source) -> untyped
|
|
269
|
-
|
|
270
|
-
# Parse source code with optional incremental parsing
|
|
271
|
-
def parse_string: (untyped? old_tree, String source) -> untyped
|
|
272
|
-
|
|
273
|
-
private
|
|
274
|
-
|
|
275
|
-
@parser: untyped
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
class Tree
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
class Node
|
|
282
|
-
end
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
# Citrus backend using pure Ruby Citrus parser
|
|
286
|
-
module Citrus
|
|
287
|
-
# Check if the Citrus backend is available
|
|
288
|
-
def self.available?: () -> bool
|
|
289
|
-
|
|
290
|
-
# Reset the load state (for testing)
|
|
291
|
-
def self.reset!: () -> void
|
|
292
|
-
|
|
293
|
-
# Get capabilities supported by this backend
|
|
294
|
-
def self.capabilities: () -> Hash[Symbol, untyped]
|
|
295
|
-
|
|
296
|
-
class Language
|
|
297
|
-
attr_reader grammar_module: untyped
|
|
298
|
-
|
|
299
|
-
# Create a new language from a Citrus grammar module
|
|
300
|
-
def initialize: (untyped grammar_module) -> void
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
class Parser
|
|
304
|
-
# Create a new parser instance
|
|
305
|
-
def initialize: () -> void
|
|
306
|
-
|
|
307
|
-
# Set the grammar for this parser
|
|
308
|
-
def language=: (Language | untyped grammar) -> (Language | untyped)
|
|
309
|
-
|
|
310
|
-
# Parse source code
|
|
311
|
-
def parse: (String source) -> untyped
|
|
312
|
-
|
|
313
|
-
private
|
|
314
|
-
|
|
315
|
-
@grammar: untyped
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
class Tree
|
|
319
|
-
attr_reader root_match: untyped
|
|
320
|
-
attr_reader source: String
|
|
321
|
-
|
|
322
|
-
def initialize: (untyped root_match, String source) -> void
|
|
323
|
-
|
|
324
|
-
def root_node: () -> Node
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
class Node
|
|
328
|
-
attr_reader match: untyped
|
|
329
|
-
attr_reader source: String
|
|
330
|
-
|
|
331
|
-
def initialize: (untyped match, String source) -> void
|
|
332
|
-
|
|
333
|
-
def type: () -> String
|
|
334
|
-
|
|
335
|
-
def start_byte: () -> Integer
|
|
336
|
-
|
|
337
|
-
def end_byte: () -> Integer
|
|
338
|
-
|
|
339
|
-
def text: () -> String
|
|
340
|
-
|
|
341
|
-
def child_count: () -> Integer
|
|
342
|
-
|
|
343
|
-
def child: (Integer index) -> Node?
|
|
344
|
-
|
|
345
|
-
def children: () -> Array[Node]
|
|
346
|
-
|
|
347
|
-
def each: () { (Node) -> void } -> void
|
|
348
|
-
| () -> Enumerator[Node, nil]
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
end
|
|
352
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Type signatures for TreeHaver::GrammarFinder
|
|
2
|
-
module TreeHaver
|
|
3
|
-
# Generic utility for finding tree-sitter grammar shared libraries
|
|
4
|
-
class GrammarFinder
|
|
5
|
-
BASE_SEARCH_DIRS: Array[String]
|
|
6
|
-
|
|
7
|
-
attr_reader language_name: Symbol
|
|
8
|
-
attr_reader extra_paths: Array[String]
|
|
9
|
-
|
|
10
|
-
def initialize: (Symbol | String language_name, ?extra_paths: Array[String], ?validate: bool) -> void
|
|
11
|
-
|
|
12
|
-
def env_var_name: () -> String
|
|
13
|
-
def symbol_name: () -> String
|
|
14
|
-
def library_filename: () -> String
|
|
15
|
-
def search_paths: () -> Array[String]
|
|
16
|
-
def find_library_path: () -> String?
|
|
17
|
-
def find_library_path_safe: () -> String?
|
|
18
|
-
def available?: () -> bool
|
|
19
|
-
def available_safe?: () -> bool
|
|
20
|
-
def register!: (?raise_on_missing: bool) -> bool
|
|
21
|
-
def search_info: () -> Hash[Symbol, untyped]
|
|
22
|
-
def not_found_message: () -> String
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def platform_extension: () -> String
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Type signatures for TreeHaver::PathValidator
|
|
2
|
-
module TreeHaver
|
|
3
|
-
# Security utilities for validating paths before loading shared libraries
|
|
4
|
-
module PathValidator
|
|
5
|
-
ALLOWED_EXTENSIONS: Array[String]
|
|
6
|
-
DEFAULT_TRUSTED_DIRECTORIES: Array[String]
|
|
7
|
-
TRUSTED_DIRS_ENV_VAR: String
|
|
8
|
-
MAX_PATH_LENGTH: Integer
|
|
9
|
-
VALID_FILENAME_PATTERN: Regexp
|
|
10
|
-
VALID_LANGUAGE_PATTERN: Regexp
|
|
11
|
-
VALID_SYMBOL_PATTERN: Regexp
|
|
12
|
-
|
|
13
|
-
# Trusted directory management
|
|
14
|
-
def self.trusted_directories: () -> Array[String]
|
|
15
|
-
def self.add_trusted_directory: (String directory) -> void
|
|
16
|
-
def self.remove_trusted_directory: (String directory) -> void
|
|
17
|
-
def self.clear_custom_trusted_directories!: () -> void
|
|
18
|
-
def self.custom_trusted_directories: () -> Array[String]
|
|
19
|
-
|
|
20
|
-
# Validation methods
|
|
21
|
-
def self.safe_library_path?: (String? path, ?require_trusted_dir: bool) -> bool
|
|
22
|
-
def self.in_trusted_directory?: (String? path) -> bool
|
|
23
|
-
def self.safe_language_name?: (String | Symbol | nil name) -> bool
|
|
24
|
-
def self.safe_symbol_name?: (String? symbol) -> bool
|
|
25
|
-
def self.safe_backend_name?: (String | Symbol | nil backend) -> bool
|
|
26
|
-
def self.sanitize_language_name: (String | Symbol | nil name) -> Symbol?
|
|
27
|
-
def self.validation_errors: (String? path) -> Array[String]
|
|
28
|
-
def self.windows_absolute_path?: (String path) -> bool
|
|
29
|
-
def self.has_valid_extension?: (String path) -> bool
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
data/sig/tree_haver.rbs
DELETED
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
# Type definitions for TreeHaver
|
|
2
|
-
#
|
|
3
|
-
# TreeHaver is a cross-Ruby adapter for code parsing with 10 backends:
|
|
4
|
-
# - Tree-sitter: MRI, Rust, FFI, Java
|
|
5
|
-
# - Native parsers: Prism (Ruby), Psych (YAML), Commonmarker (Markdown), Markly (GFM)
|
|
6
|
-
# - Pure Ruby: Citrus
|
|
7
|
-
|
|
8
|
-
module TreeHaver
|
|
9
|
-
VERSION: String
|
|
10
|
-
|
|
11
|
-
# Base error class
|
|
12
|
-
class Error < StandardError
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Raised when a backend or feature is not available
|
|
16
|
-
class NotAvailable < Error
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# Module namespace for backend implementations
|
|
20
|
-
module Backends
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Get the current backend selection
|
|
24
|
-
def self.backend: () -> Symbol
|
|
25
|
-
|
|
26
|
-
# Set the backend to use
|
|
27
|
-
def self.backend=: (Symbol | String | nil name) -> (Symbol | nil)
|
|
28
|
-
|
|
29
|
-
# Reset backend selection memoization
|
|
30
|
-
def self.reset_backend!: (?to: Symbol | String | nil) -> void
|
|
31
|
-
|
|
32
|
-
# Determine the concrete backend module to use
|
|
33
|
-
def self.backend_module: () -> Module?
|
|
34
|
-
|
|
35
|
-
# Get capabilities of the current backend
|
|
36
|
-
def self.capabilities: () -> Hash[Symbol, untyped]
|
|
37
|
-
|
|
38
|
-
# Register a language helper by name
|
|
39
|
-
def self.register_language: (Symbol | String name, path: String, ?symbol: String?) -> void
|
|
40
|
-
|
|
41
|
-
# Unregister a previously registered language helper
|
|
42
|
-
def self.unregister_language: (Symbol | String name) -> void
|
|
43
|
-
|
|
44
|
-
# Clear all registered languages
|
|
45
|
-
def self.clear_languages!: () -> void
|
|
46
|
-
|
|
47
|
-
# Fetch a registered language entry
|
|
48
|
-
def self.registered_language: (Symbol | String name) -> Hash[Symbol, String?]?
|
|
49
|
-
|
|
50
|
-
# Represents a tree-sitter language grammar
|
|
51
|
-
class Language
|
|
52
|
-
# Load a language grammar from a shared library
|
|
53
|
-
def self.from_library: (String path, ?symbol: String?, ?name: String?) -> Language
|
|
54
|
-
|
|
55
|
-
# Alias for from_library
|
|
56
|
-
def self.from_path: (String path, ?symbol: String?, ?name: String?) -> Language
|
|
57
|
-
|
|
58
|
-
def self.method_missing: (Symbol method_name, *untyped args, **untyped kwargs) ?{ () -> untyped } -> Language
|
|
59
|
-
|
|
60
|
-
def self.respond_to_missing?: (Symbol method_name, ?bool include_private) -> bool
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Represents a tree-sitter parser instance
|
|
64
|
-
class Parser
|
|
65
|
-
# Create a new parser instance
|
|
66
|
-
def initialize: () -> void
|
|
67
|
-
|
|
68
|
-
# Set the language grammar for this parser
|
|
69
|
-
def language=: (Language lang) -> Language
|
|
70
|
-
|
|
71
|
-
# Parse source code into a syntax tree
|
|
72
|
-
def parse: (String source) -> Tree
|
|
73
|
-
|
|
74
|
-
# Parse with optional incremental parsing support
|
|
75
|
-
def parse_string: (Tree? old_tree, String source) -> Tree
|
|
76
|
-
|
|
77
|
-
private
|
|
78
|
-
|
|
79
|
-
@impl: untyped
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Represents a parsed syntax tree
|
|
83
|
-
class Tree
|
|
84
|
-
attr_reader inner_tree: untyped
|
|
85
|
-
attr_reader source: String?
|
|
86
|
-
|
|
87
|
-
# Get the root node of the syntax tree
|
|
88
|
-
def root_node: () -> Node?
|
|
89
|
-
|
|
90
|
-
# Edit the tree for incremental parsing
|
|
91
|
-
def edit: (
|
|
92
|
-
start_byte: Integer,
|
|
93
|
-
old_end_byte: Integer,
|
|
94
|
-
new_end_byte: Integer,
|
|
95
|
-
start_point: Hash[Symbol, Integer],
|
|
96
|
-
old_end_point: Hash[Symbol, Integer],
|
|
97
|
-
new_end_point: Hash[Symbol, Integer]
|
|
98
|
-
) -> void
|
|
99
|
-
|
|
100
|
-
# Check if the current backend supports incremental parsing
|
|
101
|
-
def supports_editing?: () -> bool
|
|
102
|
-
|
|
103
|
-
# String representation
|
|
104
|
-
def inspect: () -> String
|
|
105
|
-
|
|
106
|
-
# Check if tree responds to a method (includes delegation to inner_tree)
|
|
107
|
-
def respond_to_missing?: (Symbol method_name, ?bool include_private) -> bool
|
|
108
|
-
|
|
109
|
-
# Delegate unknown methods to the underlying backend-specific tree
|
|
110
|
-
def method_missing: (Symbol method_name, *untyped args, **untyped kwargs) ?{ () -> untyped } -> untyped
|
|
111
|
-
|
|
112
|
-
private
|
|
113
|
-
|
|
114
|
-
def initialize: (untyped inner_tree, ?source: String?) -> void
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Represents a node in the syntax tree
|
|
118
|
-
class Node
|
|
119
|
-
attr_reader inner_node: untyped
|
|
120
|
-
attr_reader source: String?
|
|
121
|
-
|
|
122
|
-
# Get the type name of this node
|
|
123
|
-
def type: () -> String
|
|
124
|
-
|
|
125
|
-
# Get the text content of this node
|
|
126
|
-
def text: () -> String?
|
|
127
|
-
|
|
128
|
-
# Get the start byte offset
|
|
129
|
-
def start_byte: () -> Integer
|
|
130
|
-
|
|
131
|
-
# Get the end byte offset
|
|
132
|
-
def end_byte: () -> Integer
|
|
133
|
-
|
|
134
|
-
# Get the start point (row, column)
|
|
135
|
-
def start_point: () -> Point
|
|
136
|
-
|
|
137
|
-
# Get the end point (row, column)
|
|
138
|
-
def end_point: () -> Point
|
|
139
|
-
|
|
140
|
-
# Position API - consistent across all backends
|
|
141
|
-
# Get 1-based line number where node starts
|
|
142
|
-
def start_line: () -> Integer
|
|
143
|
-
|
|
144
|
-
# Get 1-based line number where node ends
|
|
145
|
-
def end_line: () -> Integer
|
|
146
|
-
|
|
147
|
-
# Get complete position information as hash
|
|
148
|
-
# Returns {start_line:, end_line:, start_column:, end_column:}
|
|
149
|
-
def source_position: () -> Hash[Symbol, Integer]
|
|
150
|
-
|
|
151
|
-
# Get first child node (convenience method)
|
|
152
|
-
def first_child: () -> Node?
|
|
153
|
-
|
|
154
|
-
# Get the number of child nodes
|
|
155
|
-
def child_count: () -> Integer
|
|
156
|
-
|
|
157
|
-
# Get a child node by index
|
|
158
|
-
def child: (Integer index) -> Node?
|
|
159
|
-
|
|
160
|
-
# Get all children as an array
|
|
161
|
-
def children: () -> Array[Node]
|
|
162
|
-
|
|
163
|
-
# Iterate over child nodes
|
|
164
|
-
def each: () { (Node child) -> void } -> nil
|
|
165
|
-
| () -> Enumerator[Node, nil]
|
|
166
|
-
|
|
167
|
-
# Get a named child by field name
|
|
168
|
-
def child_by_field_name: (String | Symbol field_name) -> Node?
|
|
169
|
-
|
|
170
|
-
# Get the parent node
|
|
171
|
-
def parent: () -> Node?
|
|
172
|
-
|
|
173
|
-
# Get the next sibling node
|
|
174
|
-
def next_sibling: () -> Node?
|
|
175
|
-
|
|
176
|
-
# Get the previous sibling node
|
|
177
|
-
def prev_sibling: () -> Node?
|
|
178
|
-
|
|
179
|
-
# Check if node responds to a method (includes delegation to inner_node)
|
|
180
|
-
def respond_to_missing?: (Symbol method_name, ?bool include_private) -> bool
|
|
181
|
-
|
|
182
|
-
# Delegate unknown methods to the underlying backend-specific node
|
|
183
|
-
def method_missing: (Symbol method_name, *untyped args, **untyped kwargs) ?{ () -> untyped } -> untyped
|
|
184
|
-
|
|
185
|
-
private
|
|
186
|
-
|
|
187
|
-
def initialize: (untyped inner_node, ?source: String?) -> void
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
# Position in source code that works as both object and hash
|
|
191
|
-
class Point
|
|
192
|
-
attr_reader row: Integer
|
|
193
|
-
attr_reader column: Integer
|
|
194
|
-
|
|
195
|
-
def initialize: (row: Integer, column: Integer) -> void
|
|
196
|
-
|
|
197
|
-
# Hash-style access
|
|
198
|
-
def []: (Symbol key) -> Integer?
|
|
199
|
-
|
|
200
|
-
# Convert to hash
|
|
201
|
-
def to_h: () -> Hash[Symbol, Integer]
|
|
202
|
-
|
|
203
|
-
# String representation
|
|
204
|
-
def inspect: () -> String
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
# Thread-safe language registrations and cache
|
|
208
|
-
module LanguageRegistry
|
|
209
|
-
# Register a language helper by name
|
|
210
|
-
def self.register: (Symbol | String name, path: String, ?symbol: String?) -> void
|
|
211
|
-
|
|
212
|
-
# Unregister a previously registered language helper
|
|
213
|
-
def self.unregister: (Symbol | String name) -> void
|
|
214
|
-
|
|
215
|
-
# Fetch a registration entry
|
|
216
|
-
def self.registered: (Symbol | String name) -> Hash[Symbol, String?]?
|
|
217
|
-
|
|
218
|
-
# Clear all registrations
|
|
219
|
-
def self.clear_registrations!: () -> void
|
|
220
|
-
|
|
221
|
-
# Fetch a cached language by key or compute and store it
|
|
222
|
-
def self.fetch: [T] (Array[untyped] key) { () -> T } -> T
|
|
223
|
-
|
|
224
|
-
# Clear the language cache
|
|
225
|
-
def self.clear_cache!: () -> void
|
|
226
|
-
|
|
227
|
-
# Clear everything (registrations and cache)
|
|
228
|
-
def self.clear_all!: () -> void
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
module Version
|
|
232
|
-
VERSION: String
|
|
233
|
-
end
|
|
234
|
-
end
|