Skip to content

Commit 9cd59ee

Browse files
committed
Support edit of RBS files
1 parent a5afbe2 commit 9cd59ee

3 files changed

Lines changed: 38 additions & 46 deletions

File tree

lib/typeprof/core/service.rb

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ class Service
33
def initialize(options)
44
@options = options
55

6-
@text_nodes = {}
6+
@rb_text_nodes = {}
7+
@rbs_text_nodes = {}
78

89
@genv = GlobalEnv.new
910
@genv.load_core_rbs(load_rbs_declarations(@options[:rbs_collection]).declarations)
@@ -26,43 +27,39 @@ def load_rbs_declarations(rbs_collection)
2627
attr_reader :genv
2728

2829
def reset!
29-
@text_nodes.each_value do |node|
30-
if node.is_a?(Array)
31-
node.each {|n| n.undefine(@genv) }
32-
else
33-
node.undefine(@genv)
34-
end
35-
end
30+
@rb_text_nodes.each_value {|node| node.undefine(@genv) }
31+
@rbs_text_nodes.each_value {|nodes| nodes.each {|n| n.undefine(@genv) } }
3632
@genv.define_all
37-
@text_nodes.each_value do |node|
38-
if node.is_a?(Array)
39-
node.each {|n| n.uninstall(@genv) }
40-
else
41-
node.uninstall(@genv)
42-
end
43-
end
33+
@rb_text_nodes.each_value {|node| node.uninstall(@genv) }
34+
@rbs_text_nodes.each_value {|nodes| nodes.each {|n| n.uninstall(@genv) } }
4435
@genv.run_all
45-
@text_nodes.clear
36+
@rb_text_nodes.clear
37+
@rbs_text_nodes.clear
4638
end
4739

4840
def add_workspace(rb_folder, rbs_folder)
49-
Dir.glob(File.expand_path(rb_folder + "/**/*.rb")) do |path|
50-
update_rb_file(path, nil)
41+
Dir.glob(File.expand_path(rb_folder + "/**/*.{rb,rbs}")) do |path|
42+
update_file(path, nil)
5143
end
52-
Dir.glob(File.expand_path(rbs_folder + "/**/*.rbs")) do |path|
53-
update_rbs_file(path, nil)
44+
end
45+
46+
def update_file(path, code)
47+
if File.extname(path) == ".rbs"
48+
update_rbs_file(path, code)
49+
else
50+
update_rb_file(path, code)
5451
end
5552
end
5653

5754
def update_rb_file(path, code)
58-
prev_node = @text_nodes[path]
55+
prev_node = @rb_text_nodes[path]
5956

6057
code = File.read(path) unless code
6158
node = AST.parse_rb(path, code)
6259
return false unless node
6360

64-
node.diff(@text_nodes[path]) if prev_node
65-
@text_nodes[path] = node
61+
node.diff(@rb_text_nodes[path]) if prev_node
62+
@rb_text_nodes[path] = node
6663

6764
node.define(@genv)
6865
prev_node.undefine(@genv) if prev_node
@@ -115,7 +112,7 @@ def update_rb_file(path, code)
115112
end
116113

117114
def update_rbs_file(path, code)
118-
prev_decls = @text_nodes[path]
115+
prev_decls = @rbs_text_nodes[path]
119116

120117
code = File.read(path) unless code
121118
begin
@@ -125,7 +122,7 @@ def update_rbs_file(path, code)
125122
end
126123

127124
# TODO: diff
128-
@text_nodes[path] = decls
125+
@rbs_text_nodes[path] = decls
129126

130127
decls.each {|decl| decl.define(@genv) }
131128
prev_decls.each {|decl| decl.undefine(@genv) } if prev_decls
@@ -139,13 +136,12 @@ def update_rbs_file(path, code)
139136
end
140137

141138
def diagnostics(path, &blk)
142-
node = @text_nodes[path]
143-
node.diagnostics(@genv, &blk) if node
139+
@rb_text_nodes[path]&.diagnostics(@genv, &blk)
144140
end
145141

146142
def definitions(path, pos)
147143
defs = []
148-
@text_nodes[path].retrieve_at(pos) do |node|
144+
@rb_text_nodes[path]&.retrieve_at(pos) do |node|
149145
node.boxes(:cread) do |box|
150146
if box.const_read && box.const_read.cdef
151147
box.const_read.cdef.defs.each do |cdef_node|
@@ -184,7 +180,7 @@ def definitions(path, pos)
184180
end
185181

186182
def type_definitions(path, pos)
187-
@text_nodes[path].retrieve_at(pos) do |node|
183+
@rb_text_nodes[path]&.retrieve_at(pos) do |node|
188184
if node.ret
189185
ty_defs = []
190186
node.ret.types.map do |ty, _source|
@@ -206,7 +202,7 @@ def type_definitions(path, pos)
206202
#: (String, TypeProf::CodePosition) -> Array[[String?, TypeProf::CodeRange]]?
207203
def references(path, pos)
208204
refs = []
209-
@text_nodes[path].retrieve_at(pos) do |node|
205+
@rb_text_nodes[path]&.retrieve_at(pos) do |node|
210206
case node
211207
when AST::DefNode
212208
if node.mid_code_range.include?(pos)
@@ -246,7 +242,7 @@ def references(path, pos)
246242
def rename(path, pos)
247243
mdefs = []
248244
cdefs = []
249-
@text_nodes[path].retrieve_at(pos) do |node|
245+
@rb_text_nodes[path]&.retrieve_at(pos) do |node|
250246
node.boxes(:mcall) do |box|
251247
box.resolve(genv, nil) do |me, _ty, _mid, _orig_ty|
252248
next unless me
@@ -298,7 +294,7 @@ def rename(path, pos)
298294
end
299295

300296
def hover(path, pos)
301-
@text_nodes[path].retrieve_at(pos) do |node|
297+
@rb_text_nodes[path]&.retrieve_at(pos) do |node|
302298
node.boxes(:mcall) do |box|
303299
boxes = []
304300
box.changes.boxes.each do |key, box|
@@ -332,7 +328,7 @@ def hover(path, pos)
332328

333329
def code_lens(path)
334330
cpaths = []
335-
@text_nodes[path].traverse do |event, node|
331+
@rb_text_nodes[path]&.traverse do |event, node|
336332
if node.is_a?(AST::ModuleBaseNode)
337333
if node.static_cpath
338334
if event == :enter
@@ -356,7 +352,7 @@ def code_lens(path)
356352
end
357353

358354
def completion(path, trigger, pos)
359-
@text_nodes[path].retrieve_at(pos) do |node|
355+
@rb_text_nodes[path]&.retrieve_at(pos) do |node|
360356
if node.code_range.last == pos.right
361357
node.ret.types.map do |ty, _source|
362358
base_ty = ty.base_type(genv)
@@ -386,7 +382,7 @@ def completion(path, trigger, pos)
386382
def dump_declarations(path)
387383
stack = []
388384
out = []
389-
@text_nodes[path].traverse do |event, node|
385+
@rb_text_nodes[path]&.traverse do |event, node|
390386
case node
391387
when AST::ModuleNode
392388
if node.static_cpath
@@ -481,11 +477,7 @@ def batch(files, output)
481477
i += 1
482478
end
483479

484-
if File.extname(file) == ".rbs"
485-
res = update_rbs_file(file, File.read(file))
486-
else
487-
res = update_rb_file(file, File.read(file))
488-
end
480+
res = update_file(file, File.read(file))
489481

490482
if res
491483
true

lib/typeprof/lsp/messages.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def run
151151

152152
text = Text.new(path, text, version)
153153
@server.open_texts[uri] = text
154-
@server.core.update_rb_file(text.path, text.string)
154+
@server.core.update_file(text.path, text.string)
155155
@server.send_request("workspace/codeLens/refresh")
156156
publish_diagnostics(uri)
157157
end
@@ -164,7 +164,7 @@ def run
164164
text = @server.open_texts[uri]
165165
return unless text
166166
text.apply_changes(changes, version)
167-
@server.core.update_rb_file(text.path, text.string)
167+
@server.core.update_file(text.path, text.string)
168168
@server.send_request("workspace/codeLens/refresh")
169169
publish_diagnostics(uri)
170170
end
@@ -180,7 +180,7 @@ def run
180180
@params => { textDocument: { uri: } }
181181
text = @server.open_texts.delete(uri)
182182
return unless text
183-
@server.core.update_rb_file(text.path, nil)
183+
@server.core.update_file(text.path, nil)
184184
end
185185
end
186186

@@ -332,7 +332,7 @@ def run
332332
items = []
333333
sort = "aaaa"
334334
text.modify_for_completion(text, pos) do |string, trigger, pos|
335-
@server.core.update_rb_file(text.path, string)
335+
@server.core.update_file(text.path, string)
336336
pos = TypeProf::CodePosition.from_lsp(pos)
337337
@server.core.completion(text.path, trigger, pos) do |mid, hint|
338338
items << {
@@ -348,7 +348,7 @@ def run
348348
isIncomplete: false,
349349
items: items,
350350
)
351-
@server.core.update_rb_file(text.path, text.string)
351+
@server.core.update_file(text.path, text.string)
352352
end
353353
end
354354

test/scenario_compiler.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def handle_update
8888
#{ @check_diff ? 2 : 1 }.times {|i|
8989
core.update_#{ ext }_file(#{ @file.dump }, %q\0DATA\0)
9090
if i != 0 && "#{ ext }" == "rb"
91-
if !core.instance_variable_get(:@text_nodes)[#{ @file.dump }].prev_node
91+
if !core.instance_variable_get(:@rb_text_nodes)[#{ @file.dump }].prev_node
9292
raise "AST diff does not work well; the completely same code generates a different AST"
9393
end
9494
end

0 commit comments

Comments
 (0)