tree_haver 4.0.4 → 5.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/CHANGELOG.md +193 -2
- data/README.md +497 -356
- data/lib/tree_haver/backends/citrus.rb +98 -114
- data/lib/tree_haver/backends/ffi.rb +257 -14
- data/lib/tree_haver/backends/java.rb +99 -14
- data/lib/tree_haver/backends/mri.rb +25 -1
- data/lib/tree_haver/backends/parslet.rb +560 -0
- data/lib/tree_haver/backends/prism.rb +1 -1
- data/lib/tree_haver/backends/psych.rb +1 -1
- data/lib/tree_haver/backends/rust.rb +1 -1
- data/lib/tree_haver/base/node.rb +8 -1
- data/lib/tree_haver/grammar_finder.rb +1 -3
- data/lib/tree_haver/language.rb +46 -21
- data/lib/tree_haver/parser.rb +129 -45
- data/lib/tree_haver/parslet_grammar_finder.rb +224 -0
- data/lib/tree_haver/point.rb +6 -44
- data/lib/tree_haver/rspec/dependency_tags.rb +115 -19
- data/lib/tree_haver/version.rb +1 -1
- data/lib/tree_haver.rb +100 -13
- data.tar.gz.sig +0 -0
- metadata +15 -14
- metadata.gz.sig +0 -0
|
@@ -17,18 +17,27 @@ module TreeHaver
|
|
|
17
17
|
#
|
|
18
18
|
# == Tree/Node Architecture
|
|
19
19
|
#
|
|
20
|
-
# This backend
|
|
21
|
-
#
|
|
20
|
+
# This backend defines Ruby wrapper classes (`Java::Language`, `Java::Parser`,
|
|
21
|
+
# `Java::Tree`, `Java::Node`) that wrap the raw jtreesitter Java objects via
|
|
22
|
+
# JRuby's Java interop. These are **raw backend wrappers** not intended for
|
|
23
|
+
# direct use by application code.
|
|
22
24
|
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
# - `TreeHaver::Tree#root_node` wraps raw nodes in `TreeHaver::Node`
|
|
25
|
+
# The wrapping hierarchy is:
|
|
26
|
+
# Java::Tree/Node (this backend) → TreeHaver::Tree/Node → Base::Tree/Node
|
|
26
27
|
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
28
|
+
# When you use `TreeHaver::Parser#parse`:
|
|
29
|
+
# 1. `Java::Parser#parse` returns a `Java::Tree` (wrapper around jtreesitter Tree)
|
|
30
|
+
# 2. `TreeHaver::Parser` wraps it in `TreeHaver::Tree` (adds source storage)
|
|
31
|
+
# 3. `TreeHaver::Tree#root_node` wraps `Java::Node` in `TreeHaver::Node`
|
|
29
32
|
#
|
|
30
|
-
#
|
|
31
|
-
#
|
|
33
|
+
# The `TreeHaver::Tree` and `TreeHaver::Node` wrappers provide the full unified
|
|
34
|
+
# API including `#children`, `#text`, `#source`, `#source_position`, etc.
|
|
35
|
+
#
|
|
36
|
+
# This differs from pure-Ruby backends (Citrus, Parslet, Prism, Psych) which
|
|
37
|
+
# define Tree/Node classes that directly inherit from Base::Tree/Base::Node.
|
|
38
|
+
#
|
|
39
|
+
# @see TreeHaver::Tree The wrapper class users should interact with
|
|
40
|
+
# @see TreeHaver::Node The wrapper class users should interact with
|
|
32
41
|
# @see TreeHaver::Base::Tree Base class documenting the Tree API contract
|
|
33
42
|
# @see TreeHaver::Base::Node Base class documenting the Node API contract
|
|
34
43
|
#
|
|
@@ -228,8 +237,17 @@ module TreeHaver
|
|
|
228
237
|
# :nocov:
|
|
229
238
|
end
|
|
230
239
|
|
|
231
|
-
#
|
|
240
|
+
# Java backend language wrapper (raw backend language)
|
|
241
|
+
#
|
|
242
|
+
# This is a **raw backend language** that wraps a jtreesitter Language object
|
|
243
|
+
# via JRuby's Java interop. It is used to configure the parser for a specific
|
|
244
|
+
# grammar (e.g., TOML, JSON, etc.).
|
|
232
245
|
#
|
|
246
|
+
# Unlike `TreeHaver::Language` (which is a module with factory methods), this
|
|
247
|
+
# class holds the actual loaded language data from a grammar shared library.
|
|
248
|
+
#
|
|
249
|
+
# @api private
|
|
250
|
+
# @see TreeHaver::Language The factory module users should interact with
|
|
233
251
|
# @see https://tree-sitter.github.io/java-tree-sitter/io/github/treesitter/jtreesitter/Language.html
|
|
234
252
|
#
|
|
235
253
|
# :nocov:
|
|
@@ -456,8 +474,19 @@ module TreeHaver
|
|
|
456
474
|
end
|
|
457
475
|
end
|
|
458
476
|
|
|
459
|
-
#
|
|
477
|
+
# Java backend parser wrapper (raw backend parser)
|
|
478
|
+
#
|
|
479
|
+
# This is a **raw backend parser** that wraps a jtreesitter Parser object via
|
|
480
|
+
# JRuby's Java interop. It is NOT intended for direct use by application code.
|
|
460
481
|
#
|
|
482
|
+
# Users should use `TreeHaver::Parser` which wraps this class and provides:
|
|
483
|
+
# - Automatic backend selection
|
|
484
|
+
# - Language wrapper unwrapping
|
|
485
|
+
# - Tree wrapping with source storage
|
|
486
|
+
# - Unified API across all backends
|
|
487
|
+
#
|
|
488
|
+
# @api private
|
|
489
|
+
# @see TreeHaver::Parser The wrapper class users should interact with
|
|
461
490
|
# @see https://tree-sitter.github.io/java-tree-sitter/io/github/treesitter/jtreesitter/Parser.html
|
|
462
491
|
class Parser
|
|
463
492
|
# Create a new parser instance
|
|
@@ -543,8 +572,35 @@ module TreeHaver
|
|
|
543
572
|
end
|
|
544
573
|
end
|
|
545
574
|
|
|
546
|
-
#
|
|
575
|
+
# Java backend tree wrapper (raw backend tree)
|
|
576
|
+
#
|
|
577
|
+
# This is a **raw backend tree** that wraps a jtreesitter Tree object via
|
|
578
|
+
# JRuby's Java interop. It is NOT intended for direct use by application code.
|
|
579
|
+
#
|
|
580
|
+
# == Architecture Note
|
|
581
|
+
#
|
|
582
|
+
# Unlike pure-Ruby backends (Citrus, Parslet, Prism, Psych) which define Tree
|
|
583
|
+
# classes that inherit from `TreeHaver::Base::Tree`, tree-sitter backends (MRI,
|
|
584
|
+
# Rust, FFI, Java) define raw wrapper classes that get wrapped by `TreeHaver::Tree`.
|
|
547
585
|
#
|
|
586
|
+
# The wrapping hierarchy is:
|
|
587
|
+
# Java::Tree (this class) → TreeHaver::Tree → Base::Tree
|
|
588
|
+
#
|
|
589
|
+
# When you use `TreeHaver::Parser#parse`, the returned tree is already wrapped
|
|
590
|
+
# in `TreeHaver::Tree`, which provides the full unified API including:
|
|
591
|
+
# - `#source` - The original source text
|
|
592
|
+
# - `#root_node` - Returns a `TreeHaver::Node` (not raw `Java::Node`)
|
|
593
|
+
# - `#errors`, `#warnings`, `#comments` - Parse diagnostics
|
|
594
|
+
# - `#edit` - Mark tree as edited for incremental parsing
|
|
595
|
+
# - `#to_s`, `#inspect` - String representations
|
|
596
|
+
#
|
|
597
|
+
# This raw class only implements methods that require direct calls to jtreesitter.
|
|
598
|
+
# The wrapper adds Ruby-level conveniences and stores the source text needed for
|
|
599
|
+
# `Node#text` extraction.
|
|
600
|
+
#
|
|
601
|
+
# @api private
|
|
602
|
+
# @see TreeHaver::Tree The wrapper class users should interact with
|
|
603
|
+
# @see TreeHaver::Base::Tree The base class documenting the full Tree API
|
|
548
604
|
# @see https://tree-sitter.github.io/java-tree-sitter/io/github/treesitter/jtreesitter/Tree.html
|
|
549
605
|
class Tree
|
|
550
606
|
attr_reader :impl
|
|
@@ -601,8 +657,37 @@ module TreeHaver
|
|
|
601
657
|
end
|
|
602
658
|
end
|
|
603
659
|
|
|
604
|
-
#
|
|
660
|
+
# Java backend node wrapper (raw backend node)
|
|
661
|
+
#
|
|
662
|
+
# This is a **raw backend node** that wraps a jtreesitter Node object via
|
|
663
|
+
# JRuby's Java interop. It provides the minimal interface needed for tree-sitter
|
|
664
|
+
# operations but is NOT intended for direct use by application code.
|
|
665
|
+
#
|
|
666
|
+
# == Architecture Note
|
|
605
667
|
#
|
|
668
|
+
# Unlike pure-Ruby backends (Citrus, Parslet, Prism, Psych) which define Node
|
|
669
|
+
# classes that inherit from `TreeHaver::Base::Node`, tree-sitter backends (MRI,
|
|
670
|
+
# Rust, FFI, Java) define raw wrapper classes that get wrapped by `TreeHaver::Node`.
|
|
671
|
+
#
|
|
672
|
+
# The wrapping hierarchy is:
|
|
673
|
+
# Java::Node (this class) → TreeHaver::Node → Base::Node
|
|
674
|
+
#
|
|
675
|
+
# When you use `TreeHaver::Parser#parse`, the returned tree's nodes are already
|
|
676
|
+
# wrapped in `TreeHaver::Node`, which provides the full unified API including:
|
|
677
|
+
# - `#children` - Array of child nodes
|
|
678
|
+
# - `#text` - Extract text from source
|
|
679
|
+
# - `#first_child`, `#last_child` - Convenience accessors
|
|
680
|
+
# - `#start_line`, `#end_line` - 1-based line numbers
|
|
681
|
+
# - `#source_position` - Hash with position info
|
|
682
|
+
# - `#each`, `#map`, etc. - Enumerable methods
|
|
683
|
+
# - `#to_s`, `#inspect` - String representations
|
|
684
|
+
#
|
|
685
|
+
# This raw class only implements methods that require direct calls to jtreesitter.
|
|
686
|
+
# The wrapper adds Ruby-level conveniences.
|
|
687
|
+
#
|
|
688
|
+
# @api private
|
|
689
|
+
# @see TreeHaver::Node The wrapper class users should interact with
|
|
690
|
+
# @see TreeHaver::Base::Node The base class documenting the full Node API
|
|
606
691
|
# @see https://tree-sitter.github.io/java-tree-sitter/io/github/treesitter/jtreesitter/Node.html
|
|
607
692
|
class Node
|
|
608
693
|
attr_reader :impl
|
|
@@ -799,7 +884,7 @@ module TreeHaver
|
|
|
799
884
|
end
|
|
800
885
|
# :nocov:
|
|
801
886
|
|
|
802
|
-
# Register availability checker for RSpec dependency tags
|
|
887
|
+
# Register the availability checker for RSpec dependency tags
|
|
803
888
|
TreeHaver::BackendRegistry.register_availability_checker(:java) do
|
|
804
889
|
available?
|
|
805
890
|
end
|
|
@@ -142,6 +142,30 @@ module TreeHaver
|
|
|
142
142
|
@symbol = symbol
|
|
143
143
|
end
|
|
144
144
|
|
|
145
|
+
# Get the language name
|
|
146
|
+
#
|
|
147
|
+
# Derives a name from the symbol or path.
|
|
148
|
+
#
|
|
149
|
+
# @return [Symbol] language name
|
|
150
|
+
def language_name
|
|
151
|
+
# Try to derive from symbol (e.g., "tree_sitter_toml" -> :toml)
|
|
152
|
+
if @symbol
|
|
153
|
+
name = @symbol.to_s.sub(/^tree_sitter_/, "")
|
|
154
|
+
return name.to_sym
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Try to derive from path (e.g., "/path/to/libtree-sitter-toml.so" -> :toml)
|
|
158
|
+
if @path
|
|
159
|
+
name = LibraryPathUtils.derive_language_name_from_path(@path)
|
|
160
|
+
return name.to_sym if name
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
:unknown
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Alias for language_name (API compatibility)
|
|
167
|
+
alias_method :name, :language_name
|
|
168
|
+
|
|
145
169
|
# Compare languages for equality
|
|
146
170
|
#
|
|
147
171
|
# MRI languages are equal if they have the same backend, path, and symbol.
|
|
@@ -329,7 +353,7 @@ module TreeHaver
|
|
|
329
353
|
end
|
|
330
354
|
end
|
|
331
355
|
|
|
332
|
-
# Register availability checker for RSpec dependency tags
|
|
356
|
+
# Register the availability checker for RSpec dependency tags
|
|
333
357
|
TreeHaver::BackendRegistry.register_availability_checker(:mri) do
|
|
334
358
|
available?
|
|
335
359
|
end
|