all repos

clerk @ d7328be

missing tooling for ledger/hledger

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp: completion, 2 months ago
1
package lsp
2
3
import (
4
	"context"
5
6
	"go.lsp.dev/protocol"
7
	"go.lsp.dev/uri"
8
9
	"olexsmir.xyz/clerk/journal/ast"
10
	"olexsmir.xyz/clerk/journal/lexer"
11
	"olexsmir.xyz/clerk/journal/parser"
12
)
13
14
func (s *server) DidOpen(ctx context.Context, params *protocol.DidOpenTextDocumentParams) error {
15
	s.openDoc(params.TextDocument.URI, params.TextDocument.Text, params.TextDocument.Version, params.TextDocument.LanguageID)
16
	s.scheduleDiagnostics(ctx)
17
	return nil
18
}
19
20
func (s *server) DidChange(ctx context.Context, params *protocol.DidChangeTextDocumentParams) error {
21
	s.updateDoc(params.TextDocument.URI, params.TextDocument.Version, params.ContentChanges)
22
	s.scheduleDiagnostics(ctx)
23
	return nil
24
}
25
26
func (s *server) DidClose(ctx context.Context, params *protocol.DidCloseTextDocumentParams) error {
27
	s.closeDoc(params.TextDocument.URI)
28
	s.scheduleDiagnostics(ctx)
29
	return nil
30
}
31
32
func (s *server) DidSave(ctx context.Context, params *protocol.DidSaveTextDocumentParams) error {
33
	return nil
34
}
35
36
// Document management
37
38
func (s *server) openDoc(u uri.URI, text string, version int32, langID protocol.LanguageKind) {
39
	s.mu.Lock()
40
	s.openDocs[u] = docState{
41
		text:       text,
42
		version:    version,
43
		languageID: langID,
44
	}
45
	s.mu.Unlock()
46
}
47
48
func (s *server) updateDoc(u uri.URI, version int32, changes []protocol.TextDocumentContentChangeEvent) {
49
	s.mu.Lock()
50
	defer s.mu.Unlock()
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
			state.semTokens = nil
61
		case *protocol.TextDocumentContentChangePartial:
62
			_ = ev // TODO: incremental edit support
63
		}
64
	}
65
	s.openDocs[u] = state
66
}
67
68
func (s *server) closeDoc(u uri.URI) {
69
	s.mu.Lock()
70
	delete(s.openDocs, u)
71
	s.mu.Unlock()
72
}
73
74
func (s *server) getDocText(u uri.URI) (string, bool) {
75
	s.mu.Lock()
76
	state, ok := s.openDocs[u]
77
	s.mu.Unlock()
78
	return state.text, ok
79
}
80
81
func (s *server) getDocState(u uri.URI) (docState, bool) {
82
	s.mu.Lock()
83
	state, ok := s.openDocs[u]
84
	s.mu.Unlock()
85
	return state, ok
86
}
87
88
// parseJournalStr parses a raw journal string into an AST.
89
func parseJournalStr(content string) *ast.Journal {
90
	l := lexer.New("", []byte(content))
91
	p := parser.New(l)
92
	return p.ParseJournal()
93
}