/
text_synchronization.go
97 lines (81 loc) · 3.02 KB
/
text_synchronization.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package impl
import (
"context"
"io/ioutil"
"net/url"
"os"
"github.com/antlr/antlr4/runtime/Go/antlr"
"github.com/anz-bank/sysl/pkg/lsp/framework/lsp/protocol"
)
type SyslErrorListener struct {
antlr.ErrorListener
Errors []protocol.Diagnostic
ctx context.Context
client protocol.Client
}
func NewSyslErrorListener(ctx context.Context, client protocol.Client) *SyslErrorListener {
return &SyslErrorListener{Errors: []protocol.Diagnostic{}, ctx: ctx, client: client}
}
func (l *SyslErrorListener) SyntaxError(recognizer antlr.Recognizer, offendingSymbol interface{}, line, column int, msg string, e antlr.RecognitionException) {
// assume an offendingSymbol is an antlr.Token type
token := offendingSymbol.(antlr.Token)
// continue
l.Errors = append(l.Errors, protocol.Diagnostic{
Message: msg,
Range: protocol.Range{
Start: protocol.Position{
Line: uint32(line - 1),
Character: uint32(column),
},
End: protocol.Position{
Line: uint32(line - 1),
Character: uint32(column + len(token.GetText())),
},
},
Severity: protocol.SeverityError,
Source: "sysl-lsp",
Tags: []protocol.DiagnosticTag{},
})
}
func (l *SyslErrorListener) ReportAmbiguity(recognizer antlr.Parser, dfa *antlr.DFA, startIndex, stopIndex int, exact bool, ambigAlts *antlr.BitSet, configs antlr.ATNConfigSet) {
}
func (l *SyslErrorListener) ReportAttemptingFullContext(recognizer antlr.Parser, dfa *antlr.DFA, startIndex, stopIndex int, conflictingAlts *antlr.BitSet, configs antlr.ATNConfigSet) {
}
func (l *SyslErrorListener) ReportContextSensitivity(recognizer antlr.Parser, dfa *antlr.DFA, startIndex, stopIndex, prediction int, configs antlr.ATNConfigSet) {
}
func (s *Server) didOpen(ctx context.Context, params *protocol.DidOpenTextDocumentParams) error {
return s.didModifyFiles(ctx, params.TextDocument.URI, params.TextDocument.Version)
}
func (s *Server) didChange(ctx context.Context, params *protocol.DidChangeTextDocumentParams) error {
return nil
}
// only show syntax diagnostics on save
func (s *Server) didSave(ctx context.Context, params *protocol.DidSaveTextDocumentParams) error {
return s.didModifyFiles(ctx, params.TextDocument.URI, 0)
}
func (s *Server) didClose(ctx context.Context, params *protocol.DidCloseTextDocumentParams) error {
// If a file has been closed and is not on disk, clear its diagnostics.
uri := params.TextDocument.URI
url, err := url.Parse(string(params.TextDocument.URI))
if err != nil {
return err
}
fh, err := os.Open(url.Path)
if err != nil {
return s.client.PublishDiagnostics(ctx, &protocol.PublishDiagnosticsParams{
URI: uri,
Diagnostics: []protocol.Diagnostic{},
})
}
defer fh.Close()
if _, err := ioutil.ReadAll(fh); err != nil {
return s.client.PublishDiagnostics(ctx, &protocol.PublishDiagnosticsParams{
URI: uri,
Diagnostics: []protocol.Diagnostic{},
})
}
return nil
}
func (s *Server) didModifyFiles(ctx context.Context, uri protocol.DocumentURI, version int32) error {
return s.provideSyntaxDiagnostics(ctx, uri, version)
}