internal/lsp: fix analysis in all experiments, disable unusedparams

The reason unusedparams wasn't showing up was because we didn't handle
the analyses settings correctly. Fix it and remove unusedparams.

Change-Id: Ia8636c306d136a718d1d12a80326117b34f5da28
Reviewed-on: https://go-review.googlesource.com/c/tools/+/263201
Trust: Rebecca Stambler <rstambler@golang.org>
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
diff --git a/internal/lsp/source/options.go b/internal/lsp/source/options.go
index bc60888..9734875 100644
--- a/internal/lsp/source/options.go
+++ b/internal/lsp/source/options.go
@@ -492,14 +492,21 @@
 	case map[string]interface{}:
 		// If the user's settings contains "allExperiments", set that first,
 		// and then let them override individual settings independently.
+		var enableExperiments bool
 		for name, value := range opts {
 			if b, ok := value.(bool); name == "allExperiments" && ok && b {
+				enableExperiments = true
 				options.enableAllExperiments()
 			}
 		}
 		for name, value := range opts {
 			results = append(results, options.set(name, value))
 		}
+		// Finally, enable any experimental features that are specified in
+		// maps, which allows users to individually toggle them on or off.
+		if enableExperiments {
+			options.enableAllExperimentMaps()
+		}
 	default:
 		results = append(results, OptionResult{
 			Value: opts,
@@ -586,13 +593,22 @@
 
 // enableAllExperiments turns on all of the experimental "off-by-default"
 // features offered by gopls.
+// Any experimental features specified in maps should be enabled in
+// enableAllExperimentMaps.
 func (o *Options) enableAllExperiments() {
 	o.ExperimentalDiagnosticsDelay = 200 * time.Millisecond
 	o.ExperimentalWorkspaceModule = true
 	o.ExperimentalPackageCacheKey = true
 	o.SymbolStyle = DynamicSymbols
-	o.Codelens[CommandToggleDetails.Name] = true
-	o.Analyses[unusedparams.Analyzer.Name] = true
+}
+
+func (o *Options) enableAllExperimentMaps() {
+	if _, ok := o.Codelens[CommandToggleDetails.Name]; !ok {
+		o.Codelens[CommandToggleDetails.Name] = true
+	}
+	if _, ok := o.Analyses[unusedparams.Analyzer.Name]; !ok {
+		o.Analyses[unusedparams.Analyzer.Name] = true
+	}
 }
 
 func (o *Options) set(name string, value interface{}) OptionResult {