-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
102 lines (86 loc) · 2.57 KB
/
main.go
File metadata and controls
102 lines (86 loc) · 2.57 KB
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
98
99
100
101
102
package main
import (
"bufio"
"encoding/json"
"io"
"os"
"github.com/textwire/lsp/analysis"
"github.com/textwire/lsp/internal/logger"
"github.com/textwire/lsp/lsp"
"github.com/textwire/lsp/rpc"
)
func main() {
defer func() {
if r := recover(); r != nil {
logger.Error.Println("Recovered from panic: ", r)
}
}()
scanner := bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, 4096), rpc.MaxContentLength)
scanner.Split(rpc.Split)
state := analysis.NewState()
writer := os.Stdout
for scanner.Scan() {
msg := scanner.Bytes()
method, content, err := rpc.DecodeMessage(msg)
if err != nil {
logger.Error.Printf("Got an error: %s", err)
continue
}
handleMessage(writer, state, method, content)
}
}
func handleMessage(writer io.Writer, state analysis.State, method string, content []byte) {
switch method {
case "initialize":
var req lsp.InitializeRequest
if err := json.Unmarshal(content, &req); err != nil {
logger.Error.Printf("initialize error: %s", err)
return
}
msg := lsp.NewInitializeResponse(req.ID)
writeResponse(writer, msg)
case "textDocument/didOpen":
var req lsp.DidOpenTextDocumentNotification
if err := json.Unmarshal(content, &req); err != nil {
logger.Error.Printf("textDocument/didOpen error: %s", err)
return
}
state.OpenDocument(req.Params.TextDocument.URI, req.Params.TextDocument.Text)
case "textDocument/didChange":
var req lsp.DidChangeTextDocumentNotification
if err := json.Unmarshal(content, &req); err != nil {
logger.Error.Printf("textDocument/didChange error: %s", err)
return
}
for _, change := range req.Params.ContentChanges {
state.UpdateDocument(req.Params.TextDocument.URI, change.Text)
}
case "textDocument/hover":
var req lsp.HoverRequest
if err := json.Unmarshal(content, &req); err != nil {
logger.Error.Printf("textDocument/hover error: %s", err)
return
}
resp, err := state.Hover(req.ID, req.Params.TextDocument.URI, req.Params.Position)
if err != nil {
logger.Error.Printf("textDocument/hover error: %s", err)
}
writeResponse(writer, resp)
case "textDocument/completion":
var req lsp.CompletionRequest
if err := json.Unmarshal(content, &req); err != nil {
logger.Error.Printf("textDocument/completion error: %s", err)
return
}
resp, err := state.Completion(req.ID, req.Params.TextDocument.URI, req.Params.Position)
if err != nil {
logger.Error.Printf("textDocument/completion error: %s", err)
}
writeResponse(writer, resp)
}
}
func writeResponse(writer io.Writer, msg any) {
reply := rpc.EncodeMessage(msg)
writer.Write([]byte(reply))
}