textbringer-tree-sitter 1.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.
- checksums.yaml +7 -0
- data/CLAUDE.md +76 -0
- data/LICENSE.txt +13 -0
- data/README.md +125 -0
- data/Rakefile +12 -0
- data/exe/textbringer-tree-sitter +513 -0
- data/ext/textbringer_tree_sitter/extconf.rb +125 -0
- data/lib/textbringer/tree_sitter/node_maps/bash.rb +57 -0
- data/lib/textbringer/tree_sitter/node_maps/c.rb +64 -0
- data/lib/textbringer/tree_sitter/node_maps/cobol.rb +94 -0
- data/lib/textbringer/tree_sitter/node_maps/csharp.rb +107 -0
- data/lib/textbringer/tree_sitter/node_maps/groovy.rb +77 -0
- data/lib/textbringer/tree_sitter/node_maps/haml.rb +34 -0
- data/lib/textbringer/tree_sitter/node_maps/hcl.rb +53 -0
- data/lib/textbringer/tree_sitter/node_maps/html.rb +33 -0
- data/lib/textbringer/tree_sitter/node_maps/java.rb +98 -0
- data/lib/textbringer/tree_sitter/node_maps/javascript.rb +82 -0
- data/lib/textbringer/tree_sitter/node_maps/json.rb +31 -0
- data/lib/textbringer/tree_sitter/node_maps/pascal.rb +102 -0
- data/lib/textbringer/tree_sitter/node_maps/php.rb +100 -0
- data/lib/textbringer/tree_sitter/node_maps/python.rb +72 -0
- data/lib/textbringer/tree_sitter/node_maps/ruby.rb +82 -0
- data/lib/textbringer/tree_sitter/node_maps/rust.rb +81 -0
- data/lib/textbringer/tree_sitter/node_maps/yaml.rb +45 -0
- data/lib/textbringer/tree_sitter/node_maps.rb +78 -0
- data/lib/textbringer/tree_sitter/version.rb +7 -0
- data/lib/textbringer/tree_sitter_adapter.rb +166 -0
- data/lib/textbringer/tree_sitter_config.rb +91 -0
- data/lib/textbringer_plugin.rb +141 -0
- data/parsers/darwin-arm64/.gitkeep +0 -0
- data/parsers/darwin-x64/.gitkeep +0 -0
- data/parsers/linux-arm64/.gitkeep +0 -0
- data/parsers/linux-x64/.gitkeep +0 -0
- data/scripts/build_parsers.sh +77 -0
- data/scripts/test_parser.rb +223 -0
- metadata +139 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Textbringer
|
|
4
|
+
module TreeSitter
|
|
5
|
+
module NodeMaps
|
|
6
|
+
# Pascal の tree-sitter ノードタイプは kXxx 形式が多い
|
|
7
|
+
PASCAL_FEATURES = {
|
|
8
|
+
comment: %i[comment],
|
|
9
|
+
string: %i[string],
|
|
10
|
+
keyword: %i[
|
|
11
|
+
kBegin
|
|
12
|
+
kEnd
|
|
13
|
+
kIf
|
|
14
|
+
kThen
|
|
15
|
+
kElse
|
|
16
|
+
kFor
|
|
17
|
+
kTo
|
|
18
|
+
kDownto
|
|
19
|
+
kWhile
|
|
20
|
+
kRepeat
|
|
21
|
+
kUntil
|
|
22
|
+
kDo
|
|
23
|
+
kCase
|
|
24
|
+
kOf
|
|
25
|
+
kWith
|
|
26
|
+
kFunction
|
|
27
|
+
kProcedure
|
|
28
|
+
kProgram
|
|
29
|
+
kUnit
|
|
30
|
+
kInterface
|
|
31
|
+
kImplementation
|
|
32
|
+
kVar
|
|
33
|
+
kConst
|
|
34
|
+
kType
|
|
35
|
+
kArray
|
|
36
|
+
kRecord
|
|
37
|
+
kSet
|
|
38
|
+
kFile
|
|
39
|
+
kClass
|
|
40
|
+
kObject
|
|
41
|
+
kConstructor
|
|
42
|
+
kDestructor
|
|
43
|
+
kProperty
|
|
44
|
+
kInherited
|
|
45
|
+
kPrivate
|
|
46
|
+
kProtected
|
|
47
|
+
kPublic
|
|
48
|
+
kPublished
|
|
49
|
+
kVirtual
|
|
50
|
+
kOverride
|
|
51
|
+
kAbstract
|
|
52
|
+
kStatic
|
|
53
|
+
kForward
|
|
54
|
+
kExternal
|
|
55
|
+
kUses
|
|
56
|
+
kIn
|
|
57
|
+
kNil
|
|
58
|
+
kNot
|
|
59
|
+
kAnd
|
|
60
|
+
kOr
|
|
61
|
+
kXor
|
|
62
|
+
kDiv
|
|
63
|
+
kMod
|
|
64
|
+
kShl
|
|
65
|
+
kShr
|
|
66
|
+
kAs
|
|
67
|
+
kIs
|
|
68
|
+
kTry
|
|
69
|
+
kExcept
|
|
70
|
+
kFinally
|
|
71
|
+
kRaise
|
|
72
|
+
kOn
|
|
73
|
+
kGoto
|
|
74
|
+
kLabel
|
|
75
|
+
kExit
|
|
76
|
+
kBreak
|
|
77
|
+
kContinue
|
|
78
|
+
],
|
|
79
|
+
number: %i[
|
|
80
|
+
integer
|
|
81
|
+
real
|
|
82
|
+
hex
|
|
83
|
+
],
|
|
84
|
+
constant: %i[],
|
|
85
|
+
function_name: %i[],
|
|
86
|
+
variable: %i[identifier],
|
|
87
|
+
type: %i[type_identifier],
|
|
88
|
+
operator: %i[],
|
|
89
|
+
punctuation: %i[],
|
|
90
|
+
builtin: %i[
|
|
91
|
+
kTrue
|
|
92
|
+
kFalse
|
|
93
|
+
],
|
|
94
|
+
property: %i[]
|
|
95
|
+
}.freeze
|
|
96
|
+
|
|
97
|
+
PASCAL = PASCAL_FEATURES.flat_map { |face, nodes|
|
|
98
|
+
nodes.map { |node| [node, face] }
|
|
99
|
+
}.to_h.freeze
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Textbringer
|
|
4
|
+
module TreeSitter
|
|
5
|
+
module NodeMaps
|
|
6
|
+
PHP_FEATURES = {
|
|
7
|
+
comment: %i[comment],
|
|
8
|
+
string: %i[
|
|
9
|
+
string
|
|
10
|
+
encapsed_string
|
|
11
|
+
heredoc
|
|
12
|
+
nowdoc
|
|
13
|
+
shell_command_expression
|
|
14
|
+
],
|
|
15
|
+
keyword: %i[
|
|
16
|
+
if
|
|
17
|
+
else
|
|
18
|
+
elseif
|
|
19
|
+
endif
|
|
20
|
+
for
|
|
21
|
+
foreach
|
|
22
|
+
endforeach
|
|
23
|
+
while
|
|
24
|
+
endwhile
|
|
25
|
+
do
|
|
26
|
+
switch
|
|
27
|
+
case
|
|
28
|
+
default
|
|
29
|
+
endswitch
|
|
30
|
+
break
|
|
31
|
+
continue
|
|
32
|
+
return
|
|
33
|
+
throw
|
|
34
|
+
try
|
|
35
|
+
catch
|
|
36
|
+
finally
|
|
37
|
+
function
|
|
38
|
+
fn
|
|
39
|
+
class
|
|
40
|
+
interface
|
|
41
|
+
trait
|
|
42
|
+
extends
|
|
43
|
+
implements
|
|
44
|
+
namespace
|
|
45
|
+
use
|
|
46
|
+
as
|
|
47
|
+
const
|
|
48
|
+
public
|
|
49
|
+
private
|
|
50
|
+
protected
|
|
51
|
+
static
|
|
52
|
+
final
|
|
53
|
+
abstract
|
|
54
|
+
readonly
|
|
55
|
+
new
|
|
56
|
+
clone
|
|
57
|
+
instanceof
|
|
58
|
+
insteadof
|
|
59
|
+
global
|
|
60
|
+
echo
|
|
61
|
+
print
|
|
62
|
+
include
|
|
63
|
+
include_once
|
|
64
|
+
require
|
|
65
|
+
require_once
|
|
66
|
+
goto
|
|
67
|
+
yield
|
|
68
|
+
match
|
|
69
|
+
enum
|
|
70
|
+
],
|
|
71
|
+
number: %i[
|
|
72
|
+
integer
|
|
73
|
+
float
|
|
74
|
+
],
|
|
75
|
+
constant: %i[],
|
|
76
|
+
function_name: %i[],
|
|
77
|
+
variable: %i[
|
|
78
|
+
variable_name
|
|
79
|
+
name
|
|
80
|
+
],
|
|
81
|
+
type: %i[
|
|
82
|
+
primitive_type
|
|
83
|
+
named_type
|
|
84
|
+
],
|
|
85
|
+
operator: %i[],
|
|
86
|
+
punctuation: %i[],
|
|
87
|
+
builtin: %i[
|
|
88
|
+
true
|
|
89
|
+
false
|
|
90
|
+
null
|
|
91
|
+
],
|
|
92
|
+
property: %i[]
|
|
93
|
+
}.freeze
|
|
94
|
+
|
|
95
|
+
PHP = PHP_FEATURES.flat_map { |face, nodes|
|
|
96
|
+
nodes.map { |node| [node, face] }
|
|
97
|
+
}.to_h.freeze
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Textbringer
|
|
4
|
+
module TreeSitter
|
|
5
|
+
module NodeMaps
|
|
6
|
+
PYTHON_FEATURES = {
|
|
7
|
+
comment: %i[comment],
|
|
8
|
+
string: %i[
|
|
9
|
+
string
|
|
10
|
+
string_content
|
|
11
|
+
concatenated_string
|
|
12
|
+
],
|
|
13
|
+
keyword: %i[
|
|
14
|
+
if
|
|
15
|
+
elif
|
|
16
|
+
else
|
|
17
|
+
for
|
|
18
|
+
while
|
|
19
|
+
break
|
|
20
|
+
continue
|
|
21
|
+
return
|
|
22
|
+
pass
|
|
23
|
+
raise
|
|
24
|
+
try
|
|
25
|
+
except
|
|
26
|
+
finally
|
|
27
|
+
with
|
|
28
|
+
as
|
|
29
|
+
def
|
|
30
|
+
class
|
|
31
|
+
lambda
|
|
32
|
+
import
|
|
33
|
+
from
|
|
34
|
+
global
|
|
35
|
+
nonlocal
|
|
36
|
+
assert
|
|
37
|
+
yield
|
|
38
|
+
del
|
|
39
|
+
in
|
|
40
|
+
not
|
|
41
|
+
and
|
|
42
|
+
or
|
|
43
|
+
is
|
|
44
|
+
async
|
|
45
|
+
await
|
|
46
|
+
match
|
|
47
|
+
case
|
|
48
|
+
],
|
|
49
|
+
number: %i[
|
|
50
|
+
integer
|
|
51
|
+
float
|
|
52
|
+
],
|
|
53
|
+
constant: %i[],
|
|
54
|
+
function_name: %i[],
|
|
55
|
+
variable: %i[identifier],
|
|
56
|
+
type: %i[type],
|
|
57
|
+
operator: %i[],
|
|
58
|
+
punctuation: %i[],
|
|
59
|
+
builtin: %i[
|
|
60
|
+
true
|
|
61
|
+
false
|
|
62
|
+
none
|
|
63
|
+
],
|
|
64
|
+
property: %i[attribute]
|
|
65
|
+
}.freeze
|
|
66
|
+
|
|
67
|
+
PYTHON = PYTHON_FEATURES.flat_map { |face, nodes|
|
|
68
|
+
nodes.map { |node| [node, face] }
|
|
69
|
+
}.to_h.freeze
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Textbringer
|
|
4
|
+
module TreeSitter
|
|
5
|
+
module NodeMaps
|
|
6
|
+
# Feature-based ノードマッピング
|
|
7
|
+
# Emacs の treesit-font-lock-rules 風に feature ごとに分類
|
|
8
|
+
RUBY_FEATURES = {
|
|
9
|
+
comment: %i[comment],
|
|
10
|
+
string: %i[
|
|
11
|
+
string_content
|
|
12
|
+
heredoc_content
|
|
13
|
+
simple_symbol
|
|
14
|
+
escape_sequence
|
|
15
|
+
],
|
|
16
|
+
keyword: %i[
|
|
17
|
+
def
|
|
18
|
+
end
|
|
19
|
+
class
|
|
20
|
+
module
|
|
21
|
+
if
|
|
22
|
+
else
|
|
23
|
+
elsif
|
|
24
|
+
unless
|
|
25
|
+
case
|
|
26
|
+
when
|
|
27
|
+
then
|
|
28
|
+
while
|
|
29
|
+
until
|
|
30
|
+
for
|
|
31
|
+
do
|
|
32
|
+
break
|
|
33
|
+
next
|
|
34
|
+
redo
|
|
35
|
+
retry
|
|
36
|
+
return
|
|
37
|
+
yield
|
|
38
|
+
begin
|
|
39
|
+
rescue
|
|
40
|
+
raise
|
|
41
|
+
ensure
|
|
42
|
+
and
|
|
43
|
+
or
|
|
44
|
+
not
|
|
45
|
+
in
|
|
46
|
+
alias
|
|
47
|
+
undef
|
|
48
|
+
defined?
|
|
49
|
+
self
|
|
50
|
+
super
|
|
51
|
+
__FILE__
|
|
52
|
+
__LINE__
|
|
53
|
+
__ENCODING__
|
|
54
|
+
],
|
|
55
|
+
number: %i[integer float complex rational],
|
|
56
|
+
constant: %i[constant],
|
|
57
|
+
function_name: %i[method_name],
|
|
58
|
+
variable: %i[
|
|
59
|
+
identifier
|
|
60
|
+
instance_variable
|
|
61
|
+
class_variable
|
|
62
|
+
global_variable
|
|
63
|
+
],
|
|
64
|
+
type: %i[],
|
|
65
|
+
operator: %i[
|
|
66
|
+
binary
|
|
67
|
+
unary
|
|
68
|
+
assignment
|
|
69
|
+
operator
|
|
70
|
+
],
|
|
71
|
+
punctuation: %i[],
|
|
72
|
+
builtin: %i[nil true false],
|
|
73
|
+
property: %i[]
|
|
74
|
+
}.freeze
|
|
75
|
+
|
|
76
|
+
# Feature → Face の展開
|
|
77
|
+
RUBY = RUBY_FEATURES.flat_map { |face, nodes|
|
|
78
|
+
nodes.map { |node| [node, face] }
|
|
79
|
+
}.to_h.freeze
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Textbringer
|
|
4
|
+
module TreeSitter
|
|
5
|
+
module NodeMaps
|
|
6
|
+
RUST_FEATURES = {
|
|
7
|
+
comment: %i[
|
|
8
|
+
line_comment
|
|
9
|
+
block_comment
|
|
10
|
+
],
|
|
11
|
+
string: %i[
|
|
12
|
+
string_literal
|
|
13
|
+
char_literal
|
|
14
|
+
raw_string_literal
|
|
15
|
+
],
|
|
16
|
+
keyword: %i[
|
|
17
|
+
if
|
|
18
|
+
else
|
|
19
|
+
for
|
|
20
|
+
while
|
|
21
|
+
loop
|
|
22
|
+
break
|
|
23
|
+
continue
|
|
24
|
+
return
|
|
25
|
+
fn
|
|
26
|
+
let
|
|
27
|
+
mut
|
|
28
|
+
const
|
|
29
|
+
static
|
|
30
|
+
struct
|
|
31
|
+
enum
|
|
32
|
+
union
|
|
33
|
+
impl
|
|
34
|
+
trait
|
|
35
|
+
type
|
|
36
|
+
mod
|
|
37
|
+
use
|
|
38
|
+
pub
|
|
39
|
+
crate
|
|
40
|
+
self
|
|
41
|
+
super
|
|
42
|
+
as
|
|
43
|
+
in
|
|
44
|
+
ref
|
|
45
|
+
move
|
|
46
|
+
dyn
|
|
47
|
+
async
|
|
48
|
+
await
|
|
49
|
+
match
|
|
50
|
+
where
|
|
51
|
+
unsafe
|
|
52
|
+
extern
|
|
53
|
+
default
|
|
54
|
+
],
|
|
55
|
+
number: %i[
|
|
56
|
+
integer_literal
|
|
57
|
+
float_literal
|
|
58
|
+
],
|
|
59
|
+
constant: %i[],
|
|
60
|
+
function_name: %i[],
|
|
61
|
+
variable: %i[identifier],
|
|
62
|
+
type: %i[
|
|
63
|
+
type_identifier
|
|
64
|
+
primitive_type
|
|
65
|
+
generic_type
|
|
66
|
+
],
|
|
67
|
+
operator: %i[],
|
|
68
|
+
punctuation: %i[],
|
|
69
|
+
builtin: %i[
|
|
70
|
+
true
|
|
71
|
+
false
|
|
72
|
+
],
|
|
73
|
+
property: %i[field_identifier]
|
|
74
|
+
}.freeze
|
|
75
|
+
|
|
76
|
+
RUST = RUST_FEATURES.flat_map { |face, nodes|
|
|
77
|
+
nodes.map { |node| [node, face] }
|
|
78
|
+
}.to_h.freeze
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Textbringer
|
|
4
|
+
module TreeSitter
|
|
5
|
+
module NodeMaps
|
|
6
|
+
# YAML_LANG - Ruby の YAML モジュールと名前衝突を避けるため
|
|
7
|
+
YAML_FEATURES = {
|
|
8
|
+
comment: %i[comment],
|
|
9
|
+
string: %i[
|
|
10
|
+
string_scalar
|
|
11
|
+
double_quote_scalar
|
|
12
|
+
single_quote_scalar
|
|
13
|
+
block_scalar
|
|
14
|
+
],
|
|
15
|
+
keyword: %i[
|
|
16
|
+
anchor
|
|
17
|
+
alias
|
|
18
|
+
tag
|
|
19
|
+
],
|
|
20
|
+
number: %i[
|
|
21
|
+
integer_scalar
|
|
22
|
+
float_scalar
|
|
23
|
+
],
|
|
24
|
+
constant: %i[],
|
|
25
|
+
function_name: %i[],
|
|
26
|
+
variable: %i[],
|
|
27
|
+
type: %i[],
|
|
28
|
+
operator: %i[],
|
|
29
|
+
punctuation: %i[],
|
|
30
|
+
builtin: %i[
|
|
31
|
+
boolean_scalar
|
|
32
|
+
null_scalar
|
|
33
|
+
],
|
|
34
|
+
property: %i[
|
|
35
|
+
block_mapping_pair
|
|
36
|
+
flow_pair
|
|
37
|
+
]
|
|
38
|
+
}.freeze
|
|
39
|
+
|
|
40
|
+
YAML_LANG = YAML_FEATURES.flat_map { |face, nodes|
|
|
41
|
+
nodes.map { |node| [node, face] }
|
|
42
|
+
}.to_h.freeze
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "node_maps/ruby"
|
|
4
|
+
require_relative "node_maps/hcl"
|
|
5
|
+
require_relative "node_maps/bash"
|
|
6
|
+
require_relative "node_maps/c"
|
|
7
|
+
require_relative "node_maps/csharp"
|
|
8
|
+
require_relative "node_maps/cobol"
|
|
9
|
+
require_relative "node_maps/groovy"
|
|
10
|
+
require_relative "node_maps/haml"
|
|
11
|
+
require_relative "node_maps/html"
|
|
12
|
+
require_relative "node_maps/java"
|
|
13
|
+
require_relative "node_maps/javascript"
|
|
14
|
+
require_relative "node_maps/json"
|
|
15
|
+
require_relative "node_maps/pascal"
|
|
16
|
+
require_relative "node_maps/php"
|
|
17
|
+
require_relative "node_maps/python"
|
|
18
|
+
require_relative "node_maps/rust"
|
|
19
|
+
require_relative "node_maps/yaml"
|
|
20
|
+
|
|
21
|
+
module Textbringer
|
|
22
|
+
module TreeSitter
|
|
23
|
+
module NodeMaps
|
|
24
|
+
class << self
|
|
25
|
+
def for(language)
|
|
26
|
+
# カスタムマップが登録されていれば、デフォルトとマージして返す
|
|
27
|
+
if @custom_maps&.key?(language)
|
|
28
|
+
default_map = default_maps[language]
|
|
29
|
+
if default_map
|
|
30
|
+
default_map.merge(@custom_maps[language])
|
|
31
|
+
else
|
|
32
|
+
@custom_maps[language]
|
|
33
|
+
end
|
|
34
|
+
else
|
|
35
|
+
default_maps[language]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def register(language, node_map)
|
|
40
|
+
@custom_maps ||= {}
|
|
41
|
+
@custom_maps[language] = node_map
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def clear_custom_maps
|
|
45
|
+
@custom_maps = {}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def available_languages
|
|
49
|
+
(default_maps.keys + (@custom_maps&.keys || [])).uniq
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def default_maps
|
|
55
|
+
{
|
|
56
|
+
ruby: RUBY,
|
|
57
|
+
hcl: HCL,
|
|
58
|
+
bash: BASH,
|
|
59
|
+
c: C,
|
|
60
|
+
csharp: CSHARP,
|
|
61
|
+
cobol: COBOL,
|
|
62
|
+
groovy: GROOVY,
|
|
63
|
+
haml: HAML,
|
|
64
|
+
html: HTML,
|
|
65
|
+
java: JAVA,
|
|
66
|
+
javascript: JAVASCRIPT,
|
|
67
|
+
json: JSON_LANG,
|
|
68
|
+
pascal: PASCAL,
|
|
69
|
+
php: PHP,
|
|
70
|
+
python: PYTHON,
|
|
71
|
+
rust: RUST,
|
|
72
|
+
yaml: YAML_LANG
|
|
73
|
+
}
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|