Skip to content

How to implement #1

Open
Open
@kirides

Description

@kirides

How do you implement a language server using this repository?

I tried the following and it creates nilpointer exceptions because "Server" is empty

func NewLangServer(logger *zap.Logger) *LangServer {
	server := new(LangServer)

	return server
}
type LangServer struct {
	protocol.Server
}

Initialized like this:

f, _ := os.Create("lsp-log.txt")
logr, _ := zap.NewDevelopment(zap.ErrorOutput(f))
srv := NewLangServer(logr)
conn, cl := protocol.NewServer(ctx,
                                srv,
                                jsonrpc2.NewStream(os.Stdin, os.Stdout),
                                logr,
                                jsonrpc2.WithLogger(logr))
if err := conn.Run(ctx); err != nil {
	// ...
}
if err := cl.Run(ctx); err != nil {
	// ...
}

produces

2019-06-22T14:57:45.363+0200	DEBUG	jsonrpc2/jsonrpc2.go:346	deliver
panic: runtime error: invalid memory address or nil pointer dereference

which happens in server_json.go

func ServerHandler(ctx context.Context, server ServerInterface, logger *zap.Logger) jsonrpc2.Handler {
	return func(ctx context.Context, conn *jsonrpc2.Conn, r *jsonrpc2.Request) {
		dec := json.NewDecoder(bytes.NewReader(*r.Params))

		switch r.Method {
		case MethodInitialize:
			var params InitializeParams
			if err := dec.Decode(&params); err != nil {
				ReplyError(ctx, err, conn, r, logger)
				return
			}
			// error here: server....
			resp, err := server.Initialize(ctx, &params)
			if err := conn.Reply(ctx, r, resp, err); err != nil {
				logger.Error(MethodInitialize, zap.Error(err))
			}
			// .... more
		}
	}
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions