Skip to content

Commit 6a871f8

Browse files
committed
all: refactoring
1 parent 0c6bb36 commit 6a871f8

File tree

10 files changed

+195
-120
lines changed

10 files changed

+195
-120
lines changed

errors.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// SPDX-License-Identifier: BSD-3-Clause
21
// SPDX-FileCopyrightText: Copyright 2019 The Go Language Server Authors
2+
// SPDX-License-Identifier: BSD-3-Clause
33

44
package jsonrpc2
55

fake/fake.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 The Go Language Server Authors.
1+
// SPDX-FileCopyrightText: Copyright 2021 The Go Language Server Authors
22
// SPDX-License-Identifier: BSD-3-Clause
33

44
// Package fake provides utilities for running tests against a remote LSP server.
@@ -24,7 +24,7 @@ type Connector interface {
2424
// This is a convenience, so that callers don't have to worry about closing each
2525
// connection.
2626
type connList struct {
27-
mu sync.RWMutex
27+
mu sync.Mutex
2828
conns []jsonrpc2.Conn
2929
}
3030

@@ -34,14 +34,17 @@ func (l *connList) add(conn jsonrpc2.Conn) {
3434
l.mu.Unlock()
3535
}
3636

37+
// Close closes conns.
3738
func (l *connList) Close() error {
3839
l.mu.Lock()
40+
3941
var errmsgs []string
4042
for _, conn := range l.conns {
4143
if err := conn.Close(); err != nil {
4244
errmsgs = append(errmsgs, err.Error())
4345
}
4446
}
47+
4548
l.mu.Unlock()
4649

4750
if len(errmsgs) > 0 {
@@ -72,19 +75,19 @@ func NewTCPServer(ctx context.Context, server jsonrpc2.StreamServer, framer json
7275
if err != nil {
7376
panic(fmt.Sprintf("servertest: failed to listen: %v", err))
7477
}
78+
7579
if framer == nil {
7680
framer = jsonrpc2.NewStream
7781
}
7882

7983
go jsonrpc2.Serve(ctx, ln, server, 0)
8084

81-
s := &TCPServer{
85+
return &TCPServer{
8286
connList: &connList{},
8387
Addr: ln.Addr().String(),
8488
ln: ln,
8589
framer: framer,
8690
}
87-
return s
8891
}
8992

9093
// Connect dials the test server and returns a jsonrpc2 Connection that is ready for use.
@@ -103,6 +106,7 @@ func (s *TCPServer) Connect(context.Context) jsonrpc2.Conn {
103106
// PipeServer is a test server that handles connections over io.Pipes.
104107
type PipeServer struct {
105108
*connList
109+
106110
server jsonrpc2.StreamServer
107111
framer jsonrpc2.Framer
108112
}
@@ -112,7 +116,12 @@ func NewPipeServer(_ context.Context, server jsonrpc2.StreamServer, framer jsonr
112116
if framer == nil {
113117
framer = jsonrpc2.NewRawStream
114118
}
115-
return &PipeServer{server: server, framer: framer, connList: &connList{}}
119+
120+
return &PipeServer{
121+
connList: &connList{},
122+
server: server,
123+
framer: framer,
124+
}
116125
}
117126

118127
// Connect creates new io.Pipes and binds them to the underlying StreamServer.
@@ -122,7 +131,6 @@ func (s *PipeServer) Connect(ctx context.Context) jsonrpc2.Conn {
122131
serverStream := s.framer(sPipe)
123132
serverConn := jsonrpc2.NewConn(serverStream)
124133
s.add(serverConn)
125-
126134
go s.server.ServeStream(ctx, serverConn)
127135

128136
clientStream := s.framer(cPipe)

fake/fake_test.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 The Go Language Server Authors.
1+
// SPDX-FileCopyrightText: Copyright 2021 The Go Language Server Authors
22
// SPDX-License-Identifier: BSD-3-Clause
33

44
package fake_test
@@ -25,18 +25,26 @@ func TestTestServer(t *testing.T) {
2525
defer cancel()
2626

2727
server := jsonrpc2.HandlerServer(fakeHandler)
28-
tcp := fake.NewTCPServer(ctx, server, nil)
29-
defer tcp.Close()
3028

31-
tests := []struct {
32-
name string
29+
tcpTS := fake.NewTCPServer(ctx, server, nil)
30+
defer tcpTS.Close()
31+
32+
pipeTS := fake.NewPipeServer(ctx, server, nil)
33+
defer pipeTS.Close()
34+
35+
tests := map[string]struct {
3336
connector fake.Connector
3437
}{
35-
{"tcp", tcp},
38+
"tcp": {
39+
connector: tcpTS,
40+
},
41+
"pipe": {
42+
connector: pipeTS,
43+
},
3644
}
37-
for _, test := range tests {
38-
t.Run(test.name, func(t *testing.T) {
39-
conn := test.connector.Connect(ctx)
45+
for name, tt := range tests {
46+
t.Run(name, func(t *testing.T) {
47+
conn := tt.connector.Connect(ctx)
4048
conn.Go(ctx, jsonrpc2.MethodNotFoundHandler)
4149

4250
var got msg

handler.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// SPDX-License-Identifier: BSD-3-Clause
21
// SPDX-FileCopyrightText: Copyright 2019 The Go Language Server Authors
2+
// SPDX-License-Identifier: BSD-3-Clause
33

44
package jsonrpc2
55

@@ -26,41 +26,46 @@ type Replier func(ctx context.Context, result interface{}, err error) error
2626
//
2727
// This should normally be the final handler in a chain.
2828
func MethodNotFoundHandler(ctx context.Context, reply Replier, req Request) error {
29-
return reply(ctx, nil, fmt.Errorf("%w: %q", ErrMethodNotFound, req.Method()))
29+
return reply(ctx, nil, fmt.Errorf("%q: %w", req.Method(), ErrMethodNotFound))
3030
}
3131

3232
// ReplyHandler creates a Handler that panics if the wrapped handler does
3333
// not call Reply for every request that it is passed.
34-
func ReplyHandler(handler Handler) Handler {
35-
return func(ctx context.Context, reply Replier, req Request) error {
34+
func ReplyHandler(handler Handler) (h Handler) {
35+
h = Handler(func(ctx context.Context, reply Replier, req Request) error {
3636
called := false
3737
err := handler(ctx, func(ctx context.Context, result interface{}, err error) error {
3838
if called {
3939
panic(fmt.Errorf("request %q replied to more than once", req.Method()))
4040
}
4141
called = true
42+
4243
return reply(ctx, result, err)
4344
}, req)
4445
if !called {
4546
panic(fmt.Errorf("request %q was never replied to", req.Method()))
4647
}
4748
return err
48-
}
49+
})
50+
51+
return h
4952
}
5053

5154
// CancelHandler returns a handler that supports cancellation, and a function
5255
// that can be used to trigger canceling in progress requests.
53-
func CancelHandler(handler Handler) (h Handler, cancel func(id ID)) {
56+
func CancelHandler(handler Handler) (h Handler, canceller func(id ID)) {
5457
var mu sync.Mutex
5558
handling := make(map[ID]context.CancelFunc)
5659

57-
h = func(ctx context.Context, reply Replier, req Request) error {
60+
h = Handler(func(ctx context.Context, reply Replier, req Request) error {
5861
if call, ok := req.(*Call); ok {
5962
cancelCtx, cancel := context.WithCancel(ctx)
6063
ctx = cancelCtx
64+
6165
mu.Lock()
6266
handling[call.ID()] = cancel
6367
mu.Unlock()
68+
6469
innerReply := reply
6570
reply = func(ctx context.Context, result interface{}, err error) error {
6671
mu.Lock()
@@ -69,18 +74,19 @@ func CancelHandler(handler Handler) (h Handler, cancel func(id ID)) {
6974
return innerReply(ctx, result, err)
7075
}
7176
}
72-
7377
return handler(ctx, reply, req)
74-
}
78+
})
7579

76-
return h, func(id ID) {
80+
canceller = func(id ID) {
7781
mu.Lock()
7882
cancel, found := handling[id]
7983
mu.Unlock()
8084
if found {
8185
cancel()
8286
}
8387
}
88+
89+
return h, canceller
8490
}
8591

8692
// AsyncHandler returns a handler that processes each request goes in its own
@@ -91,11 +97,11 @@ func CancelHandler(handler Handler) (h Handler, cancel func(id ID)) {
9197
//
9298
// This allows the stream to unblock at the cost of unbounded goroutines
9399
// all stalled on the previous one.
94-
func AsyncHandler(handler Handler) Handler {
100+
func AsyncHandler(handler Handler) (h Handler) {
95101
nextRequest := make(chan struct{})
96102
close(nextRequest)
97103

98-
return func(ctx context.Context, reply Replier, req Request) error {
104+
h = Handler(func(ctx context.Context, reply Replier, req Request) error {
99105
waitForPrevious := nextRequest
100106
nextRequest = make(chan struct{})
101107
unlockNext := nextRequest
@@ -104,6 +110,7 @@ func AsyncHandler(handler Handler) Handler {
104110
close(unlockNext)
105111
return innerReply(ctx, result, err)
106112
}
113+
107114
_, queueDone := event.Start(ctx, "queued")
108115
go func() {
109116
<-waitForPrevious
@@ -113,5 +120,7 @@ func AsyncHandler(handler Handler) Handler {
113120
}
114121
}()
115122
return nil
116-
}
123+
})
124+
125+
return h
117126
}

jsonrpc2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// SPDX-License-Identifier: BSD-3-Clause
21
// SPDX-FileCopyrightText: Copyright 2019 The Go Language Server Authors
2+
// SPDX-License-Identifier: BSD-3-Clause
33

44
// Package jsonrpc2 is an implementation of the JSON-RPC 2 specification for Go.
55
//

0 commit comments

Comments
 (0)