diff --git a/parser/v2/formattestdata/multiline_string_literal_indentation_preserved.txt b/parser/v2/formattestdata/multiline_string_literal_indentation_preserved.txt new file mode 100644 index 000000000..8e5fa99ef --- /dev/null +++ b/parser/v2/formattestdata/multiline_string_literal_indentation_preserved.txt @@ -0,0 +1,40 @@ +-- in -- +package main + +templ x() { + @something(`Hi +some cool text + +foo + +bar + + `) + @something(` + something + `, + ` + something + `, + ) +} +-- out -- +package main + +templ x() { + @something(`Hi +some cool text + +foo + +bar + + `) + @something(` + something + `, + ` + something + `, + ) +} diff --git a/parser/v2/types.go b/parser/v2/types.go index 02a437d36..cacb6cb4b 100644 --- a/parser/v2/types.go +++ b/parser/v2/types.go @@ -194,20 +194,6 @@ func (exp TemplateFileGoExpression) Write(w io.Writer, indent int) error { return err } -func writeLinesIndented(w io.Writer, level int, s string) (err error) { - indent := strings.Repeat("\t", level) - lines := strings.Split(s, "\n") - indented := strings.Join(lines, "\n"+indent) - if _, err = io.WriteString(w, indent); err != nil { - return err - } - _, err = io.WriteString(w, indented) - if err != nil { - return - } - return -} - func writeIndent(w io.Writer, level int, s ...string) (err error) { indent := strings.Repeat("\t", level) if _, err = io.WriteString(w, indent); err != nil { @@ -963,8 +949,32 @@ func (tee TemplElementExpression) Write(w io.Writer, indent int) error { if err != nil { source = []byte(tee.Expression.Value) } - if err := writeLinesIndented(w, indent, "@"+string(source)); err != nil { - return err + // Indent all lines and re-format, we can then use this to only re-indent lines that gofmt would modify. + reformattedSource, err := format.Source(bytes.ReplaceAll(source, []byte("\n"), []byte("\n\t"))) + if err != nil { + reformattedSource = source + } + sourceLines := bytes.Split(source, []byte("\n")) + reformattedSourceLines := bytes.Split(reformattedSource, []byte("\n")) + for i := range sourceLines { + if i == 0 { + if err := writeIndent(w, indent, "@"+string(sourceLines[i])); err != nil { + return err + } + continue + } + if _, err := io.WriteString(w, "\n"); err != nil { + return err + } + if string(sourceLines[i]) != string(reformattedSourceLines[i]) { + if _, err := io.WriteString(w, string(sourceLines[i])); err != nil { + return err + } + continue + } + if err := writeIndent(w, indent, string(sourceLines[i])); err != nil { + return err + } } if len(tee.Children) == 0 { return nil