diff --git a/jvm/src/test/scala/scala/xml/XMLTest.scala b/jvm/src/test/scala/scala/xml/XMLTest.scala index ba204d0e1..201557503 100644 --- a/jvm/src/test/scala/scala/xml/XMLTest.scala +++ b/jvm/src/test/scala/scala/xml/XMLTest.scala @@ -749,4 +749,20 @@ class XMLTestJVM { assertEquals("\n \n", pp.format(x)) } + @UnitTest + def issue231: Unit = { + val pp = new xml.PrettyPrinter(4, 2, minimizeEmpty = true) + val x = + val formatted = pp.format(x) + assertEquals(x, XML.loadString(formatted)) + assertTrue(formatted.trim.lines.length >= 2) + } + + @UnitTest + def issue231_withoutAttributes: Unit = { + val pp = new xml.PrettyPrinter(4, 2, minimizeEmpty = true) + val x = + val formatted = pp.format(x) + assertEquals(x, XML.loadString(formatted)) + } } diff --git a/shared/src/main/scala/scala/xml/PrettyPrinter.scala b/shared/src/main/scala/scala/xml/PrettyPrinter.scala index cce680246..d202da0e6 100755 --- a/shared/src/main/scala/scala/xml/PrettyPrinter.scala +++ b/shared/src/main/scala/scala/xml/PrettyPrinter.scala @@ -160,8 +160,16 @@ class PrettyPrinter(width: Int, step: Int, minimizeEmpty: Boolean) { if (childrenAreLeaves(node) && fits(test)) { makeBox(ind, test) } else { - val (stg, len2) = startTag(node, pscope) - val etg = endTag(node) + val ((stg, len2), etg) = + if (node.child.isEmpty && minimizeEmpty) { + // force the tag to be self-closing + val firstAttribute = test.indexOf(' ') + val firstBreak = if (firstAttribute != -1) firstAttribute else test.lastIndexOf('/') + ((test, firstBreak), "") + } else { + (startTag(node, pscope), endTag(node)) + } + if (stg.length < width - cur) { // start tag fits makeBox(ind, stg) makeBreak() @@ -180,10 +188,12 @@ class PrettyPrinter(width: Int, step: Int, minimizeEmpty: Boolean) { makeBreak() } }*/ - makeBox(ind, stg.substring(len2, stg.length)) - makeBreak() - traverse(node.child.iterator, node.scope, ind + step) - makeBox(cur, etg) + makeBox(ind, stg.substring(len2, stg.length).trim) + if (etg.nonEmpty) { + makeBreak() + traverse(node.child.iterator, node.scope, ind + step) + makeBox(cur, etg) + } makeBreak() } else { // give up makeBox(ind, test)