errorformat is Vim's quickfix errorformat implementation in golang.
errorformat provides default errorformats for major tools.
You can see defined errorformats here.
Also, it's easy to add new errorformat in a similar way to Vim's errorformat.
Note that it's highly compatible with Vim implementation, but it doesn't support Vim regex.
▶ Playground ▶
Try errorformat on the Playground!
The playground uses gopherjs to try
errorformat implementation in Go with JavaScript ✨
Usage
import "github.com/reviewdog/errorformat"
Example
Code:
in := `
golint.new.go:3:5: exported var V should have comment or be unexported
golint.new.go:5:5: exported var NewError1 should have comment or be unexported
golint.new.go:7:1: comment on exported function F should be of the form "F ..."
golint.new.go:11:1: comment on exported function F2 should be of the form "F2 ..."
`
efm, _ := errorformat.NewErrorformat([]string{`%f:%l:%c: %m`, `%-G%.%#`})
s := efm.NewScanner(strings.NewReader(in))
for s.Scan() {
fmt.Println(s.Entry())
}
Output:
golint.new.go|3 col 5| exported var V should have comment or be unexported
golint.new.go|5 col 5| exported var NewError1 should have comment or be unexported
golint.new.go|7 col 1| comment on exported function F should be of the form "F ..."
golint.new.go|11 col 1| comment on exported function F2 should be of the form "F2 ..."
Installation
go get -u github.com/reviewdog/errorformat/cmd/errorformat
Usage
Usage: errorformat [flags] [errorformat ...]
errorformat reads compiler/linter/static analyzer result from STDIN, formats
them by given 'errorformat' (90% compatible with Vim's errorformat. :h
errorformat), and outputs formated result to STDOUT.
Example:
$ echo '/path/to/file:14:28: error message\nfile2:3:4: msg' | errorformat "%f:%l:%c: %m"
/path/to/file|14 col 28| error message
file2|3 col 4| msg
$ golint ./... | errorformat -name=golint
The -f flag specifies an alternate format for the entry, using the
syntax of package template. The default output is equivalent to -f
'{{.String}}'. The struct being passed to the template is:
type Entry struct {
// name of a file
Filename string
// line number
Lnum int
// column number (first column is 1)
Col int
// true: "col" is visual column
// false: "col" is byte index
Vcol bool
// error number
Nr int
// search pattern used to locate the error
Pattern string
// description of the error
Text string
// type of the error, 'E', '1', etc.
Type rune
// true: recognized error message
Valid bool
// Original error lines (often one line. more than one line for multi-line
// errorformat. :h errorformat-multi-line)
Lines []string
}
Flags:
-f string
format template for -w=template (default "{{.String}}")
-list
list defined errorformats
-name string
defined errorformat name
-sarif.tool-name string
Tool name for Sarif writer format. Use -name flag if available.
-w string
writer format (template|checkstyle|jsonl|sarif) (default "template")
$ cat testdata/sbt.in
[warn] /path/to/F1.scala:203: local val in method f is never used: (warning smaple 3)
[warn] val x = 1
[warn] ^
[warn] /path/to/F1.scala:204: local val in method f is never used: (warning smaple 2)
[warn] val x = 2
[warn] ^
[error] /path/to/F2.scala:1093: error: value ++ is not a member of Int
[error] val x = 1 ++ 2
[error] ^
[warn] /path/to/dir/F3.scala:83: local val in method f is never used
[warn] val x = 4
[warn] ^
[error] /path/to/dir/F3.scala:84: error: value ++ is not a member of Int
[error] val x = 5 ++ 2
[error] ^
[warn] /path/to/dir/F3.scala:86: local val in method f is never used
[warn] val x = 6
[warn] ^
$ errorformat "%E[%t%.%+] %f:%l: error: %m" "%A[%t%.%+] %f:%l: %m" "%Z[%.%+] %p^" "%C[%.%+] %.%#" "%-G%.%#" < testdata/sbt.in
/path/to/F1.scala|203 col 13 warning| local val in method f is never used: (warning smaple 3)
/path/to/F1.scala|204 col 7 warning| local val in method f is never used: (warning smaple 2)
/path/to/F2.scala|1093 col 15 error| value ++ is not a member of Int
/path/to/dir/F3.scala|83 col 13 warning| local val in method f is never used
/path/to/dir/F3.scala|84 col 19 error| value ++ is not a member of Int
/path/to/dir/F3.scala|86 col 13 warning| local val in method f is never used
$ cat fmts/testdata/sbt.in | errorformat -name=sbt -w=checkstyle
<?xml version="1.0" encoding="UTF-8"?>
<checkstyle version="1.0">
<file name="/home/haya14busa/src/github.com/reviewdog/errorformat/fmts/testdata/resources/scala/scalac.scala">
<error column="3" line="6" message="missing argument list for method error in object Predef" severity="error"></error>
<error column="15" line="4" message="private val in object F is never used" severity="warning"></error>
<error column="15" line="5" message="private method in object F is never used" severity="warning"></error>
</file>
</checkstyle>
$ cat fmts/testdata/sbt.in | errorformat -name=sbt -w=jsonl
{"filename":"/home/haya14busa/src/github.com/reviewdog/errorformat/fmts/testdata/resources/scala/scalac.scala","lnum":6,"col":3,"vcol":true,"nr":0,"pattern":"","text":"missing argument list for method error in object Predef","type":101,"valid":true,"lines":["[error] /home/haya14busa/src/github.com/reviewdog/errorformat/fmts/testdata/resources/scala/scalac.scala:6: missing argument list for method error in object Predef","[error] Unapplied methods are only converted to functions when a function type is expected.","[error] You can make this conversion explicit by writing `error _` or `error(_)` instead of `error`.","[error] error","[error] ^"]}
{"filename":"/home/haya14busa/src/github.com/reviewdog/errorformat/fmts/testdata/resources/scala/scalac.scala","lnum":4,"col":15,"vcol":true,"nr":0,"pattern":"","text":"private val in object F is never used","type":119,"valid":true,"lines":["[warn] /home/haya14busa/src/github.com/reviewdog/errorformat/fmts/testdata/resources/scala/scalac.scala:4: private val in object F is never used","[warn] private val unused = 1","[warn] ^"]}
{"filename":"/home/haya14busa/src/github.com/reviewdog/errorformat/fmts/testdata/resources/scala/scalac.scala","lnum":5,"col":15,"vcol":true,"nr":0,"pattern":"","text":"private method in object F is never used","type":119,"valid":true,"lines":["[warn] /home/haya14busa/src/github.com/reviewdog/errorformat/fmts/testdata/resources/scala/scalac.scala:5: private method in object F is never used","[warn] private def unusedF = {}","[warn] ^"]}
SARIF Support (experimental)
It supports SARIF (Static Analysis Results Interchange Format) as output experimentally. Use -w=sarif
to give it a shot.
Example: errorformat -w=sarif
$ cat fmts/testdata/sbt.in | errorformat -name=sbt -w=sarif
{
"$schema": "http://json.schemastore.org/sarif-2.1.0-rtm.4",
"runs": [
{
"results": [
{
"level": "error",
"locations": [
{
"physicalLocation": {
"artifactLocation": {
"uri": "fmts/testdata/resources/scala/scalac.scala",
"uriBaseId": "%SRCROOT%"
},
"region": {
"startColumn": 3,
"startLine": 6
}
}
}
],
"message": {
"text": "missing argument list for method error in object Predef"
}
},
{
"level": "warning",
"locations": [
{
"physicalLocation": {
"artifactLocation": {
"uri": "fmts/testdata/resources/scala/scalac.scala",
"uriBaseId": "%SRCROOT%"
},
"region": {
"startColumn": 15,
"startLine": 4
}
}
}
],
"message": {
"text": "private val in object F is never used"
}
},
{
"level": "warning",
"locations": [
{
"physicalLocation": {
"artifactLocation": {
"uri": "fmts/testdata/resources/scala/scalac.scala",
"uriBaseId": "%SRCROOT%"
},
"region": {
"startColumn": 15,
"startLine": 5
}
}
}
],
"message": {
"text": "private method in object F is never used"
}
}
],
"tool": {
"driver": {
"name": "sbt"
}
}
}
],
"version": "2.1.0"
}
🐦 Author
haya14busa (https://github.com/haya14busa)