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
 | 
						|
}
 |