mirror of
https://github.com/golang/go.git
synced 2025-05-05 23:53:05 +00:00
This adds the ability to tie a background context to the context that created it in traces, and also cleans up and annotates the context used in type checking. This gives us detailed connected traces of all the type checking and parsing logic. Change-Id: I32721220a50ecb9b4404a4e9354343389d7a5219 Reviewed-on: https://go-review.googlesource.com/c/tools/+/183757 Reviewed-by: Rebecca Stambler <rstambler@golang.org>
54 lines
1.7 KiB
Go
54 lines
1.7 KiB
Go
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package protocol
|
|
|
|
import (
|
|
"context"
|
|
|
|
"golang.org/x/tools/internal/jsonrpc2"
|
|
"golang.org/x/tools/internal/lsp/telemetry/trace"
|
|
"golang.org/x/tools/internal/lsp/xlog"
|
|
)
|
|
|
|
const defaultMessageBufferSize = 20
|
|
const defaultRejectIfOverloaded = false
|
|
|
|
func canceller(ctx context.Context, conn *jsonrpc2.Conn, id jsonrpc2.ID) {
|
|
ctx = detatchContext(ctx)
|
|
ctx, span := trace.StartSpan(ctx, "protocol.canceller")
|
|
defer span.End()
|
|
conn.Notify(ctx, "$/cancelRequest", &CancelParams{ID: id})
|
|
}
|
|
|
|
func NewClient(stream jsonrpc2.Stream, client Client) (*jsonrpc2.Conn, Server, xlog.Logger) {
|
|
log := xlog.New(NewLogger(client))
|
|
conn := jsonrpc2.NewConn(stream)
|
|
conn.Capacity = defaultMessageBufferSize
|
|
conn.RejectIfOverloaded = defaultRejectIfOverloaded
|
|
conn.Handler = clientHandler(log, client)
|
|
conn.Canceler = jsonrpc2.Canceler(canceller)
|
|
return conn, &serverDispatcher{Conn: conn}, log
|
|
}
|
|
|
|
func NewServer(stream jsonrpc2.Stream, server Server) (*jsonrpc2.Conn, Client, xlog.Logger) {
|
|
conn := jsonrpc2.NewConn(stream)
|
|
client := &clientDispatcher{Conn: conn}
|
|
log := xlog.New(NewLogger(client))
|
|
conn.Capacity = defaultMessageBufferSize
|
|
conn.RejectIfOverloaded = defaultRejectIfOverloaded
|
|
conn.Handler = serverHandler(log, server)
|
|
conn.Canceler = jsonrpc2.Canceler(canceller)
|
|
return conn, client, log
|
|
}
|
|
|
|
func sendParseError(ctx context.Context, log xlog.Logger, req *jsonrpc2.Request, err error) {
|
|
if _, ok := err.(*jsonrpc2.Error); !ok {
|
|
err = jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
|
}
|
|
if err := req.Reply(ctx, nil, err); err != nil {
|
|
log.Errorf(ctx, "%v", err)
|
|
}
|
|
}
|