From 58845813da34d57ac72711d627184abf018836c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Dzivjak?= Date: Wed, 11 Sep 2019 15:53:40 +0200 Subject: [PATCH] linters: add Godox linter support (#621) Godox is linter for TODOs and FIXMEs left in the code. Signed-off-by: Matous Dzivjak --- .golangci.example.yml | 7 + .golangci.yml | 1 + README.md | 11 ++ go.mod | 1 + go.sum | 2 + pkg/config/config.go | 8 ++ pkg/golinters/godox.go | 46 ++++++ pkg/lint/lintersdb/manager.go | 4 + test/testdata/godox.go | 13 ++ vendor/github.com/matoous/godox/.gitignore | 18 +++ vendor/github.com/matoous/godox/.golangci.yml | 68 +++++++++ vendor/github.com/matoous/godox/.revive.toml | 135 ++++++++++++++++++ vendor/github.com/matoous/godox/LICENSE | 21 +++ vendor/github.com/matoous/godox/README.md | 15 ++ vendor/github.com/matoous/godox/go.mod | 5 + vendor/github.com/matoous/godox/go.sum | 8 ++ vendor/github.com/matoous/godox/godox.go | 75 ++++++++++ vendor/modules.txt | 2 + 18 files changed, 440 insertions(+) create mode 100644 pkg/golinters/godox.go create mode 100644 test/testdata/godox.go create mode 100644 vendor/github.com/matoous/godox/.gitignore create mode 100644 vendor/github.com/matoous/godox/.golangci.yml create mode 100644 vendor/github.com/matoous/godox/.revive.toml create mode 100644 vendor/github.com/matoous/godox/LICENSE create mode 100644 vendor/github.com/matoous/godox/README.md create mode 100644 vendor/github.com/matoous/godox/go.mod create mode 100644 vendor/github.com/matoous/godox/go.sum create mode 100644 vendor/github.com/matoous/godox/godox.go diff --git a/.golangci.example.yml b/.golangci.example.yml index f1982fdb..d19b4dd6 100644 --- a/.golangci.example.yml +++ b/.golangci.example.yml @@ -186,6 +186,13 @@ linters-settings: paramsOnly: true rangeValCopy: sizeThreshold: 32 + godox: + # report any comments starting with keywords, this is useful for TODO or FIXME comments that + # might be left in the code accidentally and should be resolved before merging + keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting + - NOTE + - OPTIMIZE # marks code that should be optimized before merging + - HACK # marks hack-arounds that should be removed before merging linters: enable: diff --git a/.golangci.yml b/.golangci.yml index 9fe4e8a6..d207c2c3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -51,6 +51,7 @@ linters: - dupl - errcheck # - funlen - TODO: enable it when golangci.com will support it. + # - godox - TODO: enable it when golangci.com will support it. - gochecknoinits - goconst - gocritic diff --git a/README.md b/README.md index 7ab490b0..302d58f9 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ gochecknoinits: Checks that no init functions are present in Go code [fast: true goconst: Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false] gocritic: The most opinionated Go source code linter [fast: true, auto-fix: false] gocyclo: Computes and checks the cyclomatic complexity of functions [fast: true, auto-fix: false] +godox: Tool for detection of FIXME, TODO and other comment keywords [fast: true, auto-fix: false] gofmt: Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification [fast: true, auto-fix: true] goimports: Goimports does everything that gofmt does. Additionally it checks unused imports [fast: true, auto-fix: true] golint: Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes [fast: true, auto-fix: false] @@ -459,6 +460,7 @@ golangci-lint help linters - [gocritic](https://github.com/go-critic/go-critic) - The most opinionated Go source code linter - [gochecknoinits](https://github.com/leighmcculloch/gochecknoinits) - Checks that no init functions are present in Go code - [gochecknoglobals](https://github.com/leighmcculloch/gochecknoglobals) - Checks that no globals are present in Go code +- [godox](https://github.com/matoous/godox) - Tool for detection of FIXME, TODO and other comment keywords - [funlen](https://github.com/ultraware/funlen) - Tool for detection of long functions - [whitespace](https://github.com/ultraware/whitespace) - Tool for detection of leading and trailing whitespace @@ -766,6 +768,13 @@ linters-settings: paramsOnly: true rangeValCopy: sizeThreshold: 32 + godox: + # report any comments starting with keywords, this is useful for TODO or FIXME comments that + # might be left in the code accidentally and should be resolved before merging + keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting + - NOTE + - OPTIMIZE # marks code that should be optimized before merging + - HACK # marks hack-arounds that should be removed before merging linters: enable: @@ -901,6 +910,7 @@ linters: - dupl - errcheck # - funlen - TODO: enable it when golangci.com will support it. + # - godox - TODO: enable it when golangci.com will support it. - gochecknoinits - goconst - gocritic @@ -1082,6 +1092,7 @@ Thanks to developers and authors of used linters: - [kyoh86](https://github.com/kyoh86) - [go-critic](https://github.com/go-critic) - [leighmcculloch](https://github.com/leighmcculloch) +- [matoous](https://github.com/matoous) - [ultraware](https://github.com/ultraware) ## Changelog diff --git a/go.mod b/go.mod index 6c2805ea..014b387c 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,7 @@ require ( github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/magiconair/properties v1.7.6 // indirect + github.com/matoous/godox v0.0.0-20190910121045-032ad8106c86 github.com/mattn/go-colorable v0.0.9 github.com/mattn/go-isatty v0.0.3 // indirect github.com/mitchellh/go-homedir v1.0.0 diff --git a/go.sum b/go.sum index 2ec7532b..66c57d71 100644 --- a/go.sum +++ b/go.sum @@ -106,6 +106,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.7.6 h1:U+1DqNen04MdEPgFiIwdOUiqZ8qPa37xgogX/sd3+54= github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/matoous/godox v0.0.0-20190910121045-032ad8106c86 h1:q6SrfsK4FojRnJ1j8+8OJzyq3g9Y1oSVyL6nYGJXXBk= +github.com/matoous/godox v0.0.0-20190910121045-032ad8106c86/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= diff --git a/pkg/config/config.go b/pkg/config/config.go index 775e14b2..b92b2428 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -177,6 +177,7 @@ type LintersSettings struct { Prealloc PreallocSettings Errcheck ErrcheckSettings Gocritic GocriticSettings + Godox GodoxSettings } type GovetSettings struct { @@ -211,6 +212,10 @@ type PreallocSettings struct { ForLoops bool `mapstructure:"for-loops"` } +type GodoxSettings struct { + Keywords []string +} + var defaultLintersSettings = LintersSettings{ Lll: LllSettings{ LineLength: 120, @@ -230,6 +235,9 @@ var defaultLintersSettings = LintersSettings{ Gocritic: GocriticSettings{ SettingsPerCheck: map[string]GocriticCheckSettings{}, }, + Godox: GodoxSettings{ + Keywords: []string{}, + }, } type Linters struct { diff --git a/pkg/golinters/godox.go b/pkg/golinters/godox.go new file mode 100644 index 00000000..3a8e3518 --- /dev/null +++ b/pkg/golinters/godox.go @@ -0,0 +1,46 @@ +package golinters + +import ( + "context" + "go/token" + "strings" + + "github.com/golangci/golangci-lint/pkg/lint/linter" + "github.com/golangci/golangci-lint/pkg/result" + + "github.com/matoous/godox" +) + +type Godox struct{} + +func (Godox) Name() string { + return "godox" +} + +func (Godox) Desc() string { + return "Tool for detection of FIXME, TODO and other comment keywords" +} + +func (f Godox) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) { + var issues []godox.Message + for _, file := range lintCtx.ASTCache.GetAllValidFiles() { + issues = append(issues, godox.Run(file.F, file.Fset, lintCtx.Settings().Godox.Keywords...)...) + } + + if len(issues) == 0 { + return nil, nil + } + + res := make([]result.Issue, len(issues)) + for k, i := range issues { + res[k] = result.Issue{ + Pos: token.Position{ + Filename: i.Pos.Filename, + Line: i.Pos.Line, + }, + Text: strings.TrimRight(i.Message, "\n"), + FromLinter: f.Name(), + } + } + return res, nil +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 21bdb01c..c1d19bb3 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -238,6 +238,10 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithPresets(linter.PresetStyle). WithSpeed(10). WithURL("https://github.com/leighmcculloch/gochecknoglobals"), + linter.NewConfig(golinters.Godox{}). + WithPresets(linter.PresetStyle). + WithSpeed(10). + WithURL("https://github.com/matoous/godox"), linter.NewConfig(golinters.Funlen{}). WithPresets(linter.PresetStyle). WithSpeed(10). diff --git a/test/testdata/godox.go b/test/testdata/godox.go new file mode 100644 index 00000000..3ee7b98e --- /dev/null +++ b/test/testdata/godox.go @@ -0,0 +1,13 @@ +//args: -Egodox +//config: linters-settings.godox.keywords=FIXME,TODO +package testdata + +func todoLeftInCode() { + // TODO implement me // ERROR godox.go:6: Line contains FIXME/TODO: "TODO implement me" + //TODO no space // ERROR godox.go:7: Line contains FIXME/TODO: "TODO no space" + // TODO(author): 123 // ERROR godox.go:8: Line contains FIXME/TODO: "TODO\(author\): 123 // ERROR godox.go:8: L..." + //TODO(author): 123 // ERROR godox.go:9: Line contains FIXME/TODO: "TODO\(author\): 123 // ERROR godox.go:9: L..." + //TODO(author) 456 // ERROR godox.go:10: Line contains FIXME/TODO: "TODO\(author\) 456 // ERROR godox.go:10: L..." + // TODO: qwerty // ERROR godox.go:11: Line contains FIXME/TODO: "TODO: qwerty // ERROR godox.go:11: Line ..." + // todo 789 // ERROR godox.go:12: Line contains FIXME/TODO: "todo 789" +} diff --git a/vendor/github.com/matoous/godox/.gitignore b/vendor/github.com/matoous/godox/.gitignore new file mode 100644 index 00000000..c0525124 --- /dev/null +++ b/vendor/github.com/matoous/godox/.gitignore @@ -0,0 +1,18 @@ +# Binaries for programs and plugins +*.exe +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 +.glide/ + +.vscode/ +debug +debug.test diff --git a/vendor/github.com/matoous/godox/.golangci.yml b/vendor/github.com/matoous/godox/.golangci.yml new file mode 100644 index 00000000..c949963e --- /dev/null +++ b/vendor/github.com/matoous/godox/.golangci.yml @@ -0,0 +1,68 @@ +linters-settings: + depguard: + list-type: blacklist + include-go-root: true + packages: + # we are using "github.com/json-iterator/go" instead of json encoder from stdlib + - "encoding/json" + dupl: + threshold: 100 + gocritic: + # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint` run to see all tags and checks. + # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". + enabled-tags: + - performance + - diagnostic + - style + disabled-checks: + - emptyStringTest + - unnamedResult # it is experimental currently and doesn't handle typed channels correctly + gocyclo: + min-complexity: 14 # TODO go lower + golint: + min-confidence: 0 + govet: + check-shadowing: true + goconst: + min-len: 2 + min-occurrences: 3 + goimports: + local-prefixes: gitlab.skypicker.com/search-team/gonuts/conveyance-store + lll: + line-length: 140 + maligned: + suggest-new: true + misspell: + locale: US + +linters: + enable-all: true + disable: + # prealloc is not recommended by `golangci-lint` developers. + - prealloc + - gochecknoglobals + +issues: + exclude-rules: + - path: _test\.go + linters: + - goconst + - dupl + + - path: api/v1/ + linters: + - dupl + +run: + modules-download-mode: readonly + +# output configuration options +output: + # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" + format: tab + + # print lines of code with issue, default is true + print-issued-lines: true + + # print linter name in the end of issue text, default is true + print-linter-name: true diff --git a/vendor/github.com/matoous/godox/.revive.toml b/vendor/github.com/matoous/godox/.revive.toml new file mode 100644 index 00000000..db0e4edb --- /dev/null +++ b/vendor/github.com/matoous/godox/.revive.toml @@ -0,0 +1,135 @@ +ignoreGeneratedHeader = false +severity = "warning" + +# confidence <= 0.2 generate a lot of errors from package-comments rule. It marks files that do not contain +# package-level comments as a warning irrespective of existing package-level coment in one file. +confidence = 0.25 +errorCode = 1 +warningCode = 1 + +# Rules block. +# ⚠ Make sure to sort rules alpabetically for readability! ⚠ + +# argument-limit rule is setting up a maximum number of parameters that can be passed to the functions/methods. +[rule.argument-limit] + arguments = [5] + +# atomic rule checks for commonly mistaken usages of the sync/atomic package. +[rule.atomic] + +# blank-imports rule disallows blank imports. +[rule.blank-imports] + +# bool-literal-in-expr suggests removing boolean literals from logic expressions like `bar == true`, `arg == false`, +# `r != true`, `false && boolExpr` and `boolExpr || true`. +[rule.bool-literal-in-expr] + +# constant-logical-expr rule warns on constant logical expressions, like `name == name`. +[rule.constant-logical-expr] + +# context-as-argument rule makes sure that context.Context is the first argument of a function. +[rule.context-as-argument] + +# context-keys-type rule disallows the usage of basic types in context.WithValue +[rule.context-keys-type] + +# confusing-naming rule warns on methods with names that differ only by capitalization. +[rule.confusing-naming] + +# confusing-results rule suggests to name potentially confusing function results. +[rule.confusing-results] + +# cyclomatic rule sets restriction for maximum Cyclomatic complexity. +[rule.cyclomatic] + arguments = [15] + +# deep-exit rule looks for program exits in funcs other than `main()` or `init()`. +[rule.deep-exit] + +# dot-imports rule forbids `.` imports. +[rule.dot-imports] + +# empty-block warns on empty code blocks. +[rule.empty-block] + +# error-return rule ensure that the error return parameter is the last. +[rule.error-return] + +# error-strings rule ensure conventions around error strings. +[rule.error-strings] + +# error-naming rule ensure naming of error variables (has `Err` or `err` prefix). +[rule.error-naming] + +# errorf rule warns on usage errors.New(fmt.Sprintf()) instead of fmt.Errorf() +[rule.errorf] + +# exported rule ensure naming and commenting conventions on exported symbols. +[rule.exported] + +# flag-parameter rule warns on boolean parameters that create a control coupling. +[rule.flag-parameter] + +# get-return rule warns on getters that do not yield any result. +[rule.get-return] + +# if-return rule warns redundant if when returning an error. +[rule.if-return] + +# increment-decrement rule forces to use `i++` and `i--` instead of `i += 1` and `i -= 1`. +[rule.increment-decrement] + +# indent-error-flow rule prevents redundant else statements. +[rule.indent-error-flow] + +# modifies-value-receiver warns on assignments to value-passed method receivers. +[rule.modifies-value-receiver] + +# package-comments rule ensures package commenting conventions. +[rule.package-comments] + +# range rule prevents redundant variables when iterating over a collection. +[rule.range] + +# range-val-in-closure warns if range value is used in a closure dispatched as goroutine. +[rule.range-val-in-closure] + +# receiver-naming ensures conventions around the naming of receivers. +[rule.receiver-naming] + +# redefines-builtin-id warns on redefinitions of built-in (constants, variables, function and types) identifiers, +# like `true := "false"` etc. +[rule.redefines-builtin-id] + +# rule.superfluous-else prevents redundant else statements (extends indent-error-flow). Checks for `if-then-else`where +# the then block ends with branching statement like `continue`, `break`, or `goto`. +[rule.superfluous-else] + +# rule.struct-tag checks common struct tags like `json`, `xml`, `yaml`. +[rule.struct-tag] + +# time-naming rule conventions around the naming of time variables. Like not to use unit suffixes (sec, min etc.) in +# naming variables of type `time.Time` or `time.Duration`. +[rule.time-naming] + +# unexported-return rule warns when a public return is from unexported type. +[rule.unexported-return] + +# unnecessary-stmt suggests removing or simplifying unnecessary statements like breaks at the end of cases or return at +# the end of bodies of functions returning nothing. +[rule.unnecessary-stmt] + +# unreachable-code rule warns on the unreachable code. +[rule.unreachable-code] + +# unused-parameter rule suggests to rename or remove unused function parameters. +[rule.unused-parameter] + +# var-declaration rule reduces redundancies around variable declaration. +[rule.var-declaration] + +# var-naming checks naming rules. +[rule.var-naming] + +# waitgroup-by-value rule warns on functions taking `sync.WaitGroup` as a by-value parameter. +[rule.waitgroup-by-value] diff --git a/vendor/github.com/matoous/godox/LICENSE b/vendor/github.com/matoous/godox/LICENSE new file mode 100644 index 00000000..49e1b1e3 --- /dev/null +++ b/vendor/github.com/matoous/godox/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Matous Dzivjak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/matoous/godox/README.md b/vendor/github.com/matoous/godox/README.md new file mode 100644 index 00000000..c71e67fa --- /dev/null +++ b/vendor/github.com/matoous/godox/README.md @@ -0,0 +1,15 @@ +GoDoX +=== + +[![Build Status](https://travis-ci.org/matoous/godox.svg?branch=master)](https://travis-ci.org/matoous/godox) +[![GoDoc](https://godoc.org/github.com/matoous/godox?status.svg)](https://godoc.org/github.com/matoous/godox) +[![Go Report Card](https://goreportcard.com/badge/github.com/matoous/godox)](https://goreportcard.com/report/github.com/matoous/godox) +[![GitHub issues](https://img.shields.io/github/issues/matoous/godox.svg)](https://github.com/matoous/godox/issues) +[![License](https://img.shields.io/badge/license-MIT%20License-blue.svg)](https://github.com/matoous/godox/LICENSE) + +GoDoX extracts comments from Go code based on keywords. + +Installation +--- + + go get github.com/matoous/godox diff --git a/vendor/github.com/matoous/godox/go.mod b/vendor/github.com/matoous/godox/go.mod new file mode 100644 index 00000000..69b34f0e --- /dev/null +++ b/vendor/github.com/matoous/godox/go.mod @@ -0,0 +1,5 @@ +module github.com/matoous/godox + +go 1.13 + +require golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578 diff --git a/vendor/github.com/matoous/godox/go.sum b/vendor/github.com/matoous/godox/go.sum new file mode 100644 index 00000000..970cb25d --- /dev/null +++ b/vendor/github.com/matoous/godox/go.sum @@ -0,0 +1,8 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578 h1:f0Gfd654rnnfXT1+BK1YHPTS1qQdKrPIaGQwWxNE44k= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/github.com/matoous/godox/godox.go b/vendor/github.com/matoous/godox/godox.go new file mode 100644 index 00000000..c3a2d912 --- /dev/null +++ b/vendor/github.com/matoous/godox/godox.go @@ -0,0 +1,75 @@ +package godox + +import ( + "bufio" + "bytes" + "fmt" + "go/ast" + "go/token" + "path/filepath" + "strings" +) + +var ( + defaultKeywords = []string{"TODO", "BUG", "FIXME"} +) + +// Message contains a message and position +type Message struct { + Pos token.Position + Message string +} + +func getMessages(c *ast.Comment, fset *token.FileSet, keywords []string) []Message { + commentText := c.Text + switch commentText[1] { + case '/': + commentText = commentText[2:] + if len(commentText) > 0 && commentText[0] == ' ' { + commentText = commentText[1:] + } + case '*': + commentText = commentText[2 : len(commentText)-2] + } + + b := bufio.NewReader(bytes.NewBufferString(commentText)) + var comments []Message + + for lineNum := 0; ; lineNum++ { + line, _, err := b.ReadLine() + if err != nil { + break + } + sComment := bytes.TrimSpace(line) + if len(sComment) < 4 { + continue + } + for _, kw := range keywords { + if bytes.EqualFold([]byte(kw), sComment[0:len(kw)]) { + pos := fset.Position(c.Pos()) + if len(sComment) > 40 { + sComment = []byte(fmt.Sprintf("%s...", sComment[:40])) + } + comments = append(comments, Message{ + Pos: pos, + Message: fmt.Sprintf("%s:%d: Line contains %s: \"%s\"", filepath.Join(pos.Filename), pos.Line+lineNum, strings.Join(keywords, "/"), sComment), + }) + break + } + } + } + return comments +} + +func Run(file *ast.File, fset *token.FileSet, keywords ...string) []Message { + if keywords == nil || len(keywords) == 0 { + keywords = defaultKeywords + } + var messages []Message + for _, c := range file.Comments { + for _, ci := range c.List { + messages = append(messages, getMessages(ci, fset, keywords)...) + } + } + return messages +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 97ffdd8e..bb99fd3c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -126,6 +126,8 @@ github.com/kisielk/gotool github.com/kisielk/gotool/internal/load # github.com/magiconair/properties v1.7.6 github.com/magiconair/properties +# github.com/matoous/godox v0.0.0-20190910121045-032ad8106c86 +github.com/matoous/godox # github.com/mattn/go-colorable v0.0.9 github.com/mattn/go-colorable # github.com/mattn/go-isatty v0.0.3