www.github.com/golangci/golangci-lint.git@v1.10.1/pkg/golinters/golint.go (about)

     1  package golinters
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"go/ast"
     7  	"go/token"
     8  
     9  	"github.com/golangci/golangci-lint/pkg/lint/linter"
    10  	"github.com/golangci/golangci-lint/pkg/result"
    11  	lintAPI "github.com/golangci/lint-1"
    12  )
    13  
    14  type Golint struct{}
    15  
    16  func (Golint) Name() string {
    17  	return "golint"
    18  }
    19  
    20  func (Golint) Desc() string {
    21  	return "Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes"
    22  }
    23  
    24  func (g Golint) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
    25  	var issues []result.Issue
    26  	var lintErr error
    27  	for _, pkg := range lintCtx.PkgProgram.Packages() {
    28  		files, fset, err := getASTFilesForPkg(lintCtx, &pkg)
    29  		if err != nil {
    30  			return nil, err
    31  		}
    32  
    33  		i, err := g.lintPkg(lintCtx.Settings().Golint.MinConfidence, files, fset)
    34  		if err != nil {
    35  			lintErr = err
    36  			continue
    37  		}
    38  		issues = append(issues, i...)
    39  	}
    40  	if lintErr != nil {
    41  		lintCtx.Log.Warnf("Golint: %s", lintErr)
    42  	}
    43  
    44  	return issues, nil
    45  }
    46  
    47  func (g Golint) lintPkg(minConfidence float64, files []*ast.File, fset *token.FileSet) ([]result.Issue, error) {
    48  	l := new(lintAPI.Linter)
    49  	ps, err := l.LintASTFiles(files, fset)
    50  	if err != nil {
    51  		return nil, fmt.Errorf("can't lint %d files: %s", len(files), err)
    52  	}
    53  
    54  	if len(ps) == 0 {
    55  		return nil, nil
    56  	}
    57  
    58  	issues := make([]result.Issue, 0, len(ps)) // This is worst case
    59  	for _, p := range ps {
    60  		if p.Confidence >= minConfidence {
    61  			issues = append(issues, result.Issue{
    62  				Pos:        p.Position,
    63  				Text:       markIdentifiers(p.Text),
    64  				FromLinter: g.Name(),
    65  			})
    66  			// TODO: use p.Link and p.Category
    67  		}
    68  	}
    69  
    70  	return issues, nil
    71  }