all repos

clerk @ 9369172

missing tooling for ledger/hledger

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp: diagnostics, 20 days ago
1
package lsp
2
3
import (
4
	"context"
5
6
	"go.lsp.dev/protocol"
7
	"go.lsp.dev/uri"
8
)
9
10
func (s *server) DidOpen(ctx context.Context, params *protocol.DidOpenTextDocumentParams) error {
11
	s.openDoc(params.TextDocument.URI,
12
		params.TextDocument.Text,
13
		params.TextDocument.Version,
14
		params.TextDocument.LanguageID)
15
	s.scheduleWorkspaceRebuild(ctx)
16
	return nil
17
}
18
19
func (s *server) DidChange(ctx context.Context, params *protocol.DidChangeTextDocumentParams) error {
20
	s.updateDoc(params.TextDocument.URI, params.TextDocument.Version, params.ContentChanges)
21
	s.scheduleWorkspaceRebuild(ctx)
22
	return nil
23
}
24
25
func (s *server) DidClose(ctx context.Context, params *protocol.DidCloseTextDocumentParams) error {
26
	s.closeDoc(params.TextDocument.URI)
27
	s.scheduleWorkspaceRebuild(ctx)
28
	return nil
29
}
30
31
func (s *server) DidSave(ctx context.Context, params *protocol.DidSaveTextDocumentParams) error {
32
	return nil
33
}
34
35
// Document management
36
37
func (s *server) openDoc(u uri.URI, text string, version int32, langID protocol.LanguageKind) {
38
	s.mu.Lock()
39
	s.openDocs[u] = docState{
40
		text:       text,
41
		version:    version,
42
		languageID: langID,
43
	}
44
	s.mu.Unlock()
45
}
46
47
func (s *server) updateDoc(u uri.URI, version int32, changes []protocol.TextDocumentContentChangeEvent) {
48
	s.mu.Lock()
49
	defer s.mu.Unlock()
50
51
	state, ok := s.openDocs[u]
52
	if !ok {
53
		return
54
	}
55
	state.version = version
56
	for _, ch := range changes {
57
		switch ev := ch.(type) {
58
		case *protocol.TextDocumentContentChangeWholeDocument:
59
			state.text = ev.Text
60
		case *protocol.TextDocumentContentChangePartial:
61
			_ = ev // TODO: incremental edit support
62
		}
63
	}
64
	s.openDocs[u] = state
65
}
66
67
func (s *server) closeDoc(u uri.URI) {
68
	s.mu.Lock()
69
	delete(s.openDocs, u)
70
	s.mu.Unlock()
71
}
72
73
func (s *server) getDocText(u uri.URI) (string, bool) {
74
	s.mu.Lock()
75
	state, ok := s.openDocs[u]
76
	s.mu.Unlock()
77
	return state.text, ok
78
}