@@ -20,7 +20,8 @@ defmodule NextLS do
20
20
alias GenLSP.Requests . {
21
21
Initialize ,
22
22
Shutdown ,
23
- TextDocumentFormatting
23
+ TextDocumentFormatting ,
24
+ WorkspaceSymbol
24
25
}
25
26
26
27
alias GenLSP.Structures . {
@@ -29,13 +30,15 @@ defmodule NextLS do
29
30
InitializeResult ,
30
31
Position ,
31
32
Range ,
33
+ Location ,
32
34
SaveOptions ,
33
35
ServerCapabilities ,
34
36
TextDocumentItem ,
35
37
TextDocumentSyncOptions ,
36
38
TextEdit ,
37
39
WorkDoneProgressBegin ,
38
- WorkDoneProgressEnd
40
+ WorkDoneProgressEnd ,
41
+ SymbolInformation
39
42
}
40
43
41
44
alias NextLS.Runtime
@@ -94,12 +97,38 @@ defmodule NextLS do
94
97
save: % SaveOptions { include_text: true } ,
95
98
change: TextDocumentSyncKind . full ( )
96
99
} ,
97
- document_formatting_provider: true
100
+ document_formatting_provider: true ,
101
+ workspace_symbol_provider: true
98
102
} ,
99
103
server_info: % { name: "NextLS" }
100
104
} , assign ( lsp , root_uri: root_uri ) }
101
105
end
102
106
107
+ def handle_request ( % WorkspaceSymbol { params: % { query: _query } } , lsp ) do
108
+ symbols =
109
+ for % SymbolTable.Symbol { } = symbol <- SymbolTable . symbols ( lsp . assigns . symbol_table ) do
110
+ % SymbolInformation {
111
+ name: to_string ( symbol . name ) ,
112
+ kind: elixir_kind_to_lsp_kind ( symbol . type ) ,
113
+ location: % Location {
114
+ uri: "file://#{ symbol . file } " ,
115
+ range: % Range {
116
+ start: % Position {
117
+ line: symbol . line - 1 ,
118
+ character: symbol . col - 1
119
+ } ,
120
+ end: % Position {
121
+ line: symbol . line - 1 ,
122
+ character: symbol . col - 1
123
+ }
124
+ }
125
+ }
126
+ }
127
+ end
128
+
129
+ { :reply , symbols , lsp }
130
+ end
131
+
103
132
def handle_request ( % TextDocumentFormatting { params: % { text_document: % { uri: uri } } } , lsp ) do
104
133
document = lsp . assigns . documents [ uri ]
105
134
runtime = lsp . assigns . runtime
@@ -274,10 +303,13 @@ defmodule NextLS do
274
303
275
304
def handle_info ( { :tracer , payload } , lsp ) do
276
305
SymbolTable . put_symbols ( lsp . assigns . symbol_table , payload )
306
+ GenLSP . log ( lsp , "[NextLS] Updated the symbols table!" )
277
307
{ :noreply , lsp }
278
308
end
279
309
280
310
def handle_info ( :publish , lsp ) do
311
+ GenLSP . log ( lsp , "[NextLS] Compiled!" )
312
+
281
313
all =
282
314
for { _namespace , cache } <- DiagnosticCache . get ( lsp . assigns . cache ) , { file , diagnostics } <- cache , reduce: % { } do
283
315
d -> Map . update ( d , file , diagnostics , fn value -> value ++ diagnostics end )
@@ -351,7 +383,8 @@ defmodule NextLS do
351
383
{ :noreply , lsp }
352
384
end
353
385
354
- def handle_info ( _message , lsp ) do
386
+ def handle_info ( message , lsp ) do
387
+ GenLSP . log ( lsp , "[NextLS] Unhanded message: #{ inspect ( message ) } " )
355
388
{ :noreply , lsp }
356
389
end
357
390
@@ -397,4 +430,10 @@ defmodule NextLS do
397
430
_ -> "dev"
398
431
end
399
432
end
433
+
434
+ defp elixir_kind_to_lsp_kind ( :defmodule ) , do: GenLSP.Enumerations.SymbolKind . module ( )
435
+ defp elixir_kind_to_lsp_kind ( :defstruct ) , do: GenLSP.Enumerations.SymbolKind . struct ( )
436
+
437
+ defp elixir_kind_to_lsp_kind ( kind ) when kind in [ :def , :defp , :defmacro , :defmacrop ] ,
438
+ do: GenLSP.Enumerations.SymbolKind . function ( )
400
439
end
0 commit comments