@@ -98,25 +98,38 @@ object Texts {
98
98
case Vertical (relems) => Vertical (relems map (_.indented))
99
99
}
100
100
101
- def print (sb : StringBuilder ): Unit = this match {
101
+ def print (sb : StringBuilder , numberWidth : Int ): Unit = this match {
102
102
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(" " )
103
114
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 }" )
108
115
case _ =>
109
116
var follow = false
110
117
for (elem <- relems.reverse) {
111
118
if (follow) sb.append(" \n " )
112
- elem.print(sb)
119
+ elem.print(sb, numberWidth )
113
120
follow = true
114
121
}
115
122
}
116
123
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 = {
118
130
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)
120
133
sb.toString
121
134
}
122
135
0 commit comments