Corresponding change to formatter, see https://github.com/google/jsonnet/pull/937

This commit is contained in:
Dave Cunningham 2021-12-21 11:51:56 +00:00
parent 68af6e05bb
commit f60b015405
2 changed files with 33 additions and 13 deletions

View File

@ -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")

View File

@ -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)