ruby_tree_sitter 1.6.0-x86_64-linux-gnu
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 +7 -0
- data/LICENSE +22 -0
- data/README.md +213 -0
- data/ext/tree_sitter/encoding.c +29 -0
- data/ext/tree_sitter/extconf.rb +149 -0
- data/ext/tree_sitter/input.c +127 -0
- data/ext/tree_sitter/input_edit.c +42 -0
- data/ext/tree_sitter/language.c +219 -0
- data/ext/tree_sitter/logger.c +228 -0
- data/ext/tree_sitter/macros.h +163 -0
- data/ext/tree_sitter/node.c +623 -0
- data/ext/tree_sitter/parser.c +398 -0
- data/ext/tree_sitter/point.c +26 -0
- data/ext/tree_sitter/quantifier.c +43 -0
- data/ext/tree_sitter/query.c +289 -0
- data/ext/tree_sitter/query_capture.c +28 -0
- data/ext/tree_sitter/query_cursor.c +231 -0
- data/ext/tree_sitter/query_error.c +41 -0
- data/ext/tree_sitter/query_match.c +44 -0
- data/ext/tree_sitter/query_predicate_step.c +83 -0
- data/ext/tree_sitter/range.c +35 -0
- data/ext/tree_sitter/repo.rb +128 -0
- data/ext/tree_sitter/symbol_type.c +46 -0
- data/ext/tree_sitter/tree.c +234 -0
- data/ext/tree_sitter/tree_cursor.c +269 -0
- data/ext/tree_sitter/tree_sitter.c +44 -0
- data/ext/tree_sitter/tree_sitter.h +107 -0
- data/lib/tree_sitter/3.0/tree_sitter.so +0 -0
- data/lib/tree_sitter/3.1/tree_sitter.so +0 -0
- data/lib/tree_sitter/3.2/tree_sitter.so +0 -0
- data/lib/tree_sitter/3.3/tree_sitter.so +0 -0
- data/lib/tree_sitter/helpers.rb +23 -0
- data/lib/tree_sitter/mixins/language.rb +167 -0
- data/lib/tree_sitter/node.rb +167 -0
- data/lib/tree_sitter/query.rb +191 -0
- data/lib/tree_sitter/query_captures.rb +30 -0
- data/lib/tree_sitter/query_cursor.rb +27 -0
- data/lib/tree_sitter/query_match.rb +100 -0
- data/lib/tree_sitter/query_matches.rb +39 -0
- data/lib/tree_sitter/query_predicate.rb +14 -0
- data/lib/tree_sitter/text_predicate_capture.rb +37 -0
- data/lib/tree_sitter/version.rb +8 -0
- data/lib/tree_sitter.rb +34 -0
- data/lib/tree_stand/ast_modifier.rb +30 -0
- data/lib/tree_stand/breadth_first_visitor.rb +54 -0
- data/lib/tree_stand/config.rb +19 -0
- data/lib/tree_stand/node.rb +351 -0
- data/lib/tree_stand/parser.rb +87 -0
- data/lib/tree_stand/range.rb +55 -0
- data/lib/tree_stand/tree.rb +123 -0
- data/lib/tree_stand/utils/printer.rb +73 -0
- data/lib/tree_stand/version.rb +7 -0
- data/lib/tree_stand/visitor.rb +127 -0
- data/lib/tree_stand/visitors/tree_walker.rb +37 -0
- data/lib/tree_stand.rb +48 -0
- data/tree_sitter.gemspec +34 -0
- metadata +135 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# typed: true
|
3
|
+
|
4
|
+
module TreeStand
|
5
|
+
# A collection of useful methods for working with syntax trees.
|
6
|
+
module Utils
|
7
|
+
# Used to {TreeStand::Node#pretty_print pretty-print} the node.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# pp node
|
11
|
+
# # (expression
|
12
|
+
# # (sum
|
13
|
+
# # left: (number) | 1
|
14
|
+
# # ("+") | +
|
15
|
+
# # right: (variable))) | x
|
16
|
+
class Printer
|
17
|
+
extend T::Sig
|
18
|
+
|
19
|
+
# @param ralign the right alignment for the text column.
|
20
|
+
sig { params(ralign: Integer).void }
|
21
|
+
def initialize(ralign:)
|
22
|
+
@ralign = ralign
|
23
|
+
end
|
24
|
+
|
25
|
+
# (see TreeStand::Utils::Printer)
|
26
|
+
sig { params(node: TreeStand::Node, io: T.any(IO, StringIO, String)).returns(T.any(IO, StringIO, String)) }
|
27
|
+
def print(node, io: StringIO.new)
|
28
|
+
lines = pretty_output_lines(node)
|
29
|
+
|
30
|
+
lines.each do |line|
|
31
|
+
if line.text.empty?
|
32
|
+
io << line.sexpr << "\n"
|
33
|
+
next
|
34
|
+
end
|
35
|
+
|
36
|
+
io << "#{line.sexpr}#{' ' * [(@ralign - line.sexpr.size), 0].max}| #{line.text}\n"
|
37
|
+
end
|
38
|
+
|
39
|
+
io
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
Line = Struct.new(:sexpr, :text)
|
45
|
+
private_constant :Line
|
46
|
+
|
47
|
+
def pretty_output_lines(node, prefix: '', depth: 0)
|
48
|
+
indent = ' ' * depth
|
49
|
+
ts_node = node.ts_node
|
50
|
+
if indent.size + prefix.size + ts_node.to_s.size < @ralign || ts_node.child_count.zero?
|
51
|
+
return [Line.new("#{indent}#{prefix}#{ts_node}", node.text)]
|
52
|
+
end
|
53
|
+
|
54
|
+
lines = T.let([Line.new("#{indent}#{prefix}(#{ts_node.type}", '')], T::Array[Line])
|
55
|
+
|
56
|
+
node.each.with_index do |child, index|
|
57
|
+
lines += if field_name = ts_node.field_name_for_child(index)
|
58
|
+
pretty_output_lines(
|
59
|
+
child,
|
60
|
+
prefix: "#{field_name}: ",
|
61
|
+
depth: depth + 1,
|
62
|
+
)
|
63
|
+
else
|
64
|
+
pretty_output_lines(child, depth: depth + 1)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
T.must(lines.last).sexpr << ')'
|
69
|
+
lines
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# typed: true
|
3
|
+
|
4
|
+
module TreeStand
|
5
|
+
# Depth-first traversal through the tree, calling hooks at each stop.
|
6
|
+
#
|
7
|
+
# Hooks are language dependent and are defined by creating methods on the
|
8
|
+
# visitor with the form `on_*` or `around_*`, where `*` is {Node#type}.
|
9
|
+
#
|
10
|
+
# - Hooks prefixed with `on_*` are called *before* visiting a node.
|
11
|
+
# - Hooks prefixed with `around_*` must `yield` to continue visiting child
|
12
|
+
# nodes.
|
13
|
+
#
|
14
|
+
# You can also define default hooks by implementing an {on} or {around}
|
15
|
+
# method to call when visiting each node.
|
16
|
+
#
|
17
|
+
# @example Create a visitor counting certain nodes
|
18
|
+
# class CountingVisitor < TreeStand::Visitor
|
19
|
+
# attr_reader :count
|
20
|
+
#
|
21
|
+
# def initialize(root, type:)
|
22
|
+
# super(root)
|
23
|
+
# @type = type
|
24
|
+
# @count = 0
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# def on_predicate(node)
|
28
|
+
# # if this node matches our search, increment the counter
|
29
|
+
# @count += 1 if node.type == @type
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # Initialize a visitor
|
34
|
+
# visitor = CountingVisitor.new(document, :predicate).visit
|
35
|
+
# # Check the result
|
36
|
+
# visitor.count
|
37
|
+
# # => 3
|
38
|
+
#
|
39
|
+
# @example A visitor using around hooks to contruct a tree
|
40
|
+
# class TreeBuilder < TreeStand::Visitor
|
41
|
+
# TreeNode = Struct.new(:name, :children)
|
42
|
+
#
|
43
|
+
# attr_reader :stack
|
44
|
+
#
|
45
|
+
# def initialize(root)
|
46
|
+
# super(root)
|
47
|
+
# @stack = []
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# def around(node)
|
51
|
+
# @stack << TreeNode.new(node.type, [])
|
52
|
+
#
|
53
|
+
# # visit all children of this node
|
54
|
+
# yield
|
55
|
+
#
|
56
|
+
# # The last node on the stack is the root of the tree.
|
57
|
+
# return if @stack.size == 1
|
58
|
+
#
|
59
|
+
# # Pop the last node off the stack and add it to the parent
|
60
|
+
# @stack[-2].children << @stack.pop
|
61
|
+
# end
|
62
|
+
# end
|
63
|
+
class Visitor
|
64
|
+
extend T::Sig
|
65
|
+
|
66
|
+
sig { params(node: TreeStand::Node).void }
|
67
|
+
def initialize(node)
|
68
|
+
@node = node
|
69
|
+
end
|
70
|
+
|
71
|
+
# Run the visitor on the document and return self. Allows chaining create and visit.
|
72
|
+
# @example
|
73
|
+
# visitor = CountingVisitor.new(node, :predicate).visit
|
74
|
+
sig { returns(T.self_type) }
|
75
|
+
def visit
|
76
|
+
visit_node(@node)
|
77
|
+
self
|
78
|
+
end
|
79
|
+
|
80
|
+
# @abstract The default implementation does nothing.
|
81
|
+
#
|
82
|
+
# @example Create callback to count all nodes in a tree.
|
83
|
+
# def on(node)
|
84
|
+
# @count += 1
|
85
|
+
# end
|
86
|
+
sig { overridable.params(node: TreeStand::Node).void }
|
87
|
+
def on(node) = nil
|
88
|
+
|
89
|
+
# @abstract The default implementation yields to visit all children.
|
90
|
+
#
|
91
|
+
# @example Use around hooks to run logic before & after visiting a node. Pairs will with a stack.
|
92
|
+
# def around(node)
|
93
|
+
# @stack << TreeNode.new(node.type, [])
|
94
|
+
#
|
95
|
+
# # visit all children of this node
|
96
|
+
# yield
|
97
|
+
#
|
98
|
+
# # The last node on the stack is the root of the tree.
|
99
|
+
# return if @stack.size == 1
|
100
|
+
#
|
101
|
+
# # Pop the last node off the stack and add it to the parent
|
102
|
+
# @stack[-2].children << @stack.pop
|
103
|
+
# end
|
104
|
+
sig { overridable.params(node: TreeStand::Node, block: T.proc.void).void }
|
105
|
+
def around(node, &block) = yield
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def visit_node(node)
|
110
|
+
if respond_to?("on_#{node.type}")
|
111
|
+
public_send("on_#{node.type}", node)
|
112
|
+
else
|
113
|
+
on(node)
|
114
|
+
end
|
115
|
+
|
116
|
+
if respond_to?("around_#{node.type}")
|
117
|
+
public_send("around_#{node.type}", node) do
|
118
|
+
node.each { |child| visit_node(child) }
|
119
|
+
end
|
120
|
+
else
|
121
|
+
around(node) do
|
122
|
+
node.each { |child| visit_node(child) }
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# typed: true
|
3
|
+
|
4
|
+
module TreeStand
|
5
|
+
# A collection of useful visitors for traversing trees.
|
6
|
+
module Visitors
|
7
|
+
# Walks the tree depth-first and yields each node to the provided block.
|
8
|
+
#
|
9
|
+
# @example Create a list of all the nodes in the tree.
|
10
|
+
# list = []
|
11
|
+
# TreeStand::Visitors::TreeWalker.new(root) do |node|
|
12
|
+
# list << node
|
13
|
+
# end.visit
|
14
|
+
#
|
15
|
+
# @see TreeStand::Node#walk
|
16
|
+
# @see TreeStand::Tree#walk
|
17
|
+
class TreeWalker < Visitor
|
18
|
+
extend T::Sig
|
19
|
+
|
20
|
+
# @param block [Proc] A block that will be called for
|
21
|
+
# each node in the tree.
|
22
|
+
sig do
|
23
|
+
params(
|
24
|
+
node: TreeStand::Node,
|
25
|
+
block: T.proc.params(node: TreeStand::Node).void,
|
26
|
+
).void
|
27
|
+
end
|
28
|
+
def initialize(node, &block)
|
29
|
+
super(node)
|
30
|
+
@block = block
|
31
|
+
end
|
32
|
+
|
33
|
+
sig { override.params(node: TreeStand::Node).void }
|
34
|
+
def on(node) = @block.call(node)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/tree_stand.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# typed: true
|
3
|
+
|
4
|
+
require 'forwardable'
|
5
|
+
require 'sorbet-runtime'
|
6
|
+
require 'stringio'
|
7
|
+
require 'tree_sitter'
|
8
|
+
require 'zeitwerk'
|
9
|
+
|
10
|
+
loader = Zeitwerk::Loader.for_gem
|
11
|
+
loader.ignore("#{__dir__}/tree_sitter")
|
12
|
+
loader.ignore("#{__dir__}/tree_sitter.rb")
|
13
|
+
loader.setup
|
14
|
+
|
15
|
+
# TreeStand is a high-level Ruby wrapper for {https://tree-sitter.github.io/tree-sitter tree-sitter} bindings. It makes
|
16
|
+
# it easier to configure the parsers, and work with the underlying syntax tree.
|
17
|
+
module TreeStand
|
18
|
+
# Common Ancestor for all TreeStand errors.
|
19
|
+
class Error < StandardError; end
|
20
|
+
# Raised when the parsed document contains errors.
|
21
|
+
class InvalidDocument < Error; end
|
22
|
+
# Raised when performing a search on a tree where a return value is expected,
|
23
|
+
# but no match is found.
|
24
|
+
class NodeNotFound < Error; end
|
25
|
+
|
26
|
+
class << self
|
27
|
+
extend T::Sig
|
28
|
+
|
29
|
+
# Easy configuration of the gem.
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# TreeStand.configure do
|
33
|
+
# config.parser_path = "path/to/parser/folder/"
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# sql_parser = TreeStand::Parser.new("sql")
|
37
|
+
# ruby_parser = TreeStand::Parser.new("ruby")
|
38
|
+
sig { params(block: T.proc.void).void }
|
39
|
+
def configure(&block)
|
40
|
+
instance_eval(&block)
|
41
|
+
end
|
42
|
+
|
43
|
+
sig { returns(TreeStand::Config) }
|
44
|
+
def config
|
45
|
+
@config ||= Config.new
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/tree_sitter.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) if !$LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'tree_sitter/version'
|
7
|
+
|
8
|
+
Gem::Specification.new do |spec|
|
9
|
+
spec.required_ruby_version = '>= 3.0'
|
10
|
+
|
11
|
+
spec.authors = ['Firas al-Khalil', 'Derek Stride']
|
12
|
+
spec.email = ['firasalkhalil@gmail.com', 'derek@stride.host']
|
13
|
+
spec.homepage = 'https://www.github.com/Faveod/ruby-tree-sitter'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
spec.name = 'ruby_tree_sitter'
|
16
|
+
spec.summary = 'Ruby bindings for Tree-Sitter'
|
17
|
+
spec.version = TreeSitter::VERSION
|
18
|
+
|
19
|
+
spec.metadata = {
|
20
|
+
'homepage_uri' => spec.homepage,
|
21
|
+
'source_code_uri' => spec.homepage,
|
22
|
+
'changelog_uri' => spec.homepage,
|
23
|
+
'documentation_uri' => 'https://faveod.github.io/ruby-tree-sitter/',
|
24
|
+
}
|
25
|
+
|
26
|
+
spec.extensions = %(ext/tree_sitter/extconf.rb)
|
27
|
+
spec.files = %w[LICENSE README.md tree_sitter.gemspec]
|
28
|
+
spec.files += Dir.glob('ext/**/*.{c,h,rb}')
|
29
|
+
spec.files += Dir.glob('lib/**/*.rb')
|
30
|
+
spec.require_paths = ['lib']
|
31
|
+
|
32
|
+
spec.add_dependency 'sorbet-runtime'
|
33
|
+
spec.add_dependency 'zeitwerk'
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby_tree_sitter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.6.0
|
5
|
+
platform: x86_64-linux-gnu
|
6
|
+
authors:
|
7
|
+
- Firas al-Khalil
|
8
|
+
- Derek Stride
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2024-08-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: sorbet-runtime
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: zeitwerk
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
description:
|
43
|
+
email:
|
44
|
+
- firasalkhalil@gmail.com
|
45
|
+
- derek@stride.host
|
46
|
+
executables: []
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- LICENSE
|
51
|
+
- README.md
|
52
|
+
- ext/tree_sitter/encoding.c
|
53
|
+
- ext/tree_sitter/extconf.rb
|
54
|
+
- ext/tree_sitter/input.c
|
55
|
+
- ext/tree_sitter/input_edit.c
|
56
|
+
- ext/tree_sitter/language.c
|
57
|
+
- ext/tree_sitter/logger.c
|
58
|
+
- ext/tree_sitter/macros.h
|
59
|
+
- ext/tree_sitter/node.c
|
60
|
+
- ext/tree_sitter/parser.c
|
61
|
+
- ext/tree_sitter/point.c
|
62
|
+
- ext/tree_sitter/quantifier.c
|
63
|
+
- ext/tree_sitter/query.c
|
64
|
+
- ext/tree_sitter/query_capture.c
|
65
|
+
- ext/tree_sitter/query_cursor.c
|
66
|
+
- ext/tree_sitter/query_error.c
|
67
|
+
- ext/tree_sitter/query_match.c
|
68
|
+
- ext/tree_sitter/query_predicate_step.c
|
69
|
+
- ext/tree_sitter/range.c
|
70
|
+
- ext/tree_sitter/repo.rb
|
71
|
+
- ext/tree_sitter/symbol_type.c
|
72
|
+
- ext/tree_sitter/tree.c
|
73
|
+
- ext/tree_sitter/tree_cursor.c
|
74
|
+
- ext/tree_sitter/tree_sitter.c
|
75
|
+
- ext/tree_sitter/tree_sitter.h
|
76
|
+
- lib/tree_sitter.rb
|
77
|
+
- lib/tree_sitter/3.0/tree_sitter.so
|
78
|
+
- lib/tree_sitter/3.1/tree_sitter.so
|
79
|
+
- lib/tree_sitter/3.2/tree_sitter.so
|
80
|
+
- lib/tree_sitter/3.3/tree_sitter.so
|
81
|
+
- lib/tree_sitter/helpers.rb
|
82
|
+
- lib/tree_sitter/mixins/language.rb
|
83
|
+
- lib/tree_sitter/node.rb
|
84
|
+
- lib/tree_sitter/query.rb
|
85
|
+
- lib/tree_sitter/query_captures.rb
|
86
|
+
- lib/tree_sitter/query_cursor.rb
|
87
|
+
- lib/tree_sitter/query_match.rb
|
88
|
+
- lib/tree_sitter/query_matches.rb
|
89
|
+
- lib/tree_sitter/query_predicate.rb
|
90
|
+
- lib/tree_sitter/text_predicate_capture.rb
|
91
|
+
- lib/tree_sitter/version.rb
|
92
|
+
- lib/tree_stand.rb
|
93
|
+
- lib/tree_stand/ast_modifier.rb
|
94
|
+
- lib/tree_stand/breadth_first_visitor.rb
|
95
|
+
- lib/tree_stand/config.rb
|
96
|
+
- lib/tree_stand/node.rb
|
97
|
+
- lib/tree_stand/parser.rb
|
98
|
+
- lib/tree_stand/range.rb
|
99
|
+
- lib/tree_stand/tree.rb
|
100
|
+
- lib/tree_stand/utils/printer.rb
|
101
|
+
- lib/tree_stand/version.rb
|
102
|
+
- lib/tree_stand/visitor.rb
|
103
|
+
- lib/tree_stand/visitors/tree_walker.rb
|
104
|
+
- tree_sitter.gemspec
|
105
|
+
homepage: https://www.github.com/Faveod/ruby-tree-sitter
|
106
|
+
licenses:
|
107
|
+
- MIT
|
108
|
+
metadata:
|
109
|
+
homepage_uri: https://www.github.com/Faveod/ruby-tree-sitter
|
110
|
+
source_code_uri: https://www.github.com/Faveod/ruby-tree-sitter
|
111
|
+
changelog_uri: https://www.github.com/Faveod/ruby-tree-sitter
|
112
|
+
documentation_uri: https://faveod.github.io/ruby-tree-sitter/
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '3.0'
|
122
|
+
- - "<"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.4.dev
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 3.3.22
|
130
|
+
requirements: []
|
131
|
+
rubygems_version: 3.3.26
|
132
|
+
signing_key:
|
133
|
+
specification_version: 4
|
134
|
+
summary: Ruby bindings for Tree-Sitter
|
135
|
+
test_files: []
|