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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/tree_haver/backend_context.rb +28 -0
  4. data/lib/tree_haver/backend_registry.rb +19 -432
  5. data/lib/tree_haver/contracts.rb +460 -0
  6. data/lib/tree_haver/kaitai_backend.rb +30 -0
  7. data/lib/tree_haver/language_pack.rb +190 -0
  8. data/lib/tree_haver/peg_backends.rb +76 -0
  9. data/lib/tree_haver/version.rb +1 -12
  10. data/lib/tree_haver.rb +7 -1316
  11. data.tar.gz.sig +0 -0
  12. metadata +34 -245
  13. metadata.gz.sig +0 -0
  14. data/CHANGELOG.md +0 -1366
  15. data/CITATION.cff +0 -20
  16. data/CODE_OF_CONDUCT.md +0 -134
  17. data/CONTRIBUTING.md +0 -359
  18. data/FUNDING.md +0 -74
  19. data/LICENSE.txt +0 -21
  20. data/README.md +0 -2347
  21. data/REEK +0 -0
  22. data/RUBOCOP.md +0 -71
  23. data/SECURITY.md +0 -21
  24. data/lib/tree_haver/backend_api.rb +0 -349
  25. data/lib/tree_haver/backends/citrus.rb +0 -487
  26. data/lib/tree_haver/backends/ffi.rb +0 -1009
  27. data/lib/tree_haver/backends/java.rb +0 -893
  28. data/lib/tree_haver/backends/mri.rb +0 -362
  29. data/lib/tree_haver/backends/parslet.rb +0 -560
  30. data/lib/tree_haver/backends/prism.rb +0 -471
  31. data/lib/tree_haver/backends/psych.rb +0 -375
  32. data/lib/tree_haver/backends/rust.rb +0 -239
  33. data/lib/tree_haver/base/language.rb +0 -98
  34. data/lib/tree_haver/base/node.rb +0 -322
  35. data/lib/tree_haver/base/parser.rb +0 -24
  36. data/lib/tree_haver/base/point.rb +0 -48
  37. data/lib/tree_haver/base/tree.rb +0 -128
  38. data/lib/tree_haver/base.rb +0 -12
  39. data/lib/tree_haver/citrus_grammar_finder.rb +0 -218
  40. data/lib/tree_haver/compat.rb +0 -43
  41. data/lib/tree_haver/grammar_finder.rb +0 -374
  42. data/lib/tree_haver/language.rb +0 -295
  43. data/lib/tree_haver/language_registry.rb +0 -190
  44. data/lib/tree_haver/library_path_utils.rb +0 -80
  45. data/lib/tree_haver/node.rb +0 -579
  46. data/lib/tree_haver/parser.rb +0 -438
  47. data/lib/tree_haver/parslet_grammar_finder.rb +0 -224
  48. data/lib/tree_haver/path_validator.rb +0 -353
  49. data/lib/tree_haver/point.rb +0 -27
  50. data/lib/tree_haver/rspec/dependency_tags.rb +0 -1392
  51. data/lib/tree_haver/rspec/testable_node.rb +0 -217
  52. data/lib/tree_haver/rspec.rb +0 -33
  53. data/lib/tree_haver/tree.rb +0 -258
  54. data/sig/tree_haver/backends.rbs +0 -352
  55. data/sig/tree_haver/grammar_finder.rbs +0 -29
  56. data/sig/tree_haver/path_validator.rbs +0 -32
  57. data/sig/tree_haver.rbs +0 -234
@@ -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