50fbc2eec2
* CI: use staticcheck for linting This commit switches the linter for Go code from golint to staticcheck. Golint has been deprecated since last year and staticcheck is a recommended replacement. Signed-off-by: Lucas Servén Marín <lserven@gmail.com> * revendor Signed-off-by: Lucas Servén Marín <lserven@gmail.com> * cmd,pkg: fix lint warnings Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
263 lines
9.1 KiB
Go
263 lines
9.1 KiB
Go
// Package stylecheck contains analyzes that enforce style rules.
|
||
// Most of the recommendations made are universally agreed upon by the wider Go community.
|
||
// Some analyzes, however, implement stricter rules that not everyone will agree with.
|
||
// In the context of Staticcheck, these analyzes are not enabled by default.
|
||
//
|
||
// For the most part it is recommended to follow the advice given by the analyzers that are enabled by default,
|
||
// but you may want to disable additional analyzes on a case by case basis.
|
||
package stylecheck
|
||
|
||
import "honnef.co/go/tools/analysis/lint"
|
||
|
||
var Docs = lint.Markdownify(map[string]*lint.RawDocumentation{
|
||
"ST1000": {
|
||
Title: `Incorrect or missing package comment`,
|
||
Text: `Packages must have a package comment that is formatted according to
|
||
the guidelines laid out in
|
||
https://github.com/golang/go/wiki/CodeReviewComments#package-comments.`,
|
||
Since: "2019.1",
|
||
NonDefault: true,
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1001": {
|
||
Title: `Dot imports are discouraged`,
|
||
Text: `Dot imports that aren't in external test packages are discouraged.
|
||
|
||
The \'dot_import_whitelist\' option can be used to whitelist certain
|
||
imports.
|
||
|
||
Quoting Go Code Review Comments:
|
||
|
||
> The \'import .\' form can be useful in tests that, due to circular
|
||
> dependencies, cannot be made part of the package being tested:
|
||
>
|
||
> package foo_test
|
||
>
|
||
> import (
|
||
> "bar/testutil" // also imports "foo"
|
||
> . "foo"
|
||
> )
|
||
>
|
||
> In this case, the test file cannot be in package foo because it
|
||
> uses \'bar/testutil\', which imports \'foo\'. So we use the \'import .\'
|
||
> form to let the file pretend to be part of package foo even though
|
||
> it is not. Except for this one case, do not use \'import .\' in your
|
||
> programs. It makes the programs much harder to read because it is
|
||
> unclear whether a name like \'Quux\' is a top-level identifier in the
|
||
> current package or in an imported package.`,
|
||
Since: "2019.1",
|
||
Options: []string{"dot_import_whitelist"},
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1003": {
|
||
Title: `Poorly chosen identifier`,
|
||
Text: `Identifiers, such as variable and package names, follow certain rules.
|
||
|
||
See the following links for details:
|
||
|
||
- https://golang.org/doc/effective_go.html#package-names
|
||
- https://golang.org/doc/effective_go.html#mixed-caps
|
||
- https://github.com/golang/go/wiki/CodeReviewComments#initialisms
|
||
- https://github.com/golang/go/wiki/CodeReviewComments#variable-names`,
|
||
Since: "2019.1",
|
||
NonDefault: true,
|
||
Options: []string{"initialisms"},
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1005": {
|
||
Title: `Incorrectly formatted error string`,
|
||
Text: `Error strings follow a set of guidelines to ensure uniformity and good
|
||
composability.
|
||
|
||
Quoting Go Code Review Comments:
|
||
|
||
> Error strings should not be capitalized (unless beginning with
|
||
> proper nouns or acronyms) or end with punctuation, since they are
|
||
> usually printed following other context. That is, use
|
||
> \'fmt.Errorf("something bad")\' not \'fmt.Errorf("Something bad")\', so
|
||
> that \'log.Printf("Reading %s: %v", filename, err)\' formats without a
|
||
> spurious capital letter mid-message.`,
|
||
Since: "2019.1",
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1006": {
|
||
Title: `Poorly chosen receiver name`,
|
||
Text: `Quoting Go Code Review Comments:
|
||
|
||
> The name of a method's receiver should be a reflection of its
|
||
> identity; often a one or two letter abbreviation of its type
|
||
> suffices (such as "c" or "cl" for "Client"). Don't use generic
|
||
> names such as "me", "this" or "self", identifiers typical of
|
||
> object-oriented languages that place more emphasis on methods as
|
||
> opposed to functions. The name need not be as descriptive as that
|
||
> of a method argument, as its role is obvious and serves no
|
||
> documentary purpose. It can be very short as it will appear on
|
||
> almost every line of every method of the type; familiarity admits
|
||
> brevity. Be consistent, too: if you call the receiver "c" in one
|
||
> method, don't call it "cl" in another.`,
|
||
Since: "2019.1",
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1008": {
|
||
Title: `A function's error value should be its last return value`,
|
||
Text: `A function's error value should be its last return value.`,
|
||
Since: `2019.1`,
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1011": {
|
||
Title: `Poorly chosen name for variable of type \'time.Duration\'`,
|
||
Text: `\'time.Duration\' values represent an amount of time, which is represented
|
||
as a count of nanoseconds. An expression like \'5 * time.Microsecond\'
|
||
yields the value \'5000\'. It is therefore not appropriate to suffix a
|
||
variable of type \'time.Duration\' with any time unit, such as \'Msec\' or
|
||
\'Milli\'.`,
|
||
Since: `2019.1`,
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1012": {
|
||
Title: `Poorly chosen name for error variable`,
|
||
Text: `Error variables that are part of an API should be called \'errFoo\' or
|
||
\'ErrFoo\'.`,
|
||
Since: "2019.1",
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1013": {
|
||
Title: `Should use constants for HTTP error codes, not magic numbers`,
|
||
Text: `HTTP has a tremendous number of status codes. While some of those are
|
||
well known (200, 400, 404, 500), most of them are not. The \'net/http\'
|
||
package provides constants for all status codes that are part of the
|
||
various specifications. It is recommended to use these constants
|
||
instead of hard-coding magic numbers, to vastly improve the
|
||
readability of your code.`,
|
||
Since: "2019.1",
|
||
Options: []string{"http_status_code_whitelist"},
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1015": {
|
||
Title: `A switch's default case should be the first or last case`,
|
||
Since: "2019.1",
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1016": {
|
||
Title: `Use consistent method receiver names`,
|
||
Since: "2019.1",
|
||
NonDefault: true,
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1017": {
|
||
Title: `Don't use Yoda conditions`,
|
||
Text: `Yoda conditions are conditions of the kind \"if 42 == x\", where the
|
||
literal is on the left side of the comparison. These are a common
|
||
idiom in languages in which assignment is an expression, to avoid bugs
|
||
of the kind \"if (x = 42)\". In Go, which doesn't allow for this kind of
|
||
bug, we prefer the more idiomatic \"if x == 42\".`,
|
||
Since: "2019.2",
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1018": {
|
||
Title: `Avoid zero-width and control characters in string literals`,
|
||
Since: "2019.2",
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1019": {
|
||
Title: `Importing the same package multiple times`,
|
||
Text: `Go allows importing the same package multiple times, as long as
|
||
different import aliases are being used. That is, the following
|
||
bit of code is valid:
|
||
|
||
import (
|
||
"fmt"
|
||
fumpt "fmt"
|
||
format "fmt"
|
||
_ "fmt"
|
||
)
|
||
|
||
However, this is very rarely done on purpose. Usually, it is a
|
||
sign of code that got refactored, accidentally adding duplicate
|
||
import statements. It is also a rarely known feature, which may
|
||
contribute to confusion.
|
||
|
||
Do note that sometimes, this feature may be used
|
||
intentionally (see for example
|
||
https://github.com/golang/go/commit/3409ce39bfd7584523b7a8c150a310cea92d879d)
|
||
– if you want to allow this pattern in your code base, you're
|
||
advised to disable this check.`,
|
||
Since: "2020.1",
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1020": {
|
||
Title: "The documentation of an exported function should start with the function's name",
|
||
Text: `Doc comments work best as complete sentences, which
|
||
allow a wide variety of automated presentations. The first sentence
|
||
should be a one-sentence summary that starts with the name being
|
||
declared.
|
||
|
||
If every doc comment begins with the name of the item it describes,
|
||
you can use the \'doc\' subcommand of the \'go\' tool and run the output
|
||
through grep.
|
||
|
||
See https://golang.org/doc/effective_go.html#commentary for more
|
||
information on how to write good documentation.`,
|
||
Since: "2020.1",
|
||
NonDefault: true,
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1021": {
|
||
Title: "The documentation of an exported type should start with type's name",
|
||
Text: `Doc comments work best as complete sentences, which
|
||
allow a wide variety of automated presentations. The first sentence
|
||
should be a one-sentence summary that starts with the name being
|
||
declared.
|
||
|
||
If every doc comment begins with the name of the item it describes,
|
||
you can use the \'doc\' subcommand of the \'go\' tool and run the output
|
||
through grep.
|
||
|
||
See https://golang.org/doc/effective_go.html#commentary for more
|
||
information on how to write good documentation.`,
|
||
Since: "2020.1",
|
||
NonDefault: true,
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1022": {
|
||
Title: "The documentation of an exported variable or constant should start with variable's name",
|
||
Text: `Doc comments work best as complete sentences, which
|
||
allow a wide variety of automated presentations. The first sentence
|
||
should be a one-sentence summary that starts with the name being
|
||
declared.
|
||
|
||
If every doc comment begins with the name of the item it describes,
|
||
you can use the \'doc\' subcommand of the \'go\' tool and run the output
|
||
through grep.
|
||
|
||
See https://golang.org/doc/effective_go.html#commentary for more
|
||
information on how to write good documentation.`,
|
||
Since: "2020.1",
|
||
NonDefault: true,
|
||
MergeIf: lint.MergeIfAny,
|
||
},
|
||
|
||
"ST1023": {
|
||
Title: "Redundant type in variable declaration",
|
||
Since: "2021.1",
|
||
NonDefault: true,
|
||
MergeIf: lint.MergeIfAll,
|
||
},
|
||
})
|