blob: 23cc764b76b6cf22a89adbe35c549f8c5b38045b [file]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package golang
import (
"context"
"fmt"
"slices"
"golang.org/x/tools/gopls/internal/cache"
"golang.org/x/tools/gopls/internal/cache/symbols"
"golang.org/x/tools/gopls/internal/protocol"
"golang.org/x/tools/gopls/internal/settings"
)
// InteractiveWorkspaceSymbolEnumConfig defines the JSON configuration payload
// for an InteractiveListEnum request when the source is "workspaceSymbol".
// It is used to filter the search results to specific symbol types (e.g.,
// only Interfaces).
type InteractiveWorkspaceSymbolEnumConfig struct {
Kinds []protocol.SymbolKind
}
func ListWorkspaceSymbol(ctx context.Context, snapshots []*cache.Snapshot, param *protocol.InteractiveListEnumParams) ([]protocol.FormEnumEntry, error) {
var config InteractiveWorkspaceSymbolEnumConfig
if err := protocol.UnmarshalJSON(param.Config, &config); err != nil {
return nil, fmt.Errorf("unmarshalling InteractiveListEnumParams.Config: %v", err)
}
symbols, err := WorkspaceSymbols(ctx, snapshots, param.Query,
WorkspaceSymbolsOptions{
// Use FastFuzzy for low-latency interactive matching.
Matcher: settings.SymbolFastFuzzy,
// Use fully qualified names to ensure unique identification of
// the symbol. (i.e. "path/to/pkg.Iface")
Style: settings.FullyQualifiedSymbols,
Filter: SymbolFilter(func(sym symbols.Symbol) bool {
return slices.Contains(config.Kinds, sym.Kind)
}),
},
)
if err != nil {
return nil, err
}
entries := make([]protocol.FormEnumEntry, 0, len(symbols))
for _, s := range symbols {
entries = append(entries, protocol.FormEnumEntry{
Value: s.Name,
Description: fmt.Sprintf("[%s] %s", s.Kind, s.Name),
})
}
return entries, nil
}