Skip to content

Commit 659302e

Browse files
committed
fix: highlighting issues while typing #28
1 parent 31f0de8 commit 659302e

5 files changed

+107
-13
lines changed

langsrv/document-cache.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package langsrv
2+
3+
import (
4+
protocol "github.com/tliron/glsp/protocol_3_16"
5+
"github.com/vknabel/lithia/ast"
6+
"github.com/vknabel/lithia/parser"
7+
)
8+
9+
type documentCache struct {
10+
documents map[protocol.URI]*textDocumentEntry
11+
}
12+
13+
type textDocumentEntry struct {
14+
item protocol.TextDocumentItem
15+
parser *parser.Parser
16+
fileParser *parser.FileParser
17+
sourceFile *ast.SourceFile
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package langsrv
2+
3+
import (
4+
"github.com/tliron/glsp"
5+
protocol "github.com/tliron/glsp/protocol_3_16"
6+
"github.com/vknabel/lithia/parser"
7+
)
8+
9+
func textDocumentDidChange(context *glsp.Context, params *protocol.DidChangeTextDocumentParams) error {
10+
entry := langserver.documentCache.documents[params.TextDocument.URI]
11+
text := entry.item.Text
12+
for _, event := range params.ContentChanges {
13+
switch e := event.(type) {
14+
case protocol.TextDocumentContentChangeEvent:
15+
langserver.server.Log.Infof("from: %s", text)
16+
text = text[:e.Range.Start.IndexIn(text)] + e.Text + text[e.Range.End.IndexIn(text):]
17+
langserver.server.Log.Infof("to: %s", text)
18+
case protocol.TextDocumentContentChangeEventWhole:
19+
text = e.Text
20+
}
21+
}
22+
entry.item.Text = text
23+
fileParser, errs := entry.parser.Parse("default-module", string(params.TextDocument.URI), text)
24+
if len(errs) > 0 {
25+
// TODO: syntax errors
26+
return parser.NewGroupedSyntaxError(errs)
27+
}
28+
sourceFile, errs := fileParser.ParseSourceFile()
29+
if len(errs) > 0 {
30+
// TODO: syntax errors
31+
return parser.NewGroupedSyntaxError(errs)
32+
}
33+
langserver.server.Log.Infof("%s: %s", params.TextDocument.URI, text)
34+
langserver.documentCache.documents[params.TextDocument.URI].fileParser = fileParser
35+
langserver.documentCache.documents[params.TextDocument.URI].sourceFile = sourceFile
36+
return nil
37+
}
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package langsrv
2+
3+
import (
4+
"github.com/tliron/glsp"
5+
protocol "github.com/tliron/glsp/protocol_3_16"
6+
"github.com/vknabel/lithia/parser"
7+
)
8+
9+
func textDocumentDidOpen(context *glsp.Context, params *protocol.DidOpenTextDocumentParams) error {
10+
lithiaParser := parser.NewParser()
11+
fileParser, errs := lithiaParser.Parse("default-module", string(params.TextDocument.URI), params.TextDocument.Text)
12+
if len(errs) > 0 {
13+
// TODO: syntax errors
14+
return parser.NewGroupedSyntaxError(errs)
15+
}
16+
sourceFile, errs := fileParser.ParseSourceFile()
17+
if len(errs) > 0 {
18+
// TODO: syntax errors
19+
return parser.NewGroupedSyntaxError(errs)
20+
}
21+
langserver.documentCache.documents[params.TextDocument.URI] = &textDocumentEntry{
22+
item: params.TextDocument,
23+
parser: lithiaParser,
24+
fileParser: fileParser,
25+
sourceFile: sourceFile,
26+
}
27+
return nil
28+
}

langsrv/handler-text-document-semantic-tokens-full.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ import (
88
)
99

1010
func textDocumentSemanticTokensFull(context *glsp.Context, params *protocol.SemanticTokensParams) (*protocol.SemanticTokens, error) {
11-
rc := NewReqContext(params.TextDocument)
12-
fileParser, err := rc.createFileParser()
13-
if err != nil && fileParser == nil {
14-
return nil, err
11+
entry := langserver.documentCache.documents[params.TextDocument.URI]
12+
if entry == nil {
13+
return nil, nil
1514
}
16-
rootNode := fileParser.Tree.RootNode()
15+
rootNode := entry.fileParser.Tree.RootNode()
1716
highlightsQuery, err := sitter.NewQuery([]byte(`
1817
[
1918
"func"

langsrv/lang-server.go

+20-8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ var lsName = "lithia"
1212
var debug = true
1313
var handler protocol.Handler
1414

15+
type lithiaLangserver struct {
16+
server *server.Server
17+
documentCache *documentCache
18+
}
19+
20+
var langserver lithiaLangserver = lithiaLangserver{
21+
documentCache: &documentCache{documents: make(map[protocol.URI]*textDocumentEntry)},
22+
}
23+
1524
func init() {
1625
logging.Configure(1, nil)
1726

@@ -21,6 +30,9 @@ func init() {
2130
Shutdown: shutdown,
2231
SetTrace: setTrace,
2332

33+
TextDocumentDidOpen: textDocumentDidOpen,
34+
TextDocumentDidChange: textDocumentDidChange,
35+
2436
TextDocumentHover: textDocumentHover,
2537
TextDocumentCompletion: textDocumentCompletion,
2638
TextDocumentDefinition: textDocumentDefinition,
@@ -32,21 +44,21 @@ func init() {
3244
}
3345

3446
func RunStdio() error {
35-
server := server.NewServer(&handler, lsName, debug)
36-
return server.RunStdio()
47+
langserver.server = server.NewServer(&handler, lsName, debug)
48+
return langserver.server.RunStdio()
3749
}
3850

3951
func RunIPC() error {
40-
server := server.NewServer(&handler, lsName, debug)
41-
return server.RunNodeJs()
52+
langserver.server = server.NewServer(&handler, lsName, debug)
53+
return langserver.server.RunNodeJs()
4254
}
4355

4456
func RunSocket(address string) error {
45-
server := server.NewServer(&handler, lsName, debug)
46-
return server.RunWebSocket(address)
57+
langserver.server = server.NewServer(&handler, lsName, debug)
58+
return langserver.server.RunWebSocket(address)
4759
}
4860

4961
func RunTCP(address string) error {
50-
server := server.NewServer(&handler, lsName, debug)
51-
return server.RunTCP(address)
62+
langserver.server = server.NewServer(&handler, lsName, debug)
63+
return langserver.server.RunTCP(address)
5264
}

0 commit comments

Comments
 (0)