@@ -173,7 +173,7 @@ func NewINOLanguageServer(stdin io.Reader, stdout io.Writer, board Board) *INOLa
173173 logger ("Language server build sketch root: %s" , handler .buildSketchRoot )
174174 }
175175
176- jsonrpcLogger := streams .NewJsonRPCLogger ("IDE" , "LS" , false )
176+ jsonrpcLogger := streams .NewJsonRPCLogger ("IDE" , "LS" )
177177 handler .IDEConn = jsonrpc .NewConnection (stdin , stdout ,
178178 func (ctx context.Context , method string , params json.RawMessage , respCallback func (result json.RawMessage , err * jsonrpc.ResponseError )) {
179179 reqLogger , idx := jsonrpcLogger .LogClientRequest (method , params )
@@ -228,7 +228,7 @@ func (handler *INOLanguageServer) CleanUp() {
228228func (handler * INOLanguageServer ) HandleNotificationFromIDE (ctx context.Context , logger streams.PrefixLogger , method string , paramsRaw json.RawMessage ) {
229229 defer streams .CatchAndLogPanic ()
230230
231- params , err := lsp .DecodeNotificationParams (method , paramsRaw )
231+ params , err := lsp .DecodeClientNotificationParams (method , paramsRaw )
232232 if err != nil {
233233 // TODO: log?
234234 return
@@ -314,10 +314,10 @@ func (handler *INOLanguageServer) HandleNotificationFromIDE(ctx context.Context,
314314 for _ , change := range p .ContentChanges {
315315 logger (" > %s -> %s" , change .Range , strconv .Quote (change .Text ))
316316 }
317+ logger ("LS --> CL NOTIF %s:" , method )
317318 if err := handler .ClangdConn .SendNotification (method , lsp .EncodeMessage (p )); err != nil {
318319 // 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 )
321321 logger ("Please restart the language server." )
322322 handler .Close ()
323323 }
@@ -340,7 +340,7 @@ func (handler *INOLanguageServer) HandleNotificationFromIDE(ctx context.Context,
340340 return
341341 }
342342
343- logger ("sending to Clang" )
343+ logger ("LS --> CL NOTIF %s:" , method )
344344 if err := handler .ClangdConn .SendNotification (method , lsp .EncodeMessage (params )); err != nil {
345345 // Exit the process and trigger a restart by the client in case of a severe error
346346 logger ("Connection error with clangd server:" )
@@ -368,7 +368,7 @@ func (handler *INOLanguageServer) HandleMessageFromIDE(ctx context.Context, logg
368368) {
369369 defer streams .CatchAndLogPanic ()
370370
371- params , err := lsp .DecodeRequestParams (method , paramsRaw )
371+ params , err := lsp .DecodeClientRequestParams (method , paramsRaw )
372372 if err != nil {
373373 returnCB (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInvalidParams , Message : err .Error ()})
374374 return
@@ -531,11 +531,21 @@ func (handler *INOLanguageServer) HandleMessageFromIDE(ctx context.Context, logg
531531 err = e
532532 }
533533
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+
534545 case * lsp.SignatureHelpParams ,
535546 * lsp.DefinitionParams ,
536547 * lsp.TypeDefinitionParams ,
537- * lsp.ImplementationParams ,
538- * lsp.DocumentHighlightParams :
548+ * lsp.ImplementationParams :
539549 // it was *lsp.TextDocumentPositionParams:
540550
541551 // Method: "textDocument/signatureHelp"
@@ -599,10 +609,7 @@ func (handler *INOLanguageServer) HandleMessageFromIDE(ctx context.Context, logg
599609 return
600610 }
601611
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 )
606613 clangRawResp , clangErr , err := handler .ClangdConn .SendRequest (ctx , method , lsp .EncodeMessage (params ))
607614 if err != nil {
608615 // 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
626633 returnCB (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : clangErr .AsError ().Error ()})
627634 return
628635 }
629- clangResp , err := lsp .DecodeResponseResult (method , clangRawResp )
636+ logger ("LS <-- CL RESP %s" , method )
637+ clangResp , err := lsp .DecodeServerResponseResult (method , clangRawResp )
630638 if err != nil {
631639 logger ("Error decoding clang response: %v" , err )
632640 returnCB (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : err .Error ()})
@@ -696,7 +704,9 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
696704 },
697705 }
698706
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 {
700710 logger (" error reinitilizing clangd:" , err )
701711 return err
702712 }
@@ -716,7 +726,7 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
716726 go io .Copy (os .Stderr , clangdStderr )
717727 }
718728
719- rpcLogger := streams .NewJsonRPCLogger ("IDE LS" , "CL" , true )
729+ rpcLogger := streams .NewJsonRPCLogger ("IDE LS" , "CL" )
720730 handler .ClangdConn = jsonrpc .NewConnection (clangdStdio , clangdStdio ,
721731 func (ctx context.Context , method string , params json.RawMessage , respCallback func (result json.RawMessage , err * jsonrpc.ResponseError )) {
722732 logger , idx := rpcLogger .LogServerRequest (method , params )
@@ -726,7 +736,7 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
726736 })
727737 },
728738 func (ctx context.Context , method string , params json.RawMessage ) {
729- logger := rpcLogger .LogClientNotification (method , params )
739+ logger := rpcLogger .LogServerNotification (method , params )
730740 handler .HandleNotificationFromClangd (ctx , logger , method , params )
731741 },
732742 func (e error ) {
@@ -743,20 +753,28 @@ func (handler *INOLanguageServer) initializeWorkbench(logger streams.PrefixLogge
743753 // Send initialization command to clangd
744754 ctx , cancel := context .WithTimeout (context .Background (), time .Second )
745755 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 {
747761 logger (" error initilizing clangd: %v" , err )
748762 return err
749- } else if clangErr != nil {
763+ }
764+ logger ("LS <-- CL RESP %s" , method1 )
765+ if clangErr != nil {
750766 logger (" error initilizing clangd: %v" , clangErr .AsError ())
751767 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 {
753769 logger (" error initilizing clangd: %v" , err )
754770 return err
755771 } else {
756- logger (" clangd successfully started: %v" , resp )
772+ logger ("clangd successfully started: %v" , resp )
757773 }
758774
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 {
760778 logger (" error sending initialized notification to clangd: %v" , err )
761779 return err
762780 }
@@ -804,7 +822,9 @@ func (handler *INOLanguageServer) refreshCppDocumentSymbols(logger streams.Prefi
804822 handler .readUnlock (logger )
805823 cppURI := lsp .NewDocumentURIFromPath (handler .buildSketchCpp )
806824 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 ,
808828 lsp .EncodeMessage (& lsp.DocumentSymbolParams {
809829 TextDocument : lsp.TextDocumentIdentifier {URI : cppURI },
810830 }))
@@ -814,11 +834,12 @@ func (handler *INOLanguageServer) refreshCppDocumentSymbols(logger streams.Prefi
814834 logger ("error: %s" , err )
815835 return fmt .Errorf ("quering source code symbols: %w" , err )
816836 }
837+ logger ("LS <-- CL RESP %s" , method )
817838 if resErr != nil {
818839 logger ("error: %s" , resErr .AsError ())
819840 return fmt .Errorf ("quering source code symbols: %w" , resErr .AsError ())
820841 }
821- result , err := lsp .DecodeResponseResult ("textDocument/documentSymbol" , respRaw )
842+ result , err := lsp .DecodeServerResponseResult ("textDocument/documentSymbol" , respRaw )
822843 if err != nil {
823844 logger ("invalid response: %s" , err )
824845 return fmt .Errorf ("quering source code symbols: invalid response: %w" , err )
@@ -1108,7 +1129,7 @@ func (handler *INOLanguageServer) didChange(logger streams.PrefixLogger, req *ls
11081129 return cppReq , err
11091130}
11101131
1111- func (handler * INOLanguageServer ) handleError (ctx context. Context , err error ) error {
1132+ func (handler * INOLanguageServer ) handleError (logger streams. PrefixLogger , err error ) error {
11121133 errorStr := err .Error ()
11131134 var message string
11141135 if strings .Contains (errorStr , "#error" ) {
@@ -1139,7 +1160,7 @@ func (handler *INOLanguageServer) handleError(ctx context.Context, err error) er
11391160 } else {
11401161 message = "Could not start editor support.\n " + errorStr
11411162 }
1142- go handler .showMessage (ctx , lsp .MessageTypeError , message )
1163+ go handler .showMessage (logger , lsp .MessageTypeError , message )
11431164 return errors .New (message )
11441165}
11451166
@@ -1266,24 +1287,31 @@ func (handler *INOLanguageServer) cpp2inoDocumentURI(logger streams.PrefixLogger
12661287}
12671288
12681289func (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 )
12711296 if err != nil {
1272- return res , err
1297+ logger ("%s -> invalid text document: %s" , prefix , err )
1298+ return lsp.TextDocumentPositionParams {}, err
12731299 }
1274- cppPosition := inoParams .Position
1275- inoURI := inoParams .TextDocument .URI
1300+ cppPosition := inoPosition
12761301 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 {
12781303 cppPosition .Line = cppLine
12791304 } 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 )
12821307 }
12831308 }
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
12871315}
12881316
12891317func (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
17831811func (handler * INOLanguageServer ) HandleNotificationFromClangd (ctx context.Context , logger streams.PrefixLogger , method string , paramsRaw json.RawMessage ) {
17841812 defer streams .CatchAndLogPanic ()
17851813
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 )
17901815 if err != nil {
17911816 logger ("error parsing clang message:" , err )
17921817 return
17931818 }
17941819 if params == nil {
17951820 // passthrough
1796- logger ("passing through message" )
1821+ logger ("IDE <-- LS NOTIF %s: passing through message" , method )
17971822 if err := handler .IDEConn .SendNotification (method , paramsRaw ); err != nil {
17981823 logger ("Error sending notification to IDE: " + err .Error ())
17991824 }
@@ -1849,7 +1874,9 @@ func (handler *INOLanguageServer) HandleNotificationFromClangd(ctx context.Conte
18491874 for _ , diag := range inoDiag .Diagnostics {
18501875 logger ("> %d:%d - %v: %s" , diag .Range .Start .Line , diag .Range .Start .Character , diag .Severity , diag .Code )
18511876 }
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 {
18531880 logger (" Error sending diagnostics to IDE: %s" , err )
18541881 return
18551882 }
@@ -1861,7 +1888,7 @@ func (handler *INOLanguageServer) HandleNotificationFromClangd(ctx context.Conte
18611888 return
18621889 }
18631890
1864- logger ("to IDE" )
1891+ logger ("IDE <-- LS NOTIF %s:" , method )
18651892 if err := handler .IDEConn .SendNotification (method , lsp .EncodeMessage (params )); err != nil {
18661893 logger ("Error sending notification to IDE: " + err .Error ())
18671894 }
@@ -1877,7 +1904,7 @@ func (handler *INOLanguageServer) HandleRequestFromClangd(ctx context.Context, l
18771904 // n := atomic.AddInt64(&handler.clangdMessageCount, 1)
18781905 // prefix := fmt.Sprintf("CLG <-- %s %v ", method, n)
18791906
1880- params , err := lsp .DecodeRequestParams (method , paramsRaw )
1907+ params , err := lsp .DecodeServerRequestParams (method , paramsRaw )
18811908 if err != nil {
18821909 logger ("Error parsing clang message: %v" , err )
18831910 respCallback (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : err .Error ()})
@@ -1926,14 +1953,14 @@ func (handler *INOLanguageServer) HandleRequestFromClangd(ctx context.Context, l
19261953 respRaw = paramsRaw
19271954 }
19281955
1929- logger ("to IDE" )
1956+ logger ("IDE <-- LS REQ %s" , method )
19301957 resp , respErr , err := handler .IDEConn .SendRequest (ctx , method , respRaw )
19311958 if err != nil {
19321959 logger ("Error sending request to IDE:" , err )
19331960 respCallback (nil , & jsonrpc.ResponseError {Code : jsonrpc .ErrorCodesInternalError , Message : err .Error ()})
19341961 return
19351962 }
1936-
1963+ logger ( "IDE --> LS REQ %s" , method )
19371964 respCallback (resp , respErr )
19381965}
19391966
@@ -2122,14 +2149,17 @@ WhitespaceSensitiveMacros: []
21222149 return cleanup , err
21232150}
21242151
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 ) {
21262153 defer streams .CatchAndLogPanic ()
21272154
21282155 params := lsp.ShowMessageParams {
21292156 Type : msgType ,
21302157 Message : message ,
21312158 }
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 {
21332163 // TODO: Log?
21342164 }
21352165}
0 commit comments