This is a fork of tliron/glsp
with a focus on reducing unnecessary
dependencies.
Language Server Protocol SDK for Go.
It enables you to more easily implement language servers by writing them in Go. GLSP contains:
- all the message structures for easy serialization,
- a handler for all client methods, and
- a ready-to-run JSON-RPC 2.0 server supporting stdio, TCP, WebSockets, and Node.js IPC.
All you need to do, then, is provide the features for the language you want to support.
Projects using GLSP:
- go-lsp is another implementation with reduced coverage of the protocol
package main
import (
"github.com/tliron/glsp"
protocol "github.com/tliron/glsp/protocol_3_16"
"github.com/tliron/glsp/server"
"github.com/tliron/commonlog"
// Must include a backend implementation
// See CommonLog for other options: https://github.com/tliron/commonlog
_ "github.com/tliron/commonlog/simple"
)
const lsName = "my language"
var (
version string = "0.0.1"
handler protocol.Handler
)
func main() {
// This increases logging verbosity (optional)
commonlog.Configure(1, nil)
handler = protocol.Handler{
Initialize: initialize,
Initialized: initialized,
Shutdown: shutdown,
SetTrace: setTrace,
}
server := server.NewServer(&handler, lsName, false)
server.RunStdio()
}
func initialize(context *glsp.Context, params *protocol.InitializeParams) (any, error) {
capabilities := handler.CreateServerCapabilities()
return protocol.InitializeResult{
Capabilities: capabilities,
ServerInfo: &protocol.InitializeResultServerInfo{
Name: lsName,
Version: &version,
},
}, nil
}
func initialized(context *glsp.Context, params *protocol.InitializedParams) error {
return nil
}
func shutdown(context *glsp.Context) error {
protocol.SetTraceValue(protocol.TraceValueOff)
return nil
}
func setTrace(context *glsp.Context, params *protocol.SetTraceParams) error {
protocol.SetTraceValue(params.Value)
return nil
}