in src/ulsp/controller/ulsp-daemon/methods_lifecycle.go [18:84]
func (c *controller) Initialize(ctx context.Context, params *protocol.InitializeParams) (*protocol.InitializeResult, error) {
result := &protocol.InitializeResult{
ServerInfo: &protocol.ServerInfo{
Name: "Uber Language Server",
},
}
s, err := c.sessions.GetFromContext(ctx)
if err != nil {
return nil, fmt.Errorf("getting session from context: %w", err)
}
s.InitializeParams = params
if s.WorkspaceRoot, err = c.workspaceUtils.GetWorkspaceRoot(ctx, params.WorkspaceFolders); err != nil {
s.UlspEnabled = false
c.logger.Warnf("getting workspace root: %s", err)
}
if s.WorkspaceRoot != "" {
if s.Monorepo, err = c.workspaceUtils.GetRepoName(ctx, s.WorkspaceRoot); err != nil {
return nil, fmt.Errorf("getting repo name: %w", err)
}
if s.Env, err = c.workspaceUtils.GetEnv(ctx, s.WorkspaceRoot); err != nil {
return nil, fmt.Errorf("getting environment: %w", err)
}
}
if err := c.sessions.Set(ctx, s); err != nil {
return nil, fmt.Errorf("setting updated session state: %w", err)
}
if s.UlspEnabled {
result.Capabilities = protocol.ServerCapabilities{
TextDocumentSync: protocol.TextDocumentSyncOptions{
OpenClose: true,
Change: protocol.TextDocumentSyncKindIncremental,
Save: &protocol.SaveOptions{
IncludeText: true,
},
WillSave: true,
WillSaveWaitUntil: true,
},
}
if err := c.registerSessionPlugins(ctx); err != nil {
return nil, fmt.Errorf("registering session plugins: %w", err)
}
}
callSync := func(ctx context.Context, m *ulspplugin.Methods) {
if err := m.Initialize(ctx, params, result); err != nil {
c.logger.Errorf(_errPluginReturnedError, m.PluginNameKey, err)
}
}
callAsync := func(ctx context.Context, m *ulspplugin.Methods) {
if err := m.Initialize(ctx, params, nil); err != nil {
c.logger.Errorf(_errPluginReturnedError, m.PluginNameKey, err)
}
}
if err := c.executePluginMethods(ctx, protocol.MethodInitialize, callSync, callAsync); err != nil {
return nil, fmt.Errorf(_errBadPluginCall, err)
}
return result, nil
}