Skip to content

Commit 63c7ad1

Browse files
committed
Major improvement in logging
1 parent 2e2166a commit 63c7ad1

File tree

2 files changed

+96
-94
lines changed

2 files changed

+96
-94
lines changed

Diff for: handler/handler.go

+78-48
Original file line numberDiff line numberDiff line change
@@ -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() {
228228
func (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

12681289
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)
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

12891317
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
17831811
func (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

Comments
 (0)