From 80ce6ac11221509b4af6c363c8d04b8e5750161a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Barzowski?= Date: Tue, 3 Oct 2017 14:29:12 -0400 Subject: [PATCH] Don't escape block strings (#98) * Don't escape block strings --- ast/ast.go | 10 ++++++++++ desugarer.go | 6 +++--- testdata/block_escaping.golden | 1 + testdata/block_escaping.jsonnet | 4 ++++ 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 testdata/block_escaping.golden create mode 100644 testdata/block_escaping.jsonnet diff --git a/ast/ast.go b/ast/ast.go index 62093da..89ed5b3 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -416,6 +416,16 @@ const ( VerbatimStringSingle ) +func (k LiteralStringKind) FullyEscaped() bool { + switch k { + case StringSingle, StringDouble: + return true + case StringBlock, VerbatimStringDouble, VerbatimStringSingle: + return false + } + panic(fmt.Sprintf("Unknown string kind: %v", k)) +} + // LiteralString represents a JSON string type LiteralString struct { NodeBase diff --git a/desugarer.go b/desugarer.go index 2bac874..0fe4351 100644 --- a/desugarer.go +++ b/desugarer.go @@ -502,15 +502,15 @@ func desugar(astPtr *ast.Node, objLevel int) (err error) { // Nothing to do. case *ast.LiteralString: - if node.Kind != ast.VerbatimStringDouble && node.Kind != ast.VerbatimStringSingle { + if node.Kind.FullyEscaped() { unescaped, err := stringUnescape(node.Loc(), node.Value) if err != nil { return err } node.Value = unescaped - node.Kind = ast.StringDouble - node.BlockIndent = "" } + node.Kind = ast.StringDouble + node.BlockIndent = "" case *ast.Object: // Hidden variable to allow $ binding. if objLevel == 0 { diff --git a/testdata/block_escaping.golden b/testdata/block_escaping.golden new file mode 100644 index 0000000..d41f8fc --- /dev/null +++ b/testdata/block_escaping.golden @@ -0,0 +1 @@ +"\\n\n\\t\n" diff --git a/testdata/block_escaping.jsonnet b/testdata/block_escaping.jsonnet new file mode 100644 index 0000000..f318da9 --- /dev/null +++ b/testdata/block_escaping.jsonnet @@ -0,0 +1,4 @@ +||| + \n + \t +|||