syntax_tree 4.2.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +1 -0
- data/.github/workflows/main.yml +2 -0
- data/.rubocop.yml +4 -1
- data/CHANGELOG.md +39 -1
- data/Gemfile.lock +4 -4
- data/README.md +111 -12
- data/lib/syntax_tree/cli.rb +61 -28
- data/lib/syntax_tree/formatter.rb +56 -20
- data/lib/syntax_tree/language_server/inlay_hints.rb +4 -6
- data/lib/syntax_tree/language_server.rb +64 -17
- data/lib/syntax_tree/node.rb +3119 -1409
- data/lib/syntax_tree/parser.rb +118 -92
- data/lib/syntax_tree/pattern.rb +179 -64
- data/lib/syntax_tree/plugin/single_quotes.rb +5 -1
- data/lib/syntax_tree/plugin/trailing_comma.rb +5 -1
- data/lib/syntax_tree/rake/task.rb +1 -1
- data/lib/syntax_tree/version.rb +1 -1
- data/lib/syntax_tree/visitor/environment.rb +7 -4
- data/lib/syntax_tree/visitor/field_visitor.rb +23 -117
- data/lib/syntax_tree/visitor/mutation_visitor.rb +924 -0
- data/lib/syntax_tree/visitor/with_environment.rb +0 -8
- data/lib/syntax_tree/visitor.rb +12 -48
- data/lib/syntax_tree.rb +14 -2
- data/syntax_tree.gemspec +1 -1
- metadata +6 -4
@@ -13,6 +13,50 @@ module SyntaxTree
|
|
13
13
|
# stree lsp
|
14
14
|
#
|
15
15
|
class LanguageServer
|
16
|
+
# This is a small module that effectively mirrors pattern matching. We're
|
17
|
+
# using it so that we can support truffleruby without having to ignore the
|
18
|
+
# language server.
|
19
|
+
module Request
|
20
|
+
# Represents a hash pattern.
|
21
|
+
class Shape
|
22
|
+
attr_reader :values
|
23
|
+
|
24
|
+
def initialize(values)
|
25
|
+
@values = values
|
26
|
+
end
|
27
|
+
|
28
|
+
def ===(other)
|
29
|
+
values.all? do |key, value|
|
30
|
+
value == :any ? other.key?(key) : value === other[key]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Represents an array pattern.
|
36
|
+
class Tuple
|
37
|
+
attr_reader :values
|
38
|
+
|
39
|
+
def initialize(values)
|
40
|
+
@values = values
|
41
|
+
end
|
42
|
+
|
43
|
+
def ===(other)
|
44
|
+
values.each_with_index.all? { |value, index| value === other[index] }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.[](value)
|
49
|
+
case value
|
50
|
+
when Array
|
51
|
+
Tuple.new(value.map { |child| self[child] })
|
52
|
+
when Hash
|
53
|
+
Shape.new(value.transform_values { |child| self[child] })
|
54
|
+
else
|
55
|
+
value
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
16
60
|
attr_reader :input, :output, :print_width
|
17
61
|
|
18
62
|
def initialize(
|
@@ -39,30 +83,33 @@ module SyntaxTree
|
|
39
83
|
|
40
84
|
# stree-ignore
|
41
85
|
case request
|
42
|
-
|
86
|
+
when Request[method: "initialize", id: :any]
|
43
87
|
store.clear
|
44
|
-
write(id: id, result: { capabilities: capabilities })
|
45
|
-
|
88
|
+
write(id: request[:id], result: { capabilities: capabilities })
|
89
|
+
when Request[method: "initialized"]
|
46
90
|
# ignored
|
47
|
-
|
91
|
+
when Request[method: "shutdown"] # tolerate missing ID to be a good citizen
|
48
92
|
store.clear
|
49
93
|
write(id: request[:id], result: {})
|
50
94
|
return
|
51
|
-
|
52
|
-
store[uri] = text
|
53
|
-
|
54
|
-
store[uri] = text
|
55
|
-
|
56
|
-
store.delete(uri)
|
57
|
-
|
95
|
+
when Request[method: "textDocument/didChange", params: { textDocument: { uri: :any }, contentChanges: [{ text: :any }] }]
|
96
|
+
store[request.dig(:params, :textDocument, :uri)] = request.dig(:params, :contentChanges, 0, :text)
|
97
|
+
when Request[method: "textDocument/didOpen", params: { textDocument: { uri: :any, text: :any } }]
|
98
|
+
store[request.dig(:params, :textDocument, :uri)] = request.dig(:params, :textDocument, :text)
|
99
|
+
when Request[method: "textDocument/didClose", params: { textDocument: { uri: :any } }]
|
100
|
+
store.delete(request.dig(:params, :textDocument, :uri))
|
101
|
+
when Request[method: "textDocument/formatting", id: :any, params: { textDocument: { uri: :any } }]
|
102
|
+
uri = request.dig(:params, :textDocument, :uri)
|
58
103
|
contents = store[uri]
|
59
|
-
write(id: id, result: contents ? format(contents, uri.split(".").last) : nil)
|
60
|
-
|
104
|
+
write(id: request[:id], result: contents ? format(contents, uri.split(".").last) : nil)
|
105
|
+
when Request[method: "textDocument/inlayHint", id: :any, params: { textDocument: { uri: :any } }]
|
106
|
+
uri = request.dig(:params, :textDocument, :uri)
|
61
107
|
contents = store[uri]
|
62
|
-
write(id: id, result: contents ? inlay_hints(contents) : nil)
|
63
|
-
|
64
|
-
|
65
|
-
|
108
|
+
write(id: request[:id], result: contents ? inlay_hints(contents) : nil)
|
109
|
+
when Request[method: "syntaxTree/visualizing", id: :any, params: { textDocument: { uri: :any } }]
|
110
|
+
uri = request.dig(:params, :textDocument, :uri)
|
111
|
+
write(id: request[:id], result: PP.pp(SyntaxTree.parse(store[uri]), +""))
|
112
|
+
when Request[method: %r{\$/.+}]
|
66
113
|
# ignored
|
67
114
|
else
|
68
115
|
raise ArgumentError, "Unhandled: #{request}"
|