aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2024-07-12 18:35:54 +0200
committerRon Evans <[email protected]>2024-07-20 14:30:34 +0200
commit824bf244453bdb0502fa30de70c799d666665480 (patch)
tree6aebadab689b4dff5eb26ecf208ea5c2a9198ba5
parent80269b98ba1163485edf0972d1b9e93353f67e5b (diff)
downloadtinygo-824bf244453bdb0502fa30de70c799d666665480.tar.gz
tinygo-824bf244453bdb0502fa30de70c799d666665480.zip
diagnostics: sort package diagnostics by position
Previously, the error messages could be shown out of order. With this patch, the errors are sorted before being shown to the user. This makes it easier to read the error messages, and matches what the `go` toolchain does.
-rw-r--r--diagnostics/diagnostics.go17
-rw-r--r--testdata/errors/types.go2
2 files changed, 17 insertions, 2 deletions
diff --git a/diagnostics/diagnostics.go b/diagnostics/diagnostics.go
index c793ba4aa..f9261e292 100644
--- a/diagnostics/diagnostics.go
+++ b/diagnostics/diagnostics.go
@@ -10,6 +10,7 @@ import (
"go/types"
"io"
"path/filepath"
+ "sort"
"strings"
"github.com/tinygo-org/tinygo/builder"
@@ -59,6 +60,7 @@ func CreateDiagnostics(err error) ProgramDiagnostic {
// Create diagnostics for a single package (though, in practice, it may also be
// used for whole-program diagnostics in some cases).
func createPackageDiagnostic(err error) PackageDiagnostic {
+ // Extract diagnostics for this package.
var pkgDiag PackageDiagnostic
switch err := err.(type) {
case loader.Errors:
@@ -89,7 +91,20 @@ func createPackageDiagnostic(err error) PackageDiagnostic {
default:
pkgDiag.Diagnostics = createDiagnostics(err)
}
- // TODO: sort
+
+ // Sort these diagnostics by file/line/column.
+ sort.SliceStable(pkgDiag.Diagnostics, func(i, j int) bool {
+ posI := pkgDiag.Diagnostics[i].Pos
+ posJ := pkgDiag.Diagnostics[j].Pos
+ if posI.Filename != posJ.Filename {
+ return posI.Filename < posJ.Filename
+ }
+ if posI.Line != posJ.Line {
+ return posI.Line < posJ.Line
+ }
+ return posI.Column < posJ.Column
+ })
+
return pkgDiag
}
diff --git a/testdata/errors/types.go b/testdata/errors/types.go
index 491e2fe67..6bd949f0c 100644
--- a/testdata/errors/types.go
+++ b/testdata/errors/types.go
@@ -7,6 +7,6 @@ func main() {
}
// ERROR: # command-line-arguments
+// ERROR: types.go:4:6: a declared and not used
// ERROR: types.go:5:6: cannot use "foobar" (untyped string constant) as int value in assignment
// ERROR: types.go:6:2: undefined: nonexisting
-// ERROR: types.go:4:6: a declared and not used