From 7041a1bcf448d61dcf23859e6dcec787eebc8a38 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Thu, 12 Oct 2023 13:21:15 +0800 Subject: [PATCH 1/2] paramsEx --- gopls/goxls/lsview/lsview.go | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/gopls/goxls/lsview/lsview.go b/gopls/goxls/lsview/lsview.go index cb941614613..83614e48a5f 100644 --- a/gopls/goxls/lsview/lsview.go +++ b/gopls/goxls/lsview/lsview.go @@ -52,7 +52,7 @@ func Main(app, goxls string) { id := req.ID() log.Printf("[%v] %s:\n%s", id, req.Method(), params(req.Params())) reqChan <- id - resp := respFetch(respChan) + resp, ret := respFetch(respChan) if resp != nil { log.Printf("[%v] %s ret:\n%s", id, app, resp) } @@ -60,9 +60,9 @@ func Main(app, goxls string) { select { // allow send request failed case <-time.After(time.Second): case reqChan2 <- id: - if resp2 := respFetch(respChan2); resp2 != nil { + if resp2, ret2 := respFetch(respChan2); resp2 != nil { log.Printf("[%v] %s ret:\n%s", id, goxls, resp2) - if !reflect.DeepEqual(resp, resp2) { + if !reflect.DeepEqual(ret, ret2) { logd.Printf("[%v] %s:\n%s", id, req.Method(), params(req.Params())) logd.Printf("[%v] %s ret:\n%s", id, app, resp) logd.Printf("[%v] %s ret:\n%s", id, goxls, resp2) @@ -82,19 +82,17 @@ func Main(app, goxls string) { select {} } -func respFetch(respChan chan *jsonrpc2.Response) any { +func respFetch(respChan chan *jsonrpc2.Response) (any, any) { select { case <-time.After(time.Second): case resp := <-respChan: ret := any(resp.Err()) if ret == nil { - ret = params(resp.Result()) - } else { - ret = fmt.Sprintf("%serror: %v\n", indent, ret) + return paramsEx(resp.Result()) } - return ret + return fmt.Sprintf("%serror: %v\n", indent, ret), nil } - return nil + return nil, nil } func respLoop(app string, respChan chan *jsonrpc2.Response, reqChan chan jsonrpc2.ID) { @@ -143,16 +141,25 @@ func params(raw json.RawMessage) []byte { if err != nil { return raw } - return paramsEx(ret, indent) + return paramsFmt(ret, indent) +} + +func paramsEx(raw json.RawMessage) ([]byte, any) { + var ret any + err := json.Unmarshal(raw, &ret) + if err != nil { + return raw, ret + } + return paramsFmt(ret, indent), ret } -func paramsEx(ret any, prefix string) []byte { +func paramsFmt(ret any, prefix string) []byte { var b bytes.Buffer switch val := ret.(type) { case mapt: for k, v := range val { if isComplex(v) { - fmt.Fprintf(&b, "%s%s:\n%s", prefix, k, paramsEx(v, prefix+indent)) + fmt.Fprintf(&b, "%s%s:\n%s", prefix, k, paramsFmt(v, prefix+indent)) } else { fmt.Fprintf(&b, "%s%s: %v\n", prefix, k, v) } From faaef51eddd4d71156bb7589217b221a8adbd244 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Thu, 12 Oct 2023 13:48:21 +0800 Subject: [PATCH 2/2] params: map sort keys --- gopls/goxls/lsview/lsview.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gopls/goxls/lsview/lsview.go b/gopls/goxls/lsview/lsview.go index 83614e48a5f..8dc42cfca05 100644 --- a/gopls/goxls/lsview/lsview.go +++ b/gopls/goxls/lsview/lsview.go @@ -14,6 +14,7 @@ import ( "log" "os" "reflect" + "sort" "time" "golang.org/x/tools/internal/fakenet" @@ -157,7 +158,9 @@ func paramsFmt(ret any, prefix string) []byte { var b bytes.Buffer switch val := ret.(type) { case mapt: - for k, v := range val { + keys := keys(val) + for _, k := range keys { + v := val[k] if isComplex(v) { fmt.Fprintf(&b, "%s%s:\n%s", prefix, k, paramsFmt(v, prefix+indent)) } else { @@ -194,6 +197,15 @@ func isComplex(v any) bool { return ok } +func keys(v mapt) []string { + ret := make([]string, 0, len(v)) + for key := range v { + ret = append(ret, key) + } + sort.Strings(ret) + return ret +} + func check(err error) { if err != nil { log.Panicln(err)