gopls/internal/lsp/source: enable new defers analyzer
This change enables the new defers analyzer in gopls.
It also adds it to the vet compatibility test.
A follow-up change will add it to vet itself.
Also, remove stray backquote in doc comment.
Updates golang/go#60048
Change-Id: I42f09bb79fcbe4e48593dd32fd066ddd39b9626f
Reviewed-on: https://go-review.googlesource.com/c/tools/+/502975
Run-TryBot: Alan Donovan <adonovan@google.com>
Auto-Submit: Alan Donovan <adonovan@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/go/analysis/passes/defers/doc.go b/go/analysis/passes/defers/doc.go
index ec9f766..60ad3c2 100644
--- a/go/analysis/passes/defers/doc.go
+++ b/go/analysis/passes/defers/doc.go
@@ -21,5 +21,5 @@
//
// The correct code is:
//
-// defer func() { recordLatency(time.Since(start)) }()`
+// defer func() { recordLatency(time.Since(start)) }()
package defers
diff --git a/go/analysis/unitchecker/vet_std_test.go b/go/analysis/unitchecker/vet_std_test.go
index feea1a2..e0fb41c 100644
--- a/go/analysis/unitchecker/vet_std_test.go
+++ b/go/analysis/unitchecker/vet_std_test.go
@@ -19,6 +19,7 @@
"golang.org/x/tools/go/analysis/passes/cgocall"
"golang.org/x/tools/go/analysis/passes/composite"
"golang.org/x/tools/go/analysis/passes/copylock"
+ "golang.org/x/tools/go/analysis/passes/defers"
"golang.org/x/tools/go/analysis/passes/directive"
"golang.org/x/tools/go/analysis/passes/errorsas"
"golang.org/x/tools/go/analysis/passes/framepointer"
@@ -54,6 +55,7 @@
cgocall.Analyzer,
composite.Analyzer,
copylock.Analyzer,
+ defers.Analyzer,
directive.Analyzer,
errorsas.Analyzer,
framepointer.Analyzer,
@@ -68,8 +70,8 @@
stdmethods.Analyzer,
stringintconv.Analyzer,
structtag.Analyzer,
- tests.Analyzer,
testinggoroutine.Analyzer,
+ tests.Analyzer,
timeformat.Analyzer,
unmarshal.Analyzer,
unreachable.Analyzer,
diff --git a/gopls/doc/analyzers.md b/gopls/doc/analyzers.md
index 8f470e2..48c98e0 100644
--- a/gopls/doc/analyzers.md
+++ b/gopls/doc/analyzers.md
@@ -108,6 +108,26 @@
**Enabled by default.**
+## **defer**
+
+report common mistakes in defer statements
+
+The defer analyzer reports a diagnostic when a defer statement would
+result in a non-deferred call to time.Since, as experience has shown
+that this is nearly always a mistake.
+
+For example:
+
+ start := time.Now()
+ ...
+ defer recordLatency(time.Since(start)) // error: call to time.Since is not deferred
+
+The correct code is:
+
+ defer func() { recordLatency(time.Since(start)) }()
+
+**Enabled by default.**
+
## **deprecated**
check for use of deprecated identifiers
diff --git a/gopls/doc/generate_test.go b/gopls/doc/generate_test.go
index 99f366c..44e6041 100644
--- a/gopls/doc/generate_test.go
+++ b/gopls/doc/generate_test.go
@@ -23,6 +23,6 @@
t.Fatal(err)
}
if !ok {
- t.Error("documentation needs updating. run: `go run doc/generate.go` from the gopls module.")
+ t.Error("documentation needs updating. Run: cd gopls && go generate ./doc")
}
}
diff --git a/gopls/internal/lsp/source/api_json.go b/gopls/internal/lsp/source/api_json.go
index 153cb7d..97f6384 100644
--- a/gopls/internal/lsp/source/api_json.go
+++ b/gopls/internal/lsp/source/api_json.go
@@ -269,6 +269,11 @@
Default: "true",
},
{
+ Name: "\"defer\"",
+ Doc: "report common mistakes in defer statements\n\nThe defer analyzer reports a diagnostic when a defer statement would\nresult in a non-deferred call to time.Since, as experience has shown\nthat this is nearly always a mistake.\n\nFor example:\n\n\tstart := time.Now()\n\t...\n\tdefer recordLatency(time.Since(start)) // error: call to time.Since is not deferred\n\nThe correct code is:\n\n\tdefer func() { recordLatency(time.Since(start)) }()",
+ Default: "true",
+ },
+ {
Name: "\"deprecated\"",
Doc: "check for use of deprecated identifiers\n\nThe deprecated analyzer looks for deprecated symbols and package imports.\n\nSee https://go.dev/wiki/Deprecated to learn about Go's convention\nfor documenting and signaling deprecated identifiers.",
Default: "true",
@@ -967,6 +972,11 @@
Default: true,
},
{
+ Name: "defer",
+ Doc: "report common mistakes in defer statements\n\nThe defer analyzer reports a diagnostic when a defer statement would\nresult in a non-deferred call to time.Since, as experience has shown\nthat this is nearly always a mistake.\n\nFor example:\n\n\tstart := time.Now()\n\t...\n\tdefer recordLatency(time.Since(start)) // error: call to time.Since is not deferred\n\nThe correct code is:\n\n\tdefer func() { recordLatency(time.Since(start)) }()",
+ Default: true,
+ },
+ {
Name: "deprecated",
Doc: "check for use of deprecated identifiers\n\nThe deprecated analyzer looks for deprecated symbols and package imports.\n\nSee https://go.dev/wiki/Deprecated to learn about Go's convention\nfor documenting and signaling deprecated identifiers.",
Default: true,
diff --git a/gopls/internal/lsp/source/options.go b/gopls/internal/lsp/source/options.go
index 4c33014..c2e3223 100644
--- a/gopls/internal/lsp/source/options.go
+++ b/gopls/internal/lsp/source/options.go
@@ -26,6 +26,7 @@
"golang.org/x/tools/go/analysis/passes/composite"
"golang.org/x/tools/go/analysis/passes/copylock"
"golang.org/x/tools/go/analysis/passes/deepequalerrors"
+ "golang.org/x/tools/go/analysis/passes/defers"
"golang.org/x/tools/go/analysis/passes/directive"
"golang.org/x/tools/go/analysis/passes/errorsas"
"golang.org/x/tools/go/analysis/passes/fieldalignment"
@@ -1544,6 +1545,7 @@
cgocall.Analyzer.Name: {Analyzer: cgocall.Analyzer, Enabled: true},
composite.Analyzer.Name: {Analyzer: composite.Analyzer, Enabled: true},
copylock.Analyzer.Name: {Analyzer: copylock.Analyzer, Enabled: true},
+ defers.Analyzer.Name: {Analyzer: defers.Analyzer, Enabled: true},
deprecated.Analyzer.Name: {Analyzer: deprecated.Analyzer, Enabled: true, Severity: protocol.SeverityHint, Tag: []protocol.DiagnosticTag{protocol.Deprecated}},
directive.Analyzer.Name: {Analyzer: directive.Analyzer, Enabled: true},
errorsas.Analyzer.Name: {Analyzer: errorsas.Analyzer, Enabled: true},