minor performance tuning;
authorwenzelm
Sat, 29 Jun 2024 12:42:47 +0200
changeset 80454 1b5ba70a64b9
parent 80451 e0bd9e4811ad
child 80455 99e276c44121
minor performance tuning;
src/Pure/PIDE/xml.scala
--- a/src/Pure/PIDE/xml.scala	Fri Jun 28 23:53:48 2024 +0200
+++ b/src/Pure/PIDE/xml.scala	Sat Jun 29 12:42:47 2024 +0200
@@ -47,16 +47,24 @@
     def end_elem(name: String): Unit
 
     def traverse(trees: List[Tree]): Unit = {
+      @tailrec def trav_atomic(list: List[Trav]): List[Trav] =
+        list match {
+          case Text(s) :: rest => text(s); trav_atomic(rest)
+          case Elem(markup, Nil) :: rest =>
+            if (!markup.is_empty) elem(markup, end = true)
+            trav_atomic(rest)
+          case End(name) :: rest => end_elem(name); trav_atomic(rest)
+          case _ => list
+        }
+
       @tailrec def trav(list: List[Trav]): Unit =
-        (list : @unchecked) match {
+        (trav_atomic(list) : @unchecked) match {
           case Nil =>
-          case Text(s) :: rest => text(s); trav(rest)
-          case Elem(markup, body) :: rest =>
-            if (markup.is_empty) trav(body ::: rest)
-            else if (body.isEmpty) { elem(markup, end = true); trav(rest) }
-            else { elem(markup); trav(body ::: End(markup.name) :: rest) }
-          case End(name) :: rest => end_elem(name); trav(rest)
+          case Elem(markup, body) :: rest if body.nonEmpty =>
+            if (markup.is_empty) trav(trav_atomic(body) ::: rest)
+            else { elem(markup); trav(trav_atomic(body) ::: End(markup.name) :: rest) }
         }
+
       trav(trees)
     }
   }