diff --git a/pkg/golinters/goanalysis/issue.go b/pkg/golinters/goanalysis/issue.go index f331a3ab9f1a..34adc7bac4fa 100644 --- a/pkg/golinters/goanalysis/issue.go +++ b/pkg/golinters/goanalysis/issue.go @@ -23,6 +23,7 @@ func NewIssue(i *result.Issue, pass *analysis.Pass) Issue { type EncodingIssue struct { FromLinter string Text string + SuggestedFixes []result.SuggestedFix Pos token.Position LineRange *result.Range Replacement *result.Replacement diff --git a/pkg/golinters/goanalysis/runners.go b/pkg/golinters/goanalysis/runners.go index 7e4cf902e79c..bbb1410d16a9 100644 --- a/pkg/golinters/goanalysis/runners.go +++ b/pkg/golinters/goanalysis/runners.go @@ -98,10 +98,11 @@ func buildIssues(diags []Diagnostic, linterNameBuilder func(diag *Diagnostic) st } issues = append(issues, result.Issue{ - FromLinter: linterName, - Text: text, - Pos: diag.Position, - Pkg: diag.Pkg, + FromLinter: linterName, + Text: text, + SuggestedFixes: result.BuildSuggestedFixes(diag.SuggestedFixes), + Pos: diag.Position, + Pkg: diag.Pkg, }) if len(diag.Related) > 0 { @@ -150,6 +151,7 @@ func saveIssuesToCache(allPkgs []*packages.Package, pkgsFromCache map[*packages. encodedIssues = append(encodedIssues, EncodingIssue{ FromLinter: i.FromLinter, Text: i.Text, + SuggestedFixes: i.SuggestedFixes, Pos: i.Pos, LineRange: i.LineRange, Replacement: i.Replacement, @@ -221,6 +223,7 @@ func loadIssuesFromCache(pkgs []*packages.Package, lintCtx *linter.Context, issues = append(issues, result.Issue{ FromLinter: i.FromLinter, Text: i.Text, + SuggestedFixes: i.SuggestedFixes, Pos: i.Pos, LineRange: i.LineRange, Replacement: i.Replacement, diff --git a/pkg/printers/codeclimate.go b/pkg/printers/codeclimate.go index 35a22ce99a72..afeca12334a2 100644 --- a/pkg/printers/codeclimate.go +++ b/pkg/printers/codeclimate.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "github.com/golangci/golangci-lint/pkg/logutils" "github.com/golangci/golangci-lint/pkg/result" @@ -13,6 +14,7 @@ import ( // It is just enough to support GitLab CI Code Quality - https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html type CodeClimateIssue struct { Description string `json:"description"` + Content string `json:"content,omitempty"` Severity string `json:"severity,omitempty"` Fingerprint string `json:"fingerprint"` Location struct { @@ -40,6 +42,11 @@ func (p CodeClimate) Print(ctx context.Context, issues []result.Issue) error { codeClimateIssue.Location.Lines.Begin = issue.Pos.Line codeClimateIssue.Fingerprint = issue.Fingerprint() + content := p.buildContentString(&issues[i]) + if content != "" { + codeClimateIssue.Content = content + } + if issue.Severity != "" { codeClimateIssue.Severity = issue.Severity } @@ -55,3 +62,23 @@ func (p CodeClimate) Print(ctx context.Context, issues []result.Issue) error { fmt.Fprint(logutils.StdOut, string(outputJSON)) return nil } + +func (p CodeClimate) buildContentString(issue *result.Issue) string { + if len(issue.SuggestedFixes) == 0 { + return "" + } + + var text string + for _, fix := range issue.SuggestedFixes { + text += fmt.Sprintf("%s\n", strings.TrimSpace(fix.Message)) + var suggestedEdits []string + for _, textEdit := range fix.TextEdits { + suggestedEdits = append(suggestedEdits, strings.TrimSpace(textEdit.NewText)) + } + if len(suggestedEdits) > 0 { + text += "```\n" + strings.Join(suggestedEdits, "\n") + "\n" + "```\n" + } + } + + return text +} diff --git a/pkg/printers/html.go b/pkg/printers/html.go index 65ab753bd512..e4f18eee2c59 100644 --- a/pkg/printers/html.go +++ b/pkg/printers/html.go @@ -59,6 +59,25 @@ const templateContent = ` } } + class SuggestedEdit extends React.Component { + render() { + if (this.props.data.SuggestedFix && this.props.data.SuggestedFix.length) { + return ( +