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.
@@ -17,18 +17,27 @@ module TreeHaver
17
17
  #
18
18
  # == Tree/Node Architecture
19
19
  #
20
- # This backend (like all tree-sitter backends: MRI, Rust, FFI, Java) does NOT
21
- # define its own Tree or Node classes at the Ruby level. Instead:
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
- # - Parser#parse returns raw Java tree objects (via JRuby interop)
24
- # - These are wrapped by `TreeHaver::Tree` (inherits from `Base::Tree`)
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
- # This differs from pure-Ruby backends (Citrus, Prism, Psych) which define
28
- # their own `Backend::X::Tree` and `Backend::X::Node` classes.
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
- # @see TreeHaver::Tree The wrapper class for tree-sitter Tree objects
31
- # @see TreeHaver::Node The wrapper class for tree-sitter Node objects
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
- # Wrapper for java-tree-sitter Language
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
- # Wrapper for java-tree-sitter Parser
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
- # Wrapper for java-tree-sitter Tree
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
- # Wrapper for java-tree-sitter Node
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