diff --git a/internal/agent/tools/mcp/init.go b/internal/agent/tools/mcp/init.go index be27ce3f8ae5b9b7f425e496a1726bc23eaf3aae..c28da6c1722413d276bbb47b3dbf3e9f66826263 100644 --- a/internal/agent/tools/mcp/init.go +++ b/internal/agent/tools/mcp/init.go @@ -9,7 +9,6 @@ import ( "fmt" "io" "log/slog" - "maps" "net/http" "os" "os/exec" @@ -98,7 +97,7 @@ func SubscribeEvents(ctx context.Context) <-chan pubsub.Event[Event] { // GetStates returns the current state of all MCP clients func GetStates() map[string]ClientInfo { - return maps.Collect(states.Seq2()) + return states.Copy() } // GetState returns the state of a specific MCP client diff --git a/internal/app/lsp_events.go b/internal/app/lsp_events.go index 08e54582b95d8db725bffc7ff8bd43d4a37528b1..5292983d46cf867b9380ad45f7831007da54f0d7 100644 --- a/internal/app/lsp_events.go +++ b/internal/app/lsp_events.go @@ -2,7 +2,6 @@ package app import ( "context" - "maps" "time" "github.com/charmbracelet/crush/internal/csync" @@ -49,7 +48,7 @@ func SubscribeLSPEvents(ctx context.Context) <-chan pubsub.Event[LSPEvent] { // GetLSPStates returns the current state of all LSP clients func GetLSPStates() map[string]LSPClientInfo { - return maps.Collect(lspStates.Seq2()) + return lspStates.Copy() } // GetLSPState returns the state of a specific LSP client diff --git a/internal/csync/maps.go b/internal/csync/maps.go index 1fd2005790014b2ce4bd5a78dbb7931d54cbe66c..97cb580f7a012559aafbc7bbef8386211b72ee90 100644 --- a/internal/csync/maps.go +++ b/internal/csync/maps.go @@ -96,12 +96,16 @@ func (m *Map[K, V]) Take(key K) (V, bool) { return v, ok } +// Copy returns a copy of the inner map. +func (m *Map[K, V]) Copy() map[K]V { + m.mu.RLock() + defer m.mu.RUnlock() + return maps.Clone(m.inner) +} + // Seq2 returns an iter.Seq2 that yields key-value pairs from the map. func (m *Map[K, V]) Seq2() iter.Seq2[K, V] { - dst := make(map[K]V) - m.mu.RLock() - maps.Copy(dst, m.inner) - m.mu.RUnlock() + dst := m.Copy() return func(yield func(K, V) bool) { for k, v := range dst { if !yield(k, v) { diff --git a/internal/csync/versionedmap.go b/internal/csync/versionedmap.go index f0f4e0249c3b0102976840bd82400e18c1703c47..6ed996b2ff8d1380aa7fd22cab57342bf71e4a8f 100644 --- a/internal/csync/versionedmap.go +++ b/internal/csync/versionedmap.go @@ -40,6 +40,11 @@ func (m *VersionedMap[K, V]) Seq2() iter.Seq2[K, V] { return m.m.Seq2() } +// Copy returns a copy of the inner map. +func (m *VersionedMap[K, V]) Copy() map[K]V { + return m.m.Copy() +} + // Len returns the number of items in the map. func (m *VersionedMap[K, V]) Len() int { return m.m.Len() diff --git a/internal/lsp/client.go b/internal/lsp/client.go index 7d914d9a52ce75f621715273e8f6b9588aa912b7..7f88598eec6ca84697bdfc2e893c1b42c973e26c 100644 --- a/internal/lsp/client.go +++ b/internal/lsp/client.go @@ -350,7 +350,7 @@ func (c *Client) GetFileDiagnostics(uri protocol.DocumentURI) []protocol.Diagnos // GetDiagnostics returns all diagnostics for all files. func (c *Client) GetDiagnostics() map[protocol.DocumentURI][]protocol.Diagnostic { - return maps.Collect(c.diagnostics.Seq2()) + return c.diagnostics.Copy() } // OpenFileOnDemand opens a file only if it's not already open.