1
0
mirror of https://github.com/mgechev/revive.git synced 2025-03-17 20:57:58 +02:00

Comment spacing rule (#761)

* added comment-spacing rule for revive

* added test for comment-spacings rule

* adds comment-spacings rule to the configuration

* renames the source file to match rule name

* adds some tests

* refactor Comment-Spacings Rule to remove whiteList and avoid Panic at empty comment

* refactoring and adds rule configuration

* adds rule documentation

Co-authored-by: chavacava <salvadorcavadini+github@gmail.com>
This commit is contained in:
Shubh Karman Singh 2022-10-29 23:02:42 +05:30 committed by GitHub
parent 5fd3b2c046
commit 5f26378cc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 145 additions and 2 deletions

View File

@ -499,6 +499,8 @@ List of all available rules. The rules ported from `golint` are left unchanged a
| [`optimize-operands-order`](./RULES_DESCRIPTIONS.md#optimize-operands-order) | n/a | Checks inefficient conditional expressions | no | no |
| [`use-any`](./RULES_DESCRIPTIONS.md#use-any) | n/a | Proposes to replace `interface{}` with its alias `any` | no | no |
| [`datarace`](./RULES_DESCRIPTIONS.md#datarace) | n/a | Spots potential dataraces | no | no |
| [`comment-spacings`](./RULES_DESCRIPTIONS.md#comment-spacings) | []string | Warns on malformed comments | no | no |
## Configurable rules

View File

@ -13,6 +13,7 @@ List of all available rules.
- [bool-literal-in-expr](#bool-literal-in-expr)
- [call-to-gc](#call-to-gc)
- [confusing-naming](#confusing-naming)
- [comment-spacings](#comment-spacings)
- [confusing-results](#confusing-results)
- [cognitive-complexity](#cognitive-complexity)
- [constant-logical-expr](#constant-logical-expr)
@ -168,6 +169,24 @@ Example:
arguments =[7]
```
## comment-spacings
_Description_: Spots comments of the form:
```go
//This is a malformed comment: no space between // and the start of the sentence
```
_Configuration_: ([]string) list of exceptions. For example, to accept comments of the form
```go
//mypragma: activate something
```
You need to add `"mypragma"` in the configuration
Example:
```toml
[rule.comment-spacings]
arguments =["mypragma","otherpragma"]
```
## confusing-naming
_Description_: Methods or fields of `struct` that have names different only by capitalization could be confusing.

View File

@ -86,6 +86,7 @@ var allRules = append([]lint.Rule{
&rule.OptimizeOperandsOrderRule{},
&rule.UseAnyRule{},
&rule.DataRaceRule{},
&rule.CommentSpacingsRule{},
}, defaultRules...)
var allFormatters = []lint.Formatter{

82
rule/comment-spacings.go Normal file
View File

@ -0,0 +1,82 @@
package rule
import (
"fmt"
"strings"
"sync"
"github.com/mgechev/revive/lint"
)
// CommentSpacings Rule check the whether there is a space between
// the comment symbol( // ) and the start of the comment text
type CommentSpacingsRule struct {
allowList []string
sync.Mutex
}
func (r *CommentSpacingsRule) configure(arguments lint.Arguments) {
r.Lock()
defer r.Unlock()
if r.allowList == nil {
r.allowList = []string{
"//go:",
"//revive:",
}
for _, arg := range arguments {
allow, ok := arg.(string) // Alt. non panicking version
if !ok {
panic(fmt.Sprintf("invalid argument %v for %s; expected string but got %T", arg, r.Name(), arg))
}
r.allowList = append(r.allowList, `//`+allow+`:`)
}
}
}
func (r *CommentSpacingsRule) Apply(file *lint.File, args lint.Arguments) []lint.Failure {
r.configure(args)
var failures []lint.Failure
for _, cg := range file.AST.Comments {
for _, comment := range cg.List {
commentLine := comment.Text
if len(commentLine) < 3 {
continue // nothing to do
}
isOK := commentLine[2] == ' '
if isOK {
continue
}
if r.isAllowed(commentLine) {
continue
}
failures = append(failures, lint.Failure{
Node: comment,
Confidence: 1,
Category: "style",
Failure: "no space between comment delimiter and comment text",
})
}
}
return failures
}
func (*CommentSpacingsRule) Name() string {
return "comment-spacings"
}
func (r *CommentSpacingsRule) isAllowed(line string) bool {
for _, allow := range r.allowList {
if strings.HasPrefix(line, allow) {
return true
}
}
return false
}

View File

@ -0,0 +1,15 @@
package test
import (
"testing"
"github.com/mgechev/revive/lint"
"github.com/mgechev/revive/rule"
)
func TestCommentSpacings(t *testing.T) {
testRule(t, "comment-spacings", &rule.CommentSpacingsRule{}, &lint.RuleConfig{
Arguments: []interface{}{"myOwnDirective"}},
)
}

View File

@ -17,4 +17,4 @@ func TestModifiedAnnotations(t *testing.T) {
func TestDisableNextLineAnnotations(t *testing.T) {
testRule(t, "disable-annotations3", &rule.VarNamingRule{}, &lint.RuleConfig{})
}
}

View File

@ -107,7 +107,7 @@ func assertFailures(t *testing.T, baseDir string, fi os.FileInfo, src []byte, ru
copy(failures[i:], failures[i+1:])
failures = failures[:len(failures)-1]
// t.Logf("/%v/ matched at %s:%d", in.Match, fi.Name(), in.Line)
//t.Logf("/%v/ matched at %s:%d", in.Match, fi.Name(), in.Line)
ok = true
break
}

24
testdata/comment-spacings.go vendored Normal file
View File

@ -0,0 +1,24 @@
package commentspacings
//revive:disable:cyclomatic
type some struct{}
//revive:disable:cyclomatic High complexity score but easy to understand
type some1 struct{}
// Some nice comment
//
// With an empty line in the middle will make the rule panic!
func itsATrap() {}
// This is a well formed comment
type hello struct {
random `json:random`
}
// MATCH:21 /no space between comment delimiter and comment text/
//This comment does not respect the spacing rule!
var a string
//myOwnDirective: do something