in internal/langserver/handlers/service.go [62:227]
func (svc *service) Assigner() (jrpc2.Assigner, error) {
svc.logger.Println("Preparing new session ...")
session := session.NewSession(svc.stopSession)
err := session.Prepare()
if err != nil {
return nil, fmt.Errorf("Unable to prepare session: %w", err)
}
svc.telemetry = &telemetry.NoopSender{Logger: svc.logger}
svc.fs.SetLogger(svc.logger)
lh := LogHandler(svc.logger)
cc := &lsp.ClientCapabilities{}
clientName := ""
m := map[string]rpch.Func{
"initialize": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.Initialize(req)
if err != nil {
return nil, err
}
ctx = ilsp.WithClientCapabilities(ctx, cc)
ctx = ilsp.ContextWithClientName(ctx, &clientName)
version, ok := lsctx.LanguageServerVersion(svc.srvCtx)
if ok {
ctx = lsctx.WithLanguageServerVersion(ctx, version)
}
return handle(ctx, req, svc.Initialize)
},
"initialized": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.ConfirmInitialization(req)
if err != nil {
return nil, err
}
return handle(ctx, req, Initialized)
},
"textDocument/didChange": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
ctx = lsctx.WithDiagnosticsNotifier(ctx, svc.diagsNotifier)
return handle(ctx, req, TextDocumentDidChange)
},
"textDocument/didOpen": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
ctx = lsctx.WithDiagnosticsNotifier(ctx, svc.diagsNotifier)
return handle(ctx, req, lh.TextDocumentDidOpen)
},
"textDocument/didClose": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
return handle(ctx, req, TextDocumentDidClose)
},
"textDocument/didSave": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = lsctx.WithDiagnosticsNotifier(ctx, svc.diagsNotifier)
return handle(ctx, req, lh.TextDocumentDidSave)
},
"textDocument/completion": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
ctx = ilsp.WithClientCapabilities(ctx, cc)
ctx = lsctx.WithTelemetry(ctx, svc.telemetry)
return handle(ctx, req, svc.TextDocumentComplete)
},
"textDocument/hover": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
ctx = ilsp.WithClientCapabilities(ctx, cc)
ctx = ilsp.ContextWithClientName(ctx, &clientName)
ctx = lsctx.WithTelemetry(ctx, svc.telemetry)
return handle(ctx, req, svc.TextDocumentHover)
},
"textDocument/codeAction": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = ilsp.WithClientCapabilities(ctx, cc)
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
return handle(ctx, req, lh.TextDocumentCodeAction)
},
"workspace/executeCommand": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
ctx = lsctx.WithClientCaller(ctx, svc.clientCaller)
ctx = lsctx.WithClientNotifier(ctx, svc.clientNotifier)
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
ctx = lsctx.WithTelemetry(ctx, svc.telemetry)
return handle(ctx, req, svc.WorkspaceExecuteCommand)
},
"shutdown": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.Shutdown(req)
if err != nil {
return nil, err
}
ctx = lsctx.WithDocumentStorage(ctx, svc.fs)
svc.shutdown()
return handle(ctx, req, Shutdown)
},
"exit": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.Exit()
if err != nil {
return nil, err
}
svc.stopSession()
return nil, nil
},
"$/cancelRequest": func(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
err := session.CheckInitializationIsConfirmed()
if err != nil {
return nil, err
}
return handle(ctx, req, CancelRequest)
},
}
// For use in tests, e.g. to test request cancellation
if len(svc.additionalHandlers) > 0 {
for methodName, handlerFunc := range svc.additionalHandlers {
m[methodName] = handlerFunc
}
}
return convertMap(m), nil
}