@@ -5,11 +5,16 @@ import (
55 "encoding/json"
66 "fmt"
77 "io"
8+ "net"
89 "os"
9- "os/exec"
1010 "strconv"
1111 "strings"
1212 "sync"
13+ "time"
14+
15+ "github.com/gopher-fleece/gleece/v2/internal/lsp/server"
16+ "github.com/gopher-fleece/gleece/v2/internal/lsp/server/ipc"
17+ protocol "github.com/tliron/glsp/protocol_3_16"
1318)
1419
1520type lspRequest struct {
@@ -27,39 +32,18 @@ type lspResponse struct {
2732}
2833
2934type LSPClient struct {
30- stdin io.WriteCloser
31- stdout io.ReadCloser
32- stderr io.ReadCloser
35+ conn io.ReadWriteCloser
36+ reader * bufio.Reader
3337 mu sync.Mutex
3438 nextID int64
3539}
3640
37- func newLSPClient (cmd * exec.Cmd ) (* LSPClient , error ) {
38- stdin , err := cmd .StdinPipe ()
39- if err != nil {
40- return nil , err
41- }
42-
43- stdout , err := cmd .StdoutPipe ()
44- if err != nil {
45- return nil , err
46- }
47-
48- stderr , err := cmd .StderrPipe ()
49- if err != nil {
50- return nil , err
51- }
52-
53- if err := cmd .Start (); err != nil {
54- return nil , err
55- }
56-
41+ func newLSPClient (conn io.ReadWriteCloser ) * LSPClient {
5742 return & LSPClient {
58- stdin : stdin ,
59- stdout : stdout ,
60- stderr : stderr ,
43+ conn : conn ,
44+ reader : bufio .NewReader (conn ),
6145 nextID : 1 ,
62- }, nil
46+ }
6347}
6448
6549func (c * LSPClient ) Send (method string , params any ) (* lspResponse , error ) {
@@ -81,18 +65,16 @@ func (c *LSPClient) Send(method string, params any) (*lspResponse, error) {
8165 return nil , err
8266 }
8367
84- if _ , err := fmt .Fprintf (c .stdin , "Content-Length: %d\r \n \r \n " , len (payload )); err != nil {
68+ if _ , err := fmt .Fprintf (c .conn , "Content-Length: %d\r \n \r \n " , len (payload )); err != nil {
8569 return nil , err
8670 }
87- if _ , err := c .stdin .Write (payload ); err != nil {
71+ if _ , err := c .conn .Write (payload ); err != nil {
8872 return nil , err
8973 }
9074
91- reader := bufio .NewReader (c .stdout )
92-
9375 contentLength := 0
9476 for {
95- line , err := reader .ReadString ('\n' )
77+ line , err := c . reader .ReadString ('\n' )
9678 if err != nil {
9779 return nil , err
9880 }
@@ -112,7 +94,7 @@ func (c *LSPClient) Send(method string, params any) (*lspResponse, error) {
11294 }
11395
11496 body := make ([]byte , contentLength )
115- if _ , err := io .ReadFull (reader , body ); err != nil {
97+ if _ , err := io .ReadFull (c . reader , body ); err != nil {
11698 return nil , err
11799 }
118100
@@ -124,16 +106,36 @@ func (c *LSPClient) Send(method string, params any) (*lspResponse, error) {
124106 return & resp , nil
125107}
126108
109+ func (c * LSPClient ) Close () error {
110+ return c .conn .Close ()
111+ }
112+
127113func runLsp () * LSPClient {
128- // Replace this with the actual server executable entrypoint you want to launch.
129- cmd := exec .Command (os .Args [0 ])
114+ const address = "127.0.0.1:43891"
130115
131- client , err := newLSPClient (cmd )
116+ langServer , err := server .NewLanguageServer (ipc.TcpOptions {
117+ Address : address ,
118+ })
132119 if err != nil {
133120 panic (err )
134121 }
135122
136- return client
123+ go func () {
124+ if err := langServer .Run (); err != nil {
125+ panic (err )
126+ }
127+ }()
128+
129+ var conn net.Conn
130+ for range 20 {
131+ conn , err = net .Dial ("tcp" , address )
132+ if err == nil {
133+ return newLSPClient (conn )
134+ }
135+ time .Sleep (50 * time .Millisecond )
136+ }
137+
138+ panic (fmt .Errorf ("failed to connect to lsp server at %s: %w" , address , err ))
137139}
138140
139141func sendInit (client * LSPClient ) {
@@ -146,16 +148,35 @@ func sendInit(client *LSPClient) {
146148 panic (err )
147149 }
148150
149- fmt .Println (string (resp .Result ))
151+ fmt .Printf ("Current PID: %v, Resp: %v" , os .Getpid (), string (resp .Result ))
152+ }
153+
154+ func sendDidChangeTextDocument (client * LSPClient , uri string ) {
155+ body := protocol.DidChangeTextDocumentParams {
156+ TextDocument : protocol.VersionedTextDocumentIdentifier {
157+ TextDocumentIdentifier : protocol.TextDocumentIdentifier {
158+ URI : uri ,
159+ },
160+ },
161+ }
162+
163+ resp , err := client .Send ("textDocument/didChange" , body )
164+ if err != nil {
165+ panic (err )
166+ }
167+
168+ fmt .Printf ("Current PID: %v, Resp: %v" , os .Getpid (), string (resp .Result ))
150169}
151170
152171func main () {
153172 client := runLsp ()
154173 defer func () {
155- _ = client .stdin .Close ()
156- _ = client .stdout .Close ()
157- _ = client .stderr .Close ()
174+ _ = client .Close ()
158175 }()
159176
160177 sendInit (client )
178+ sendDidChangeTextDocument (
179+ client ,
180+ "/mnt/7e91759c-6dd7-4c99-8d38-e6422452a469/git/gleece/test/sanity/sanity.controller.go" ,
181+ )
161182}
0 commit comments