From f60b01540566ed00560987db5198a5f77ee75a79 Mon Sep 17 00:00:00 2001 From: Dave Cunningham Date: Tue, 21 Dec 2021 11:51:56 +0000 Subject: [PATCH] Corresponding change to formatter, see https://github.com/google/jsonnet/pull/937 --- internal/formatter/jsonnetfmt.go | 9 +++++++- internal/formatter/unparser.go | 37 +++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/internal/formatter/jsonnetfmt.go b/internal/formatter/jsonnetfmt.go index 5007921..bdc6f5f 100644 --- a/internal/formatter/jsonnetfmt.go +++ b/internal/formatter/jsonnetfmt.go @@ -134,6 +134,12 @@ func removeInitialNewlines(node ast.Node) { } } +func removeExtraTrailingNewlines(finalFodder ast.Fodder) { + if len(finalFodder) > 0 { + finalFodder[len(finalFodder)-1].Blanks = 0 + } +} + func visitFile(p pass.ASTPass, node *ast.Node, finalFodder *ast.Fodder) { p.File(p, node, finalFodder) } @@ -183,10 +189,11 @@ func Format(filename string, input string, options Options) (string, error) { visitor := FixIndentation{Options: options} visitor.VisitFile(node, finalFodder) } + removeExtraTrailingNewlines(finalFodder) u := &unparser{options: options} u.unparse(node, false) - u.fill(finalFodder, true, false) + u.fillFinal(finalFodder, true, false) // Final whitespace is stripped at lexing time. Add a single new line // as files ought to end with a new line. u.write("\n") diff --git a/internal/formatter/unparser.go b/internal/formatter/unparser.go index f126a8b..ccddabd 100644 --- a/internal/formatter/unparser.go +++ b/internal/formatter/unparser.go @@ -50,9 +50,10 @@ func (u *unparser) write(str string) { // creates a crowded situation where there was not one before). // If crowded is false and separateToken is false then no space is printed // after or before the fodder, even if the last fodder was an interstitial. -func (u *unparser) fill(fodder ast.Fodder, crowded bool, separateToken bool) { +func (u *unparser) fodderFill(fodder ast.Fodder, crowded bool, separateToken bool, final bool) { var lastIndent int - for _, fod := range fodder { + for i, fod := range fodder { + skipTrailing := final && (i == (len(fodder) - 1)) switch fod.Kind { case ast.FodderParagraph: for i, l := range fod.Comment { @@ -68,11 +69,13 @@ func (u *unparser) fill(fodder ast.Fodder, crowded bool, separateToken bool) { } u.write("\n") } - for i := 0; i < fod.Blanks; i++ { - u.write("\n") - } - for i := 0; i < fod.Indent; i++ { - u.write(" ") + if !skipTrailing { + for i := 0; i < fod.Blanks; i++ { + u.write("\n") + } + for i := 0; i < fod.Indent; i++ { + u.write(" ") + } } lastIndent = fod.Indent crowded = false @@ -82,11 +85,13 @@ func (u *unparser) fill(fodder ast.Fodder, crowded bool, separateToken bool) { u.write(" ") u.write(fod.Comment[0]) } - for i := 0; i <= fod.Blanks; i++ { - u.write("\n") - } - for i := 0; i < fod.Indent; i++ { - u.write(" ") + if !skipTrailing { + for i := 0; i <= fod.Blanks; i++ { + u.write("\n") + } + for i := 0; i < fod.Indent; i++ { + u.write(" ") + } } lastIndent = fod.Indent crowded = false @@ -104,6 +109,14 @@ func (u *unparser) fill(fodder ast.Fodder, crowded bool, separateToken bool) { } } +func (u *unparser) fill(fodder ast.Fodder, crowded bool, separateToken bool) { + u.fodderFill(fodder, crowded, separateToken, false) +} + +func (u *unparser) fillFinal(fodder ast.Fodder, crowded bool, separateToken bool) { + u.fodderFill(fodder, crowded, separateToken, true) +} + func (u *unparser) unparseSpecs(spec *ast.ForSpec) { if spec.Outer != nil { u.unparseSpecs(spec.Outer)