From a065de381f0343b580db47509a8c0f46384c7ae8 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 2 Mar 2026 13:47:07 +0200 Subject: lsp: simplify ServerOptions to config-first model (task 410) --- internal/hexailsp/run.go | 63 ++++---------------------------------- internal/hexailsp/run_more_test.go | 14 ++++++--- internal/hexailsp/run_test.go | 26 ++++++++++------ 3 files changed, 32 insertions(+), 71 deletions(-) (limited to 'internal/hexailsp') diff --git a/internal/hexailsp/run.go b/internal/hexailsp/run.go index e357cbb..3c86414 100644 --- a/internal/hexailsp/run.go +++ b/internal/hexailsp/run.go @@ -137,63 +137,12 @@ func ensureFactory(factory ServerFactory) ServerFactory { } func makeServerOptions(cfg appconfig.App, logContext bool, client llm.Client, loadOpts appconfig.LoadOptions, ignoreChecker *ignore.Checker) lsp.ServerOptions { - // Map custom actions from appconfig to lsp type - var customs []lsp.CustomAction - if len(cfg.CustomActions) > 0 { - customs = make([]lsp.CustomAction, 0, len(cfg.CustomActions)) - for _, ca := range cfg.CustomActions { - customs = append(customs, lsp.CustomAction{ - ID: ca.ID, - Title: ca.Title, - Kind: ca.Kind, - Scope: ca.Scope, - Instruction: ca.Instruction, - System: ca.System, - User: ca.User, - }) - } - } return lsp.ServerOptions{ - ConfigLoadOptions: loadOpts, - LogContext: logContext, - ConfigStore: nil, - Config: &cfg, - MaxTokens: cfg.MaxTokens, - ContextMode: cfg.ContextMode, - WindowLines: cfg.ContextWindowLines, - MaxContextTokens: cfg.MaxContextTokens, - CodingTemperature: cfg.CodingTemperature, - Client: client, - TriggerCharacters: cfg.TriggerCharacters, - ManualInvokeMinPrefix: cfg.ManualInvokeMinPrefix, - CompletionDebounceMs: cfg.CompletionDebounceMs, - CompletionThrottleMs: cfg.CompletionThrottleMs, - CompletionWaitAll: cfg.CompletionWaitAll, - InlineOpen: cfg.InlineOpen, - InlineClose: cfg.InlineClose, - ChatSuffix: cfg.ChatSuffix, - ChatPrefixes: cfg.ChatPrefixes, - - // Prompts - PromptCompSysGeneral: cfg.PromptCompletionSystemGeneral, - PromptCompSysParams: cfg.PromptCompletionSystemParams, - PromptCompSysInline: cfg.PromptCompletionSystemInline, - PromptCompUserGeneral: cfg.PromptCompletionUserGeneral, - PromptCompUserParams: cfg.PromptCompletionUserParams, - PromptCompExtraHeader: cfg.PromptCompletionExtraHeader, - PromptNativeCompletion: cfg.PromptNativeCompletion, - PromptChatSystem: cfg.PromptChatSystem, - PromptRewriteSystem: cfg.PromptCodeActionRewriteSystem, - PromptDiagnosticsSystem: cfg.PromptCodeActionDiagnosticsSystem, - PromptDocumentSystem: cfg.PromptCodeActionDocumentSystem, - PromptRewriteUser: cfg.PromptCodeActionRewriteUser, - PromptDiagnosticsUser: cfg.PromptCodeActionDiagnosticsUser, - PromptDocumentUser: cfg.PromptCodeActionDocumentUser, - PromptGoTestSystem: cfg.PromptCodeActionGoTestSystem, - PromptGoTestUser: cfg.PromptCodeActionGoTestUser, - PromptSimplifySystem: cfg.PromptCodeActionSimplifySystem, - PromptSimplifyUser: cfg.PromptCodeActionSimplifyUser, - CustomActions: customs, - IgnoreChecker: ignoreChecker, + ConfigLoadOptions: loadOpts, + LogContext: logContext, + ConfigStore: nil, + Config: &cfg, + Client: client, + IgnoreChecker: ignoreChecker, } } diff --git a/internal/hexailsp/run_more_test.go b/internal/hexailsp/run_more_test.go index 338dd48..7017811 100644 --- a/internal/hexailsp/run_more_test.go +++ b/internal/hexailsp/run_more_test.go @@ -47,10 +47,13 @@ func TestRunWithFactory_BuildsOptionsAndClient(t *testing.T) { if err := RunWithFactory("", "", &in, &out, logger, cfg, nil, factory); err != nil { t.Fatalf("RunWithFactory error: %v", err) } - if captured.MaxTokens != 123 { + if captured.Config == nil { + t.Fatalf("expected Config to be set in ServerOptions") + } + if captured.Config.MaxTokens != 123 { t.Fatalf("opts not applied: %+v", captured) } - if captured.PromptRewriteSystem != "RSYS" || captured.PromptRewriteUser != "RUSER" { + if captured.Config.PromptCodeActionRewriteSystem != "RSYS" || captured.Config.PromptCodeActionRewriteUser != "RUSER" { t.Fatalf("prompts not mapped: %+v", captured) } if captured.Client == nil { @@ -88,10 +91,13 @@ func TestRunWithFactory_SubscriptionAppliesUpdates(t *testing.T) { t.Fatalf("expected ApplyOptions to be invoked on config update, got %d calls", len(runner.opts)) } latest := runner.opts[len(runner.opts)-1] - if latest.MaxTokens != updated.MaxTokens { + if latest.Config == nil { + t.Fatalf("expected Config on latest options") + } + if latest.Config.MaxTokens != updated.MaxTokens { t.Fatalf("expected updated max tokens, got %+v", latest) } - if latest.ContextMode != "always-full" { + if latest.Config.ContextMode != "always-full" { t.Fatalf("expected normalized context mode, got %+v", latest) } } diff --git a/internal/hexailsp/run_test.go b/internal/hexailsp/run_test.go index 12b56c0..743f064 100644 --- a/internal/hexailsp/run_test.go +++ b/internal/hexailsp/run_test.go @@ -39,17 +39,20 @@ func TestRunWithFactory_UsesDefaultsAndCallsServer(t *testing.T) { if err := RunWithFactory("", "", bytes.NewBuffer(nil), bytes.NewBuffer(nil), logger, cfg, nil, factory); err != nil { t.Fatalf("RunWithFactory error: %v", err) } - if gotOpts.MaxTokens != cfg.MaxTokens { - t.Fatalf("MaxTokens want %d got %d", cfg.MaxTokens, gotOpts.MaxTokens) + if gotOpts.Config == nil { + t.Fatalf("expected Config to be set in ServerOptions") } - if gotOpts.ContextMode != cfg.ContextMode { - t.Fatalf("ContextMode want %q got %q", cfg.ContextMode, gotOpts.ContextMode) + if gotOpts.Config.MaxTokens != cfg.MaxTokens { + t.Fatalf("MaxTokens want %d got %d", cfg.MaxTokens, gotOpts.Config.MaxTokens) } - if gotOpts.WindowLines != cfg.ContextWindowLines { - t.Fatalf("WindowLines want %d got %d", cfg.ContextWindowLines, gotOpts.WindowLines) + if gotOpts.Config.ContextMode != cfg.ContextMode { + t.Fatalf("ContextMode want %q got %q", cfg.ContextMode, gotOpts.Config.ContextMode) } - if gotOpts.MaxContextTokens != cfg.MaxContextTokens { - t.Fatalf("MaxContextTokens want %d got %d", cfg.MaxContextTokens, gotOpts.MaxContextTokens) + if gotOpts.Config.ContextWindowLines != cfg.ContextWindowLines { + t.Fatalf("ContextWindowLines want %d got %d", cfg.ContextWindowLines, gotOpts.Config.ContextWindowLines) + } + if gotOpts.Config.MaxContextTokens != cfg.MaxContextTokens { + t.Fatalf("MaxContextTokens want %d got %d", cfg.MaxContextTokens, gotOpts.Config.MaxContextTokens) } if gotOpts.Client != nil { // with no env, openai client fails to build @@ -107,8 +110,11 @@ func TestRunWithFactory_NormalizesContextMode_AndSetsPreviewLimit(t *testing.T) if err := RunWithFactory("", "", bytes.NewBuffer(nil), bytes.NewBuffer(nil), logger, cfg, nil, factory); err != nil { t.Fatalf("RunWithFactory error: %v", err) } - if gotOpts.ContextMode != "file-on-new-func" { - t.Fatalf("ContextMode not normalized: %q", gotOpts.ContextMode) + if gotOpts.Config == nil { + t.Fatalf("expected Config to be set in ServerOptions") + } + if gotOpts.Config.ContextMode != "file-on-new-func" { + t.Fatalf("ContextMode not normalized: %q", gotOpts.Config.ContextMode) } if logging.PreviewForLog("abcdef") != "abc…" { t.Fatalf("PreviewForLog not respecting limit: %q", logging.PreviewForLog("abcdef")) -- cgit v1.2.3