diff --git a/pkl-formatter/src/main/kotlin/org/pkl/formatter/Generator.kt b/pkl-formatter/src/main/kotlin/org/pkl/formatter/Generator.kt index 947d374a..4a1da6dd 100644 --- a/pkl-formatter/src/main/kotlin/org/pkl/formatter/Generator.kt +++ b/pkl-formatter/src/main/kotlin/org/pkl/formatter/Generator.kt @@ -89,7 +89,6 @@ internal class Generator { } is MultilineStringGroup -> { val indentLength = indent * INDENT.length - val offset = (indentLength + 1) - node.endQuoteCol var previousNewline = false for ((i, child) in node.nodes.withIndex()) { when { @@ -99,7 +98,8 @@ internal class Generator { child.text.isBlank() && child.text.length == indentLength && node.nodes[i + 1] is ForceLine -> {} - child is Text && previousNewline && offset != 0 -> text(reposition(child.text, offset)) + child is Text && previousNewline -> + text(reposition(child.text, node.endQuoteCol - 1, indentLength)) else -> node(child, Wrap.DETECT) // always detect wrapping } previousNewline = child is ForceLine @@ -123,13 +123,10 @@ internal class Generator { shouldAddIndent = shouldIndent } - private fun reposition(text: String, offset: Int): String { - return if (offset > 0) { - " ".repeat(offset) + text - } else { - text.drop(-offset) - } - } + // accept text indented by originalOffset characters (tabs or spaces) + // and return it indented by newOffset characters (spaces only) + private fun reposition(text: String, originalOffset: Int, newOffset: Int): String = + " ".repeat(newOffset) + text.drop(originalOffset) override fun toString(): String { return buf.toString() diff --git a/pkl-formatter/src/test/files/FormatterSnippetTests/input/multi-line-strings.pkl b/pkl-formatter/src/test/files/FormatterSnippetTests/input/multi-line-strings.pkl index 53bdabc7..1124f420 100644 --- a/pkl-formatter/src/test/files/FormatterSnippetTests/input/multi-line-strings.pkl +++ b/pkl-formatter/src/test/files/FormatterSnippetTests/input/multi-line-strings.pkl @@ -27,3 +27,23 @@ qux = """ \(foo) """ + +// mixed tabs and spaces +quux { + // space tab + """ + bar + + baz + \(1) + + """ + // tab tab + """ + bar + + baz + \(1) + + """ +} diff --git a/pkl-formatter/src/test/files/FormatterSnippetTests/output/multi-line-strings.pkl b/pkl-formatter/src/test/files/FormatterSnippetTests/output/multi-line-strings.pkl index 144b585d..35246e0c 100644 --- a/pkl-formatter/src/test/files/FormatterSnippetTests/output/multi-line-strings.pkl +++ b/pkl-formatter/src/test/files/FormatterSnippetTests/output/multi-line-strings.pkl @@ -29,3 +29,23 @@ qux = \(foo) """ + +// mixed tabs and spaces +quux { + // space tab + """ + bar + + baz + \(1) + + """ + // tab tab + """ + bar + + baz + \(1) + + """ +}