func()

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
}