@@ -173,7 +173,7 @@ func NewINOLanguageServer(stdin io.Reader, stdout io.Writer, board Board) *INOLa
173
173
logger ("Language server build sketch root: %s" , handler .buildSketchRoot )
174
174
}
175
175
176
- jsonrpcLogger := streams .NewJsonRPCLogger ("IDE" , "LS" , false )
176
+ jsonrpcLogger := streams .NewJsonRPCLogger ("IDE" , "LS" )
177
177
handler .IDEConn = jsonrpc .NewConnection (stdin , stdout ,
178
178
func (ctx context.Context , method string , params json.RawMessage , respCallback func (result json.RawMessage , err * jsonrpc.ResponseError )) {
179
179
reqLogger , idx := jsonrpcLogger .LogClientRequest (method , params )
@@ -228,7 +228,7 @@ func (handler *INOLanguageServer) CleanUp() {
228
228
func (handler * INOLanguageServer ) HandleNotificationFromIDE (ctx context.Context , logger streams.PrefixLogger , method string , paramsRaw json.RawMessage ) {
229
229
defer streams .CatchAndLogPanic ()
230
230
231
- params , err := lsp .DecodeNotificationParams (method , paramsRaw )
231
+ params , err := lsp .DecodeClientNotificationParams (method , paramsRaw )
232
232
if err != nil {
233
233
// TODO: log?
234
234
return
@@ -314,10 +314,10 @@ func (handler *INOLanguageServer) HandleNotificationFromIDE(ctx context.Context,
314
314
for _ , change := range p .ContentChanges {
315
315
logger (" > %s -> %s" , change .Range , strconv .Quote (change .Text ))
316
316
}
317
+ logger ("LS --> CL NOTIF %s:" , method )
317
318
if err := handler .ClangdConn .SendNotification (method , lsp .EncodeMessage (p )); err != nil {
318
319
// Exit the process and trigger a restart by the client in case of a severe error
319
- logger ("Connection error with clangd server:" )
320
- logger ("%v" , err )
320
+ logger ("Connection error with clangd server: %v" , err )
321
321
logger ("Please restart the language server." )
322
322
handler .Close ()
323
323
}
@@ -340,7 +340,7 @@ func (handler *INOLanguageServer) HandleNotificationFromIDE(ctx context.Context,
340
340
return
341
341
}
342
342
343
- logger ("sending to Clang" )
343
+ logger ("LS --> CL NOTIF %s:" , method )
344
344
if err := handler .ClangdConn .SendNotification (method , lsp .EncodeMessage (params )); err != nil {
345
345
// Exit the process and trigger a restart by the client in case of a severe error
346
346
logger ("Connection error with clangd server:" )
@@ -368,7 +368,7 @@ func (handler *INOLanguageServer) HandleMessageFromIDE(ctx context.Context, logg
368
368
) {
369
369
defer streams .CatchAndLogPanic ()
370
370
371
- params , err := lsp .DecodeRequestParams (method , paramsRaw )
371
+ params , err := lsp .DecodeClientRequestParams (method , paramsRaw )
372
372
if err != nil {
373
373
returnCB (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInvalidParams , Message : err .Error ()})
374
374
return
@@ -531,11 +531,21 @@ func (handler *INOLanguageServer) HandleMessageFromIDE(ctx context.Context, logg
531
531
err = e
532
532
}
533
533
534
+ case * lsp.DocumentHighlightParams :
535
+ tdp := p .TextDocumentPositionParams
536
+
537
+ inoURI = tdp .TextDocument .URI
538
+ if res , e := handler .ino2cppTextDocumentPositionParams (logger , tdp ); e == nil {
539
+ cppURI = res .TextDocument .URI
540
+ params = res
541
+ } else {
542
+ err = e
543
+ }
544
+
534
545
case * lsp.SignatureHelpParams ,
535
546
* lsp.DefinitionParams ,
536
547
* lsp.TypeDefinitionParams ,
537
- * lsp.ImplementationParams ,
538
- * lsp.DocumentHighlightParams :
548
+ * lsp.ImplementationParams :
539
549
// it was *lsp.TextDocumentPositionParams:
540
550
541
551
// Method: "textDocument/signatureHelp"
@@ -599,10 +609,7 @@ func (handler *INOLanguageServer) HandleMessageFromIDE(ctx context.Context, logg
599
609
return
600
610
}
601
611
602
- logger ("sent to Clang" )
603
-
604
- // var result interface{}
605
- // result, err = lsp.SendRequest(ctx, handler.ClangdConn, method, params)
612
+ logger ("LS --> CL REQ %s" , method )
606
613
clangRawResp , clangErr , err := handler .ClangdConn .SendRequest (ctx , method , lsp .EncodeMessage (params ))
607
614
if err != nil {
608
615
// Exit the process and trigger a restart by the client in case of a severe error
@@ -626,7 +633,8 @@ func (handler *INOLanguageServer) HandleMessageFromIDE(ctx context.Context, logg
626
633
returnCB (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : clangErr .AsError ().Error ()})
627
634
return
628
635
}
629
- clangResp , err := lsp .DecodeResponseResult (method , clangRawResp )
636
+ logger ("LS <-- CL RESP %s" , method )
637
+ clangResp , err := lsp .DecodeServerResponseResult (method , clangRawResp )
630
638
if err != nil {
631
639
logger ("Error decoding clang response: %v" , err )
632
640
returnCB (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : err .Error ()})
@@ -696,7 +704,9 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
696
704
},
697
705
}
698
706
699
- if err := handler .ClangdConn .SendNotification ("textDocument/didChange" , lsp .EncodeMessage (syncEvent )); err != nil {
707
+ method := "textDocument/didChange"
708
+ logger ("LS --> CL NOTIF %s:" , method )
709
+ if err := handler .ClangdConn .SendNotification (method , lsp .EncodeMessage (syncEvent )); err != nil {
700
710
logger (" error reinitilizing clangd:" , err )
701
711
return err
702
712
}
@@ -716,7 +726,7 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
716
726
go io .Copy (os .Stderr , clangdStderr )
717
727
}
718
728
719
- rpcLogger := streams .NewJsonRPCLogger ("IDE LS" , "CL" , true )
729
+ rpcLogger := streams .NewJsonRPCLogger ("IDE LS" , "CL" )
720
730
handler .ClangdConn = jsonrpc .NewConnection (clangdStdio , clangdStdio ,
721
731
func (ctx context.Context , method string , params json.RawMessage , respCallback func (result json.RawMessage , err * jsonrpc.ResponseError )) {
722
732
logger , idx := rpcLogger .LogServerRequest (method , params )
@@ -726,7 +736,7 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
726
736
})
727
737
},
728
738
func (ctx context.Context , method string , params json.RawMessage ) {
729
- logger := rpcLogger .LogClientNotification (method , params )
739
+ logger := rpcLogger .LogServerNotification (method , params )
730
740
handler .HandleNotificationFromClangd (ctx , logger , method , params )
731
741
},
732
742
func (e error ) {
@@ -743,20 +753,28 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
743
753
// Send initialization command to clangd
744
754
ctx , cancel := context .WithTimeout (context .Background (), time .Second )
745
755
defer cancel ()
746
- if rawResp , clangErr , err := handler .ClangdConn .SendRequest (ctx , "initialize" , lsp .EncodeMessage (handler .lspInitializeParams )); err != nil {
756
+ method1 := "initialize"
757
+ logger ("LS --> CL REQ %s" , method1 )
758
+ rawResp , clangErr , err := handler .ClangdConn .SendRequest (
759
+ ctx , method1 , lsp .EncodeMessage (handler .lspInitializeParams ))
760
+ if err != nil {
747
761
logger (" error initilizing clangd: %v" , err )
748
762
return err
749
- } else if clangErr != nil {
763
+ }
764
+ logger ("LS <-- CL RESP %s" , method1 )
765
+ if clangErr != nil {
750
766
logger (" error initilizing clangd: %v" , clangErr .AsError ())
751
767
return clangErr .AsError ()
752
- } else if resp , err := lsp .DecodeResponseResult ("initialize" , rawResp ); err != nil {
768
+ } else if resp , err := lsp .DecodeServerResponseResult ("initialize" , rawResp ); err != nil {
753
769
logger (" error initilizing clangd: %v" , err )
754
770
return err
755
771
} else {
756
- logger (" clangd successfully started: %v" , resp )
772
+ logger ("clangd successfully started: %v" , resp )
757
773
}
758
774
759
- if err := handler .ClangdConn .SendNotification ("initialized" , lsp .EncodeMessage (lsp.InitializedParams {})); err != nil {
775
+ method2 := "initialized"
776
+ logger ("LS --> CL NOTIF %s:" , method2 )
777
+ if err := handler .ClangdConn .SendNotification (method2 , lsp .EncodeMessage (lsp.InitializedParams {})); err != nil {
760
778
logger (" error sending initialized notification to clangd: %v" , err )
761
779
return err
762
780
}
@@ -804,7 +822,9 @@ func (handler *INOLanguageServer) refreshCppDocumentSymbols(logger streams.Prefi
804
822
handler .readUnlock (logger )
805
823
cppURI := lsp .NewDocumentURIFromPath (handler .buildSketchCpp )
806
824
logger ("requesting documentSymbol for %s" , cppURI )
807
- respRaw , resErr , err := handler .ClangdConn .SendRequest (context .Background (), "textDocument/documentSymbol" ,
825
+ method := "textDocument/documentSymbol"
826
+ logger ("LS --> CL REQ %s" , method )
827
+ respRaw , resErr , err := handler .ClangdConn .SendRequest (context .Background (), method ,
808
828
lsp .EncodeMessage (& lsp.DocumentSymbolParams {
809
829
TextDocument : lsp.TextDocumentIdentifier {URI : cppURI },
810
830
}))
@@ -814,11 +834,12 @@ func (handler *INOLanguageServer) refreshCppDocumentSymbols(logger streams.Prefi
814
834
logger ("error: %s" , err )
815
835
return fmt .Errorf ("quering source code symbols: %w" , err )
816
836
}
837
+ logger ("LS <-- CL RESP %s" , method )
817
838
if resErr != nil {
818
839
logger ("error: %s" , resErr .AsError ())
819
840
return fmt .Errorf ("quering source code symbols: %w" , resErr .AsError ())
820
841
}
821
- result , err := lsp .DecodeResponseResult ("textDocument/documentSymbol" , respRaw )
842
+ result , err := lsp .DecodeServerResponseResult ("textDocument/documentSymbol" , respRaw )
822
843
if err != nil {
823
844
logger ("invalid response: %s" , err )
824
845
return fmt .Errorf ("quering source code symbols: invalid response: %w" , err )
@@ -1108,7 +1129,7 @@ func (handler *INOLanguageServer) didChange(logger streams.PrefixLogger, req *ls
1108
1129
return cppReq , err
1109
1130
}
1110
1131
1111
- func (handler * INOLanguageServer ) handleError (ctx context. Context , err error ) error {
1132
+ func (handler * INOLanguageServer ) handleError (logger streams. PrefixLogger , err error ) error {
1112
1133
errorStr := err .Error ()
1113
1134
var message string
1114
1135
if strings .Contains (errorStr , "#error" ) {
@@ -1139,7 +1160,7 @@ func (handler *INOLanguageServer) handleError(ctx context.Context, err error) er
1139
1160
} else {
1140
1161
message = "Could not start editor support.\n " + errorStr
1141
1162
}
1142
- go handler .showMessage (ctx , lsp .MessageTypeError , message )
1163
+ go handler .showMessage (logger , lsp .MessageTypeError , message )
1143
1164
return errors .New (message )
1144
1165
}
1145
1166
@@ -1266,24 +1287,31 @@ func (handler *INOLanguageServer) cpp2inoDocumentURI(logger streams.PrefixLogger
1266
1287
}
1267
1288
1268
1289
func (handler * INOLanguageServer ) ino2cppTextDocumentPositionParams (logger streams.PrefixLogger , inoParams lsp.TextDocumentPositionParams ) (lsp.TextDocumentPositionParams , error ) {
1269
- res := lsp.TextDocumentPositionParams {}
1270
- cppDoc , err := handler .ino2cppTextDocumentIdentifier (logger , inoParams .TextDocument )
1290
+ inoTextDocument := inoParams .TextDocument
1291
+ inoPosition := inoParams .Position
1292
+ inoURI := inoTextDocument .URI
1293
+ prefix := fmt .Sprintf ("TextDocumentIdentifier %s" , inoParams )
1294
+
1295
+ cppTextDocument , err := handler .ino2cppTextDocumentIdentifier (logger , inoTextDocument )
1271
1296
if err != nil {
1272
- return res , err
1297
+ logger ("%s -> invalid text document: %s" , prefix , err )
1298
+ return lsp.TextDocumentPositionParams {}, err
1273
1299
}
1274
- cppPosition := inoParams .Position
1275
- inoURI := inoParams .TextDocument .URI
1300
+ cppPosition := inoPosition
1276
1301
if inoURI .Ext () == ".ino" {
1277
- if cppLine , ok := handler .sketchMapper .InoToCppLineOk (inoURI , inoParams . Position .Line ); ok {
1302
+ if cppLine , ok := handler .sketchMapper .InoToCppLineOk (inoURI , inoPosition .Line ); ok {
1278
1303
cppPosition .Line = cppLine
1279
1304
} else {
1280
- logger (" invalid line requested: %s:%d" , inoURI , inoParams . Position .Line )
1281
- return res , unknownURI (inoURI )
1305
+ logger ("%s -> invalid line requested: %s:%d" , prefix , inoURI , inoPosition .Line )
1306
+ return lsp. TextDocumentPositionParams {} , unknownURI (inoURI )
1282
1307
}
1283
1308
}
1284
- res .TextDocument = cppDoc
1285
- res .Position = cppPosition
1286
- return res , nil
1309
+ cppParams := lsp.TextDocumentPositionParams {
1310
+ TextDocument : cppTextDocument ,
1311
+ Position : cppPosition ,
1312
+ }
1313
+ logger ("%s -> %s" , prefix , cppParams )
1314
+ return cppParams , nil
1287
1315
}
1288
1316
1289
1317
func (handler * INOLanguageServer ) ino2cppRange (logger streams.PrefixLogger , inoURI lsp.DocumentURI , inoRange lsp.Range ) (lsp.DocumentURI , lsp.Range , error ) {
@@ -1783,17 +1811,14 @@ func (handler *INOLanguageServer) cpp2inoDiagnostics(logger streams.PrefixLogger
1783
1811
func (handler * INOLanguageServer ) HandleNotificationFromClangd (ctx context.Context , logger streams.PrefixLogger , method string , paramsRaw json.RawMessage ) {
1784
1812
defer streams .CatchAndLogPanic ()
1785
1813
1786
- // n := atomic.AddInt64(&handler.clangdMessageCount, 1)
1787
- // prefix := fmt.Sprintf("CLG <-- %s notif%d ", method, n)
1788
-
1789
- params , err := lsp .DecodeNotificationParams (method , paramsRaw )
1814
+ params , err := lsp .DecodeServerNotificationParams (method , paramsRaw )
1790
1815
if err != nil {
1791
1816
logger ("error parsing clang message:" , err )
1792
1817
return
1793
1818
}
1794
1819
if params == nil {
1795
1820
// passthrough
1796
- logger ("passing through message" )
1821
+ logger ("IDE <-- LS NOTIF %s: passing through message" , method )
1797
1822
if err := handler .IDEConn .SendNotification (method , paramsRaw ); err != nil {
1798
1823
logger ("Error sending notification to IDE: " + err .Error ())
1799
1824
}
@@ -1849,7 +1874,9 @@ func (handler *INOLanguageServer) HandleNotificationFromClangd(ctx context.Conte
1849
1874
for _ , diag := range inoDiag .Diagnostics {
1850
1875
logger ("> %d:%d - %v: %s" , diag .Range .Start .Line , diag .Range .Start .Character , diag .Severity , diag .Code )
1851
1876
}
1852
- if err := handler .IDEConn .SendNotification ("textDocument/publishDiagnostics" , lsp .EncodeMessage (inoDiag )); err != nil {
1877
+ method := "textDocument/publishDiagnostics"
1878
+ logger ("IDE <-- LS NOTIF %s:" , method )
1879
+ if err := handler .IDEConn .SendNotification (method , lsp .EncodeMessage (inoDiag )); err != nil {
1853
1880
logger (" Error sending diagnostics to IDE: %s" , err )
1854
1881
return
1855
1882
}
@@ -1861,7 +1888,7 @@ func (handler *INOLanguageServer) HandleNotificationFromClangd(ctx context.Conte
1861
1888
return
1862
1889
}
1863
1890
1864
- logger ("to IDE" )
1891
+ logger ("IDE <-- LS NOTIF %s:" , method )
1865
1892
if err := handler .IDEConn .SendNotification (method , lsp .EncodeMessage (params )); err != nil {
1866
1893
logger ("Error sending notification to IDE: " + err .Error ())
1867
1894
}
@@ -1877,7 +1904,7 @@ func (handler *INOLanguageServer) HandleRequestFromClangd(ctx context.Context, l
1877
1904
// n := atomic.AddInt64(&handler.clangdMessageCount, 1)
1878
1905
// prefix := fmt.Sprintf("CLG <-- %s %v ", method, n)
1879
1906
1880
- params , err := lsp .DecodeRequestParams (method , paramsRaw )
1907
+ params , err := lsp .DecodeServerRequestParams (method , paramsRaw )
1881
1908
if err != nil {
1882
1909
logger ("Error parsing clang message: %v" , err )
1883
1910
respCallback (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : err .Error ()})
@@ -1926,14 +1953,14 @@ func (handler *INOLanguageServer) HandleRequestFromClangd(ctx context.Context, l
1926
1953
respRaw = paramsRaw
1927
1954
}
1928
1955
1929
- logger ("to IDE" )
1956
+ logger ("IDE <-- LS REQ %s" , method )
1930
1957
resp , respErr , err := handler .IDEConn .SendRequest (ctx , method , respRaw )
1931
1958
if err != nil {
1932
1959
logger ("Error sending request to IDE:" , err )
1933
1960
respCallback (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : err .Error ()})
1934
1961
return
1935
1962
}
1936
-
1963
+ logger ( "IDE --> LS REQ %s" , method )
1937
1964
respCallback (resp , respErr )
1938
1965
}
1939
1966
@@ -2122,14 +2149,17 @@ WhitespaceSensitiveMacros: []
2122
2149
return cleanup , err
2123
2150
}
2124
2151
2125
- func (handler * INOLanguageServer ) showMessage (ctx context. Context , msgType lsp.MessageType , message string ) {
2152
+ func (handler * INOLanguageServer ) showMessage (logger streams. PrefixLogger , msgType lsp.MessageType , message string ) {
2126
2153
defer streams .CatchAndLogPanic ()
2127
2154
2128
2155
params := lsp.ShowMessageParams {
2129
2156
Type : msgType ,
2130
2157
Message : message ,
2131
2158
}
2132
- if err := handler .IDEConn .SendNotification ("window/showMessage" , lsp .EncodeMessage (params )); err != nil {
2159
+
2160
+ method := "window/showMessage"
2161
+ logger ("IDE <-- LS NOTIF %s:" , method )
2162
+ if err := handler .IDEConn .SendNotification (method , lsp .EncodeMessage (params )); err != nil {
2133
2163
// TODO: Log?
2134
2164
}
2135
2165
}
0 commit comments