80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
package printers
|
|
|
|
import (
|
|
"context"
|
|
"encoding/xml"
|
|
"fmt"
|
|
|
|
"github.com/golangci/golangci-lint/pkg/logutils"
|
|
"github.com/golangci/golangci-lint/pkg/result"
|
|
)
|
|
|
|
type checkstyleOutput struct {
|
|
XMLName xml.Name `xml:"checkstyle"`
|
|
Version string `xml:"version,attr"`
|
|
Files []*checkstyleFile `xml:"file"`
|
|
}
|
|
|
|
type checkstyleFile struct {
|
|
Name string `xml:"name,attr"`
|
|
Errors []*checkstyleError `xml:"error"`
|
|
}
|
|
|
|
type checkstyleError struct {
|
|
Column int `xml:"column,attr"`
|
|
Line int `xml:"line,attr"`
|
|
Message string `xml:"message,attr"`
|
|
Severity string `xml:"severity,attr"`
|
|
Source string `xml:"source,attr"`
|
|
}
|
|
|
|
const defaultSeverity = "error"
|
|
|
|
type Checkstyle struct{}
|
|
|
|
func NewCheckstyle() *Checkstyle {
|
|
return &Checkstyle{}
|
|
}
|
|
|
|
func (Checkstyle) Print(ctx context.Context, issues <-chan result.Issue) (bool, error) {
|
|
out := checkstyleOutput{
|
|
Version: "5.0",
|
|
}
|
|
|
|
files := map[string]*checkstyleFile{}
|
|
|
|
for issue := range issues {
|
|
file, ok := files[issue.FilePath()]
|
|
if !ok {
|
|
file = &checkstyleFile{
|
|
Name: issue.FilePath(),
|
|
}
|
|
|
|
files[issue.FilePath()] = file
|
|
}
|
|
|
|
newError := &checkstyleError{
|
|
Column: issue.Column(),
|
|
Line: issue.Line(),
|
|
Message: issue.Text,
|
|
Source: issue.FromLinter,
|
|
Severity: defaultSeverity,
|
|
}
|
|
|
|
file.Errors = append(file.Errors, newError)
|
|
}
|
|
|
|
out.Files = make([]*checkstyleFile, 0, len(files))
|
|
for _, file := range files {
|
|
out.Files = append(out.Files, file)
|
|
}
|
|
|
|
data, err := xml.Marshal(&out)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
fmt.Fprintf(logutils.StdOut, "%s%s\n", xml.Header, data)
|
|
return len(files) > 0, nil
|
|
}
|