From f3e9998dc605f9e1c697cd30e7187795fba10b5f Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Thu, 11 Dec 2025 20:53:52 +1100 Subject: [PATCH 1/3] Add `-lint=suggest` to include replacement in `--format=json` output --- buildifier/config/config.go | 4 ++-- buildifier/config/validation.go | 8 ++++++-- buildifier/utils/diagnostics.go | 36 +++++++++++++++++++++++++-------- buildifier/utils/utils.go | 2 ++ 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/buildifier/config/config.go b/buildifier/config/config.go index e9783b949..1e4fda76b 100644 --- a/buildifier/config/config.go +++ b/buildifier/config/config.go @@ -102,7 +102,7 @@ type Config struct { Mode string `json:"mode,omitempty"` // DiffMode is an alias for DiffMode bool `json:"diffMode,omitempty"` - // Lint determines the lint mode: off, warn, or fix (default off) + // Lint determines the lint mode: off, warn, suggest, or fix (default off) Lint string `json:"lint,omitempty"` // Warnings is a comma-separated list of warning identifiers used in the lint mode or "all" Warnings string `json:"warnings,omitempty"` @@ -201,7 +201,7 @@ func (c *Config) Validate(args []string) error { return err } - if err := ValidateModes(&c.Mode, &c.Lint, &c.DiffMode); err != nil { + if err := ValidateModes(&c.Mode, &c.Lint, &c.DiffMode, &c.Format); err != nil { return err } diff --git a/buildifier/config/validation.go b/buildifier/config/validation.go index 87cc39326..e73798a4f 100644 --- a/buildifier/config/validation.go +++ b/buildifier/config/validation.go @@ -60,7 +60,7 @@ func isRecognizedMode(validModes []string, mode string) bool { } // ValidateModes validates flags --mode, --lint, and -d -func ValidateModes(mode, lint *string, dflag *bool, additionalModes ...string) error { +func ValidateModes(mode, lint *string, dflag *bool, format *string) error { if *dflag { if *mode != "" { return fmt.Errorf("cannot specify both -d and -mode flags") @@ -70,7 +70,6 @@ func ValidateModes(mode, lint *string, dflag *bool, additionalModes ...string) e // Check mode. validModes := []string{"check", "diff", "fix", "print_if_changed"} - validModes = append(validModes, additionalModes...) if *mode == "" { *mode = "fix" @@ -91,6 +90,11 @@ func ValidateModes(mode, lint *string, dflag *bool, additionalModes ...string) e return fmt.Errorf("--lint=fix is only compatible with --mode=fix") } + case "suggest": + if *format != "json" { + return fmt.Errorf("--lint=suggest is only compatible with --format=json") + } + default: return fmt.Errorf("unrecognized lint mode %s; valid modes are warn and fix", *lint) } diff --git a/buildifier/utils/diagnostics.go b/buildifier/utils/diagnostics.go index 0d4398114..61afa7be6 100644 --- a/buildifier/utils/diagnostics.go +++ b/buildifier/utils/diagnostics.go @@ -19,9 +19,10 @@ package utils import ( "encoding/json" "fmt" + "strings" + "github.com/bazelbuild/buildtools/build" "github.com/bazelbuild/buildtools/warn" - "strings" ) // Diagnostics contains diagnostic information returned by formatter and linter @@ -74,13 +75,14 @@ type FileDiagnostics struct { } type warning struct { - Start position `json:"start"` - End position `json:"end"` - Category string `json:"category"` - Actionable bool `json:"actionable"` - AutoFixable bool `json:"autoFixable"` - Message string `json:"message"` - URL string `json:"url"` + Start position `json:"start"` + End position `json:"end"` + Category string `json:"category"` + Actionable bool `json:"actionable"` + AutoFixable bool `json:"autoFixable"` + Message string `json:"message"` + URL string `json:"url"` + Replacement *replacement `json:"replacement"` // Optional replacement } type position struct { @@ -88,6 +90,12 @@ type position struct { Column int `json:"column"` } +type replacement struct { + Start int `json:"start"` // Start offset in bytes + End int `json:"end"` // End offset in bytes, may be equal to Start for insertions + Content string `json:"content"` // Replacement content +} + // NewDiagnostics returns a new Diagnostics object func NewDiagnostics(fileDiagnostics ...*FileDiagnostics) *Diagnostics { diagnostics := &Diagnostics{ @@ -121,6 +129,7 @@ func NewFileDiagnostics(filename string, warnings []*warn.Finding) *FileDiagnost AutoFixable: w.AutoFixable, Message: w.Message, URL: w.URL, + Replacement: makeReplacement(w.Replacement), }) } @@ -147,3 +156,14 @@ func makePosition(p build.Position) position { Column: p.LineRune, } } + +func makeReplacement(r *warn.Replacement) *replacement { + if r == nil { + return nil + } + return &replacement{ + Start: r.Start, + End: r.End, + Content: r.Content, + } +} diff --git a/buildifier/utils/utils.go b/buildifier/utils/utils.go index ded4036d3..9bfc5af58 100644 --- a/buildifier/utils/utils.go +++ b/buildifier/utils/utils.go @@ -131,6 +131,8 @@ func Lint(f *build.File, lint string, warningsList *[]string, verbose bool) []*w switch lint { case "warn": return warn.FileWarnings(f, *warningsList, nil, warn.ModeWarn, fileReader) + case "suggest": + return warn.FileWarnings(f, *warningsList, nil, warn.ModeSuggest, fileReader) case "fix": warn.FixWarnings(f, *warningsList, verbose, fileReader) } From 600fbb856f0acf1523d0e21e3c25cf2be2ac5f02 Mon Sep 17 00:00:00 2001 From: Jordan Date: Thu, 11 Dec 2025 21:17:19 +1100 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- buildifier/config/validation.go | 2 +- buildifier/utils/diagnostics.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildifier/config/validation.go b/buildifier/config/validation.go index e73798a4f..624045207 100644 --- a/buildifier/config/validation.go +++ b/buildifier/config/validation.go @@ -96,7 +96,7 @@ func ValidateModes(mode, lint *string, dflag *bool, format *string) error { } default: - return fmt.Errorf("unrecognized lint mode %s; valid modes are warn and fix", *lint) +return fmt.Errorf("unrecognized lint mode %s; valid modes are warn, suggest, and fix", *lint) } return nil diff --git a/buildifier/utils/diagnostics.go b/buildifier/utils/diagnostics.go index 61afa7be6..39184fa76 100644 --- a/buildifier/utils/diagnostics.go +++ b/buildifier/utils/diagnostics.go @@ -82,7 +82,7 @@ type warning struct { AutoFixable bool `json:"autoFixable"` Message string `json:"message"` URL string `json:"url"` - Replacement *replacement `json:"replacement"` // Optional replacement +Replacement *replacement `json:"replacement,omitempty"` // Optional replacement } type position struct { From 22cc133a8750ecf1e34c3ca561dbf608a18a5b93 Mon Sep 17 00:00:00 2001 From: Jordan Date: Thu, 11 Dec 2025 21:27:14 +1100 Subject: [PATCH 3/3] fix gemini whitespace error --- buildifier/utils/diagnostics.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildifier/utils/diagnostics.go b/buildifier/utils/diagnostics.go index 39184fa76..5f859f5c9 100644 --- a/buildifier/utils/diagnostics.go +++ b/buildifier/utils/diagnostics.go @@ -82,7 +82,7 @@ type warning struct { AutoFixable bool `json:"autoFixable"` Message string `json:"message"` URL string `json:"url"` -Replacement *replacement `json:"replacement,omitempty"` // Optional replacement + Replacement *replacement `json:"replacement,omitempty"` // Optional replacement } type position struct {