summaryrefslogtreecommitdiff
path: root/internal/lsp/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp/server.go')
-rw-r--r--internal/lsp/server.go36
1 files changed, 34 insertions, 2 deletions
diff --git a/internal/lsp/server.go b/internal/lsp/server.go
index 1fbb0cc..f8b328b 100644
--- a/internal/lsp/server.go
+++ b/internal/lsp/server.go
@@ -40,8 +40,9 @@ type Server struct {
llmRespBytesTotal int64
startTime time.Time
// Small LRU cache for recent code completion outputs (keyed by context)
- compCache map[string]string
- compCacheOrder []string // most-recent at end; cap ~10
+ compCache map[string]string
+ compCacheOrder []string // most-recent at end; cap ~10
+ pendingCompletions map[string][]CompletionItem
// Outgoing JSON-RPC id counter for server-initiated requests
nextID int64
lastLLMCall time.Time
@@ -112,6 +113,7 @@ func NewServer(r io.Reader, w io.Writer, logger *log.Logger, opts ServerOptions)
s := &Server{in: bufio.NewReader(r), out: w, logger: logger, docs: make(map[string]*document), logContext: opts.LogContext, configStore: opts.ConfigStore}
s.startTime = time.Now()
s.compCache = make(map[string]string)
+ s.pendingCompletions = make(map[string][]CompletionItem)
s.applyOptions(opts)
// Initialize dispatch table
s.handlers = map[string]func(Request){
@@ -315,6 +317,36 @@ func (s *Server) currentConfig() appconfig.App {
return s.cfg
}
+func (s *Server) storePendingCompletion(key string, items []CompletionItem) {
+ if len(items) == 0 {
+ return
+ }
+ cpy := make([]CompletionItem, len(items))
+ copy(cpy, items)
+ s.mu.Lock()
+ if s.pendingCompletions == nil {
+ s.pendingCompletions = make(map[string][]CompletionItem)
+ }
+ s.pendingCompletions[key] = cpy
+ s.mu.Unlock()
+}
+
+func (s *Server) takePendingCompletion(key string) []CompletionItem {
+ s.mu.Lock()
+ defer s.mu.Unlock()
+ if len(s.pendingCompletions) == 0 {
+ return nil
+ }
+ items, ok := s.pendingCompletions[key]
+ if !ok {
+ return nil
+ }
+ delete(s.pendingCompletions, key)
+ cpy := make([]CompletionItem, len(items))
+ copy(cpy, items)
+ return cpy
+}
+
func (s *Server) maxTokens() int {
cfg := s.currentConfig()
if cfg.MaxTokens <= 0 {