blob: 2f637f3d16d322170be574cbe700feee6b0b2365 [file] [log] [blame]
// Copyright 2023 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 settings
import (
"sync"
"time"
"golang.org/x/tools/gopls/internal/file"
"golang.org/x/tools/gopls/internal/protocol"
"golang.org/x/tools/gopls/internal/protocol/command"
)
var (
optionsOnce sync.Once
defaultOptions *Options
)
// DefaultOptions is the options that are used for Gopls execution independent
// of any externally provided configuration (LSP initialization, command
// invocation, etc.).
//
// It is the source from which gopls/doc/settings.md is generated.
func DefaultOptions(overrides ...func(*Options)) *Options {
optionsOnce.Do(func() {
var commands []string
for _, c := range command.Commands {
commands = append(commands, c.String())
}
defaultOptions = &Options{
ClientOptions: ClientOptions{
InsertTextFormat: protocol.PlainTextTextFormat,
PreferredContentFormat: protocol.Markdown,
ConfigurationSupported: true,
DynamicConfigurationSupported: true,
DynamicRegistrationSemanticTokensSupported: true,
DynamicWatchedFilesSupported: true,
LineFoldingOnly: false,
HierarchicalDocumentSymbolSupport: true,
},
ServerOptions: ServerOptions{
SupportedCodeActions: map[file.Kind]map[protocol.CodeActionKind]bool{
file.Go: {
// This should include specific leaves in the tree,
// (e.g. refactor.inline.call) not generic branches
// (e.g. refactor.inline or refactor).
protocol.SourceFixAll: true,
protocol.SourceOrganizeImports: true,
protocol.QuickFix: true,
GoAssembly: true,
GoDoc: true,
GoFreeSymbols: true,
GoplsDocFeatures: true,
RefactorRewriteChangeQuote: true,
RefactorRewriteFillStruct: true,
RefactorRewriteFillSwitch: true,
RefactorRewriteInvertIf: true,
RefactorRewriteJoinLines: true,
RefactorRewriteRemoveUnusedParam: true,
RefactorRewriteSplitLines: true,
RefactorInlineCall: true,
RefactorExtractFunction: true,
RefactorExtractMethod: true,
RefactorExtractVariable: true,
RefactorExtractToNewFile: true,
// Not GoTest: it must be explicit in CodeActionParams.Context.Only
},
file.Mod: {
protocol.SourceOrganizeImports: true,
protocol.QuickFix: true,
},
file.Work: {},
file.Sum: {},
file.Tmpl: {},
},
SupportedCommands: commands,
},
UserOptions: UserOptions{
BuildOptions: BuildOptions{
ExpandWorkspaceToModule: true,
DirectoryFilters: []string{"-**/node_modules"},
TemplateExtensions: []string{},
StandaloneTags: []string{"ignore"},
},
UIOptions: UIOptions{
DiagnosticOptions: DiagnosticOptions{
Annotations: map[Annotation]bool{
Bounds: true,
Escape: true,
Inline: true,
Nil: true,
},
Vulncheck: ModeVulncheckOff,
DiagnosticsDelay: 1 * time.Second,
DiagnosticsTrigger: DiagnosticsOnEdit,
AnalysisProgressReporting: true,
},
InlayHintOptions: InlayHintOptions{},
DocumentationOptions: DocumentationOptions{
HoverKind: FullDocumentation,
LinkTarget: "pkg.go.dev",
LinksInHover: LinksInHover_LinkTarget,
},
NavigationOptions: NavigationOptions{
ImportShortcut: BothShortcuts,
SymbolMatcher: SymbolFastFuzzy,
SymbolStyle: DynamicSymbols,
SymbolScope: AllSymbolScope,
},
CompletionOptions: CompletionOptions{
Matcher: Fuzzy,
CompletionBudget: 100 * time.Millisecond,
ExperimentalPostfixCompletions: true,
CompleteFunctionCalls: true,
},
Codelenses: map[CodeLensSource]bool{
CodeLensGenerate: true,
CodeLensRegenerateCgo: true,
CodeLensTidy: true,
CodeLensGCDetails: false,
CodeLensUpgradeDependency: true,
CodeLensVendor: true,
CodeLensRunGovulncheck: false, // TODO(hyangah): enable
},
},
},
InternalOptions: InternalOptions{
CompleteUnimported: true,
CompletionDocumentation: true,
DeepCompletion: true,
SubdirWatchPatterns: SubdirWatchPatternsAuto,
ReportAnalysisProgressAfter: 5 * time.Second,
TelemetryPrompt: false,
LinkifyShowMessage: false,
IncludeReplaceInWorkspace: false,
ZeroConfig: true,
AddTestSourceCodeAction: false,
},
}
})
options := defaultOptions.Clone()
for _, override := range overrides {
if override != nil {
override(options)
}
}
return options
}