all repos

clerk @ f9a2588

missing tooling for ledger/hledger

clerk/internal/lsp/lsp.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp server, 20 days ago
1
package lsp
2
3
import (
4
	"context"
5
	"io"
6
7
	"go.lsp.dev/jsonrpc2"
8
	"go.lsp.dev/protocol"
9
	"go.lsp.dev/uri"
10
11
	"olexsmir.xyz/clerk/internal/linter"
12
	"olexsmir.xyz/clerk/journal/printer"
13
	"olexsmir.xyz/clerk/journal/semantic"
14
)
15
16
type Server struct {
17
	sema   *semantic.Context
18
	linter *linter.Linter
19
20
	version string
21
	server  *server
22
}
23
24
func NewServer(version string) *Server {
25
	return &Server{
26
		// sema:   sema,
27
		// linter: linter,
28
		server: &server{
29
			version:    version,
30
			printerCfg: printer.DefaultConfig,
31
			docs:       make(map[uri.URI]docState),
32
		},
33
	}
34
}
35
36
func (s *Server) Run(ctx context.Context, stdin io.ReadCloser, stdout io.WriteCloser) error {
37
	stream := jsonrpc2.NewStream(readWriterCloser{
38
		Reader: stdin,
39
		Writer: stdout,
40
		Closer: stdin,
41
	})
42
43
	_, conn, client := protocol.NewServer(ctx, s.server, stream)
44
	defer conn.Close()
45
46
	s.server.client = client
47
48
	<-conn.Done()
49
	return conn.Err()
50
}
51
52
type readWriterCloser struct {
53
	io.Reader
54
	io.Writer
55
	io.Closer
56
}