Class: TreeHaver::Backends::Java::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/tree_haver/backends/java.rb

Overview

Wrapper for java-tree-sitter Parser

Instance Method Summary collapse

Constructor Details

#initializeParser

Create a new parser instance

Raises:



466
467
468
469
# File 'lib/tree_haver/backends/java.rb', line 466

def initialize
  raise TreeHaver::NotAvailable, "Java backend not available" unless Java.available?
  @parser = Java.java_classes[:Parser].new
end

Instance Method Details

#language=(lang) ⇒ void

This method returns an undefined value.

Set the language for this parser

Note: TreeHaver::Parser unwraps language objects before calling this method. This backend receives the Language wrapper’s inner impl (java Language object).



478
479
480
481
# File 'lib/tree_haver/backends/java.rb', line 478

def language=(lang)
  # lang is already unwrapped by TreeHaver::Parser
  @parser.language = lang
end

#parse(source) ⇒ Tree

Parse source code

Raises:



487
488
489
490
491
492
493
# File 'lib/tree_haver/backends/java.rb', line 487

def parse(source)
  java_result = @parser.parse(source)
  # jtreesitter 0.26.0 returns Optional<Tree>
  java_tree = unwrap_optional(java_result)
  raise TreeHaver::Error, "Parser returned no tree" unless java_tree
  Tree.new(java_tree)
end

#parse_string(old_tree, source) ⇒ Tree

Parse source code with optional incremental parsing

Note: old_tree is already unwrapped by TreeHaver::Parser before reaching this method. The backend receives the raw Tree wrapper’s impl, not a TreeHaver::Tree.

When old_tree is provided and has been edited, tree-sitter will reuse unchanged nodes for better performance.



507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
# File 'lib/tree_haver/backends/java.rb', line 507

def parse_string(old_tree, source)
  # old_tree is already unwrapped to Tree wrapper's impl by TreeHaver::Parser
  if old_tree
    # Get the actual Java Tree object
    java_old_tree = if old_tree.is_a?(Tree)
      old_tree.impl
    else
      unwrap_optional(old_tree)
    end

    java_result = if java_old_tree
      # jtreesitter 0.26.0 API: parse(String source, Tree oldTree)
      @parser.parse(source, java_old_tree)
    else
      @parser.parse(source)
    end
  else
    java_result = @parser.parse(source)
  end
  # jtreesitter 0.26.0 returns Optional<Tree>
  java_tree = unwrap_optional(java_result)
  raise TreeHaver::Error, "Parser returned no tree" unless java_tree
  Tree.new(java_tree)
end