@@ -98,25 +98,38 @@ object Texts {
9898 case Vertical (relems) => Vertical (relems map (_.indented))
9999 }
100100
101- def print (sb : StringBuilder ): Unit = this match {
101+ def print (sb : StringBuilder , numberWidth : Int ): Unit = this match {
102102 case Str (s, start, end) =>
103+ def printLine (ln : String ) = {
104+ val pad = (numberWidth - ln.length - 1 )
105+ assert(pad >= 0 )
106+ sb.append(" " * pad)
107+ sb.append(ln)
108+ sb.append(" |" )
109+ }
110+ if (numberWidth == 0 ) () // Do not print line numbers
111+ else if (start == end) printLine((start + 1 ).toString)
112+ else if (start != Int .MaxValue ) printLine(s " ${start + 1 }- ${end + 1 }" )
113+ else printLine(" " )
103114 sb.append(s)
104- if (start == end)
105- sb.append(s " // @line ${start + 1 }" )
106- else if (start != Int .MaxValue )
107- sb.append(s " // @lines ${start + 1 } to ${end + 1 }" )
108115 case _ =>
109116 var follow = false
110117 for (elem <- relems.reverse) {
111118 if (follow) sb.append(" \n " )
112- elem.print(sb)
119+ elem.print(sb, numberWidth )
113120 follow = true
114121 }
115122 }
116123
117- def mkString (width : Int ): String = {
124+ def maxLine : Int = this match {
125+ case Str (_, _, end) => end
126+ case _ => (- 1 /: relems)((acc, relem) => acc max relem.maxLine)
127+ }
128+
129+ def mkString (width : Int , withLineNumbers : Boolean ): String = {
118130 val sb = new StringBuilder
119- layout(width).print(sb)
131+ val numberWidth = if (withLineNumbers) (2 * maxLine.toString.length) + 2 else 0
132+ layout(width - numberWidth).print(sb, numberWidth)
120133 sb.toString
121134 }
122135
0 commit comments