Module: TreeHaver::Backends::Tslp

Defined in:
lib/tree_haver/backends/tslp.rb

Overview

TSLP backend using tree_sitter_language_pack's on-demand parser API.

This backend intentionally requires the real parser API. The language-pack process API is not a TreeHaver parser backend and must not be used as a merge-gem integration surface.

Defined Under Namespace

Classes: Language, Node, Parser, Tree

Constant Summary collapse

PARSER_SMOKE_SOURCES =
{
  'json' => '{}',
  'json5' => '{}',
  'bash' => "echo tree_haver\n",
  'go' => "package main\nfunc main() {}\n",
  'html' => "<!doctype html>\n<title>TreeHaver</title>\n",
  'markdown' => "# TreeHaver\n",
  'ruby' => "class TreeHaverSmoke\nend\n",
  'rust' => "fn main() {}\n",
  'typescript' => "export const treeHaver = true;\n",
  'toml' => "title = \"tree_haver\"\n",
  'yaml' => "tree_haver: true\n"
}.freeze
DEFAULT_PARSER_SMOKE_SOURCE =
''

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.unavailable_reasonObject (readonly)

Returns the value of attribute unavailable_reason.



32
33
34
# File 'lib/tree_haver/backends/tslp.rb', line 32

def unavailable_reason
  @unavailable_reason
end

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/tree_haver/backends/tslp.rb', line 34

def available?
  return @loaded if @load_attempted

  @load_attempted = true
  begin
    require 'tree_sitter_language_pack' unless defined?(::TreeSitterLanguagePack)
    @loaded = parser_api_available?
    if !@loaded && @unavailable_reason.to_s.empty?
      @unavailable_reason = 'tree_sitter_language_pack parser API is not exposed'
    end
  rescue LoadError => e
    @loaded = false
    @unavailable_reason = e.message
  rescue StandardError => e
    @loaded = false
    @unavailable_reason = e.message
  end
  @loaded
end

.capabilitiesObject



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/tree_haver/backends/tslp.rb', line 62

def capabilities
  return {} unless available?

  {
    backend: :tslp,
    query: false,
    bytes_field: true,
    incremental: false,
    comment_support: :nodes_only,
    language_pack: true
  }
end

.parser_available_for?(language_name) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/tree_haver/backends/tslp.rb', line 75

def parser_available_for?(language_name)
  return false unless available?

  name = language_name.to_s
  return @language_availability.fetch(name) if @language_availability.key?(name)

  @language_availability[name] = smoke_parse_language(name)
  @language_unavailable_reasons[name] = @unavailable_reason unless @language_availability.fetch(name)
  @language_availability.fetch(name)
rescue StandardError => e
  @unavailable_reason = e.message
  @language_unavailable_reasons[language_name.to_s] = e.message
  false
end

.reset!Object



54
55
56
57
58
59
60
# File 'lib/tree_haver/backends/tslp.rb', line 54

def reset!
  @load_attempted = false
  @loaded = false
  @unavailable_reason = nil
  @language_availability = {}
  @language_unavailable_reasons = {}
end