4
4
require "language_server/protocol/stdio"
5
5
require "language_server/linter/ruby_wc"
6
6
require "language_server/completion_provider/rcodetools"
7
+ require "language_server/completion_provider/ad_hoc"
7
8
require "language_server/file_store"
9
+ require "language_server/project"
8
10
9
11
require "json"
10
12
require "logger"
@@ -18,7 +20,7 @@ def logger
18
20
def run
19
21
writer = Protocol ::Stdio ::Writer . new
20
22
reader = Protocol ::Stdio ::Reader . new
21
- file_store = FileStore . new
23
+ variables = { }
22
24
23
25
reader . read do |request |
24
26
method = request [ :method ] . to_sym
@@ -30,10 +32,11 @@ def run
30
32
}
31
33
32
34
if subscriber
35
+ keys = subscriber . parameters . map ( &:last )
33
36
result = subscriber . call (
34
37
{
35
- request : request , notifier : writer . method ( :notify ) , file_store : file_store
36
- } . select { |k , _ | subscriber . parameters . map ( & :last ) . include? ( k ) }
38
+ request : request , notifier : writer . method ( :notify ) , variables : variables
39
+ } . merge ( variables ) . select { |k , _ | keys . include? ( k ) }
37
40
)
38
41
39
42
if request [ :id ]
@@ -54,7 +57,10 @@ def on(method, &callback)
54
57
end
55
58
end
56
59
57
- on :initialize do
60
+ on :initialize do |request :, variables :|
61
+ variables [ :file_store ] = FileStore . new ( load_paths : $LOAD_PATH, remote_root : request [ :params ] [ :rootPath ] , local_root : Dir . getwd )
62
+ variables [ :project ] = Project . new ( variables [ :file_store ] )
63
+
58
64
Protocol ::Interfaces ::InitializeResult . new (
59
65
capabilities : Protocol ::Interfaces ::ServerCapabilities . new (
60
66
text_document_sync : Protocol ::Interfaces ::TextDocumentSyncOptions . new (
@@ -72,10 +78,11 @@ def on(method, &callback)
72
78
exit
73
79
end
74
80
75
- on :"textDocument/didChange" do |request :, notifier :, file_store :|
81
+ on :"textDocument/didChange" do |request :, notifier :, file_store :, project : |
76
82
uri = request [ :params ] [ :textDocument ] [ :uri ]
77
83
text = request [ :params ] [ :contentChanges ] [ 0 ] [ :text ]
78
84
file_store . cache ( uri , text )
85
+ project . recalculate_result ( uri )
79
86
80
87
diagnostics = Linter ::RubyWC . new ( text ) . call . map do |error |
81
88
Protocol ::Interfaces ::Diagnostic . new (
@@ -103,12 +110,13 @@ def on(method, &callback)
103
110
)
104
111
end
105
112
106
- on :"textDocument/completion" do |request :, file_store :|
113
+ on :"textDocument/completion" do |request :, file_store :, project : |
107
114
uri = request [ :params ] [ :textDocument ] [ :uri ]
108
- line , character = request [ :params ] [ :position ] . fetch_values ( :line , :character )
115
+ line , character = request [ :params ] [ :position ] . fetch_values ( :line , :character ) . map ( & :to_i )
109
116
110
117
[
111
- CompletionProvider ::Rcodetools . new ( uri : uri , line : line . to_i , character : character . to_i , file_store : file_store )
118
+ CompletionProvider ::AdHoc . new ( uri : uri , line : line , character : character , project : project ) ,
119
+ CompletionProvider ::Rcodetools . new ( uri : uri , line : line , character : character , file_store : file_store )
112
120
] . flat_map ( &:call )
113
121
end
114
122
end
0 commit comments