tree_haver 5.0.5 → 7.1.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE.md +13 -0
  4. data/README.md +299 -660
  5. data/lib/tree_haver/backend_api.rb +78 -35
  6. data/lib/tree_haver/backend_context.rb +28 -0
  7. data/lib/tree_haver/backend_registry.rb +119 -382
  8. data/lib/tree_haver/backends/citrus.rb +55 -53
  9. data/lib/tree_haver/backends/ffi.rb +105 -101
  10. data/lib/tree_haver/backends/java.rb +92 -76
  11. data/lib/tree_haver/backends/mri.rb +44 -39
  12. data/lib/tree_haver/backends/parslet.rb +53 -48
  13. data/lib/tree_haver/backends/prism.rb +140 -43
  14. data/lib/tree_haver/backends/psych.rb +30 -26
  15. data/lib/tree_haver/backends/rust.rb +21 -17
  16. data/lib/tree_haver/backends/tslp.rb +274 -0
  17. data/lib/tree_haver/base/comment.rb +320 -0
  18. data/lib/tree_haver/base/language.rb +2 -2
  19. data/lib/tree_haver/base/node.rb +39 -31
  20. data/lib/tree_haver/base/parser.rb +4 -0
  21. data/lib/tree_haver/base/point.rb +3 -3
  22. data/lib/tree_haver/base/tree.rb +1 -1
  23. data/lib/tree_haver/citrus_grammar_finder.rb +21 -26
  24. data/lib/tree_haver/contracts.rb +1025 -0
  25. data/lib/tree_haver/grammar_finder.rb +125 -70
  26. data/lib/tree_haver/kaitai_backend.rb +30 -0
  27. data/lib/tree_haver/language.rb +36 -37
  28. data/lib/tree_haver/language_pack.rb +41 -0
  29. data/lib/tree_haver/language_registry.rb +34 -3
  30. data/lib/tree_haver/library_path_utils.rb +7 -7
  31. data/lib/tree_haver/node.rb +40 -31
  32. data/lib/tree_haver/parser.rb +44 -37
  33. data/lib/tree_haver/parslet_grammar_finder.rb +19 -26
  34. data/lib/tree_haver/path_validator.rb +39 -36
  35. data/lib/tree_haver/peg_backends.rb +76 -0
  36. data/lib/tree_haver/rspec/dependency_tags.rb +23 -1363
  37. data/lib/tree_haver/rspec.rb +1 -31
  38. data/lib/tree_haver/tree.rb +16 -7
  39. data/lib/tree_haver/version.rb +5 -14
  40. data/lib/tree_haver.rb +536 -1240
  41. data/sig/tree_haver.rbs +1 -229
  42. data.tar.gz.sig +0 -0
  43. metadata +154 -70
  44. metadata.gz.sig +0 -0
  45. data/CHANGELOG.md +0 -1393
  46. data/CITATION.cff +0 -20
  47. data/CODE_OF_CONDUCT.md +0 -134
  48. data/CONTRIBUTING.md +0 -359
  49. data/FUNDING.md +0 -74
  50. data/LICENSE.txt +0 -21
  51. data/REEK +0 -0
  52. data/RUBOCOP.md +0 -71
  53. data/SECURITY.md +0 -21
  54. data/lib/tree_haver/base.rb +0 -12
  55. data/lib/tree_haver/compat.rb +0 -43
  56. data/lib/tree_haver/rspec/testable_node.rb +0 -217
  57. data/sig/tree_haver/backends.rbs +0 -352
  58. data/sig/tree_haver/grammar_finder.rbs +0 -29
  59. data/sig/tree_haver/path_validator.rbs +0 -32
@@ -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
-