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:



473
474
475
476
# File 'lib/tree_haver/backends/java.rb', line 473

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).

Parameters:

  • lang (Object)

    the Java language object (already unwrapped)



485
486
487
488
# File 'lib/tree_haver/backends/java.rb', line 485

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

#parse(source) ⇒ Tree

Parse source code

Parameters:

  • source (String)

    the source code to parse

Returns:

  • (Tree)

    raw backend tree (wrapping happens in TreeHaver::Parser)

Raises:



494
495
496
497
498
499
500
# File 'lib/tree_haver/backends/java.rb', line 494

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.

Parameters:

  • old_tree (Tree, nil)

    previous backend tree for incremental parsing (already unwrapped)

  • source (String)

    the source code to parse

Returns:

  • (Tree)

    raw backend tree (wrapping happens in TreeHaver::Parser)

Raises:

See Also:



514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
# File 'lib/tree_haver/backends/java.rb', line 514

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