From 0055be63c9e12fa7ac30878c418a839267f630b2 Mon Sep 17 00:00:00 2001 From: Tim Vergenz Date: Fri, 11 Oct 2024 13:12:27 -0400 Subject: [PATCH] feat: add |||- chomped text block syntax Resolves google/jsonnet#289 Companion PR to google/jsonnet#1175 --- internal/formatter/fix_indentation.go | 2 +- internal/formatter/unparser.go | 9 ++++++++- internal/parser/lexer.go | 17 +++++++++++++++-- testdata/block_string_chomped.golden | 1 + testdata/block_string_chomped.jsonnet | 5 +++++ testdata/block_string_chomped.linter.golden | 0 testdata/block_string_chomped_concatted.golden | 1 + testdata/block_string_chomped_concatted.jsonnet | 5 +++++ ...block_string_chomped_concatted.linter.golden | 0 9 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 testdata/block_string_chomped.golden create mode 100644 testdata/block_string_chomped.jsonnet create mode 100644 testdata/block_string_chomped.linter.golden create mode 100644 testdata/block_string_chomped_concatted.golden create mode 100644 testdata/block_string_chomped_concatted.jsonnet create mode 100644 testdata/block_string_chomped_concatted.linter.golden diff --git a/internal/formatter/fix_indentation.go b/internal/formatter/fix_indentation.go index 90229d197..103f95b50 100644 --- a/internal/formatter/fix_indentation.go +++ b/internal/formatter/fix_indentation.go @@ -685,7 +685,7 @@ func (c *FixIndentation) Visit(expr ast.Node, currIndent indent, crowded bool) { node.BlockIndent = strings.Repeat(" ", currIndent.base+c.Options.Indent) node.BlockTermIndent = strings.Repeat(" ", currIndent.base) c.column = currIndent.base // blockTermIndent - c.column += 3 // "|||" + c.column += 3 // always "|||" (never "|||-" because we're only accounting for block end) case ast.VerbatimStringSingle: c.column += 3 // Include @, start and end quotes for _, r := range node.Value { diff --git a/internal/formatter/unparser.go b/internal/formatter/unparser.go index d3e92cdfb..d9d3a1ba4 100644 --- a/internal/formatter/unparser.go +++ b/internal/formatter/unparser.go @@ -467,7 +467,11 @@ func (u *unparser) unparse(expr ast.Node, crowded bool) { u.write(node.Value) u.write("'") case ast.StringBlock: - u.write("|||\n") + u.write("|||") + if node.Value[len(node.Value)-1] != '\n' { + u.write("-") + } + u.write("\n") if node.Value[0] != '\n' { u.write(node.BlockIndent) } @@ -481,6 +485,9 @@ func (u *unparser) unparse(expr ast.Node, crowded bool) { u.write(node.BlockIndent) } } + if node.Value[len(node.Value)-1] != '\n' { + u.write("\n") + } u.write(node.BlockTermIndent) u.write("|||") case ast.VerbatimStringDouble: diff --git a/internal/parser/lexer.go b/internal/parser/lexer.go index 374343625..0b3437263 100644 --- a/internal/parser/lexer.go +++ b/internal/parser/lexer.go @@ -719,6 +719,13 @@ func (l *lexer) lexSymbol() error { if r == '|' && strings.HasPrefix(l.input[l.pos.byteNo:], "||") { commentStartLoc := l.tokenStartLoc l.acceptN(2) // Skip "||" + + var chompTrailingNl bool = false + if l.peek() == '-' { + chompTrailingNl = true + l.next() + } + var cb bytes.Buffer // Skip whitespace @@ -775,7 +782,13 @@ func (l *lexer) lexSymbol() error { return l.makeStaticErrorPoint("Text block not terminated with |||", commentStartLoc) } l.acceptN(3) // Skip '|||' - l.emitFullToken(tokenStringBlock, cb.String(), + + var str string = cb.String() + if chompTrailingNl { + str = str[:len(str)-1] + } + + l.emitFullToken(tokenStringBlock, str, stringBlockIndent, stringBlockTermIndent) l.resetTokenStart() return nil @@ -793,7 +806,7 @@ func (l *lexer) lexSymbol() error { if r == '/' && strings.HasPrefix(l.input[l.pos.byteNo:], "*") { break } - // Not allowed ||| in operators + // Not allowed ||| in operators (accounts for |||-) if r == '|' && strings.HasPrefix(l.input[l.pos.byteNo:], "||") { break } diff --git a/testdata/block_string_chomped.golden b/testdata/block_string_chomped.golden new file mode 100644 index 000000000..1d0a12680 --- /dev/null +++ b/testdata/block_string_chomped.golden @@ -0,0 +1 @@ +"foo\nbar\nbaz" diff --git a/testdata/block_string_chomped.jsonnet b/testdata/block_string_chomped.jsonnet new file mode 100644 index 000000000..559901f51 --- /dev/null +++ b/testdata/block_string_chomped.jsonnet @@ -0,0 +1,5 @@ +|||- + foo + bar + baz +||| diff --git a/testdata/block_string_chomped.linter.golden b/testdata/block_string_chomped.linter.golden new file mode 100644 index 000000000..e69de29bb diff --git a/testdata/block_string_chomped_concatted.golden b/testdata/block_string_chomped_concatted.golden new file mode 100644 index 000000000..47dc09463 --- /dev/null +++ b/testdata/block_string_chomped_concatted.golden @@ -0,0 +1 @@ +"foo bar baz all one line" diff --git a/testdata/block_string_chomped_concatted.jsonnet b/testdata/block_string_chomped_concatted.jsonnet new file mode 100644 index 000000000..db4b69103 --- /dev/null +++ b/testdata/block_string_chomped_concatted.jsonnet @@ -0,0 +1,5 @@ +|||- + foo bar baz +||| + |||- + all one line +||| diff --git a/testdata/block_string_chomped_concatted.linter.golden b/testdata/block_string_chomped_concatted.linter.golden new file mode 100644 index 000000000..e69de29bb