@@ -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
0 commit comments