@@ -332,12 +332,56 @@ trait MessageRendering {
332332 val partsOnLine = validParts.filter(_.srcPos.startLine == lineNum)
333333 .sortBy(p => (p.srcPos.startColumn, ! p.isPrimary))
334334
335- for part <- partsOnLine do
335+ if partsOnLine.size == 1 then
336+ // Single marker on this line
337+ val part = partsOnLine.head
336338 val markerChar = if part.isPrimary then '^' else '-'
337339 val marker = positionMarker(part.srcPos, markerChar)
338340 val err = errorMsg(part.srcPos, part.text)
339341 sb.append(marker).append(EOL )
340342 sb.append(err).append(EOL )
343+ else if partsOnLine.size > 1 then
344+ // Multiple markers on same line
345+ val markerLine = StringBuilder ()
346+ markerLine.append(offsetBox)
347+
348+ var currentCol = 0
349+ for part <- partsOnLine do
350+ val markerChar = if part.isPrimary then '^' else '-'
351+ val targetCol = part.srcPos.startColumn
352+ val padding = " " * (targetCol - currentCol)
353+ markerLine.append(padding).append(markerChar)
354+ currentCol = targetCol + 1
355+
356+ sb.append(markerLine).append(EOL )
357+
358+ // Render messages from right to left with connector bars
359+ val sortedByColumn = partsOnLine.reverse // rightmost first
360+ for (part, idx) <- sortedByColumn.zipWithIndex do
361+ val remainingParts = sortedByColumn.drop(idx + 1 ) // parts still waiting for messages
362+
363+ // Build connector line with vertical bars for remaining parts
364+ val connectorLine = StringBuilder ()
365+ connectorLine.append(offsetBox)
366+
367+ var col = 0
368+ // First, add vertical bars for all remaining (not-yet-shown) parts
369+ for p <- partsOnLine do
370+ if remainingParts.contains(p) then
371+ val targetCol = p.srcPos.startColumn
372+ val padding = " " * (targetCol - col)
373+ connectorLine.append(padding).append(" |" )
374+ col = targetCol + 1
375+
376+ // Then add the message for the current part, aligned to its column
377+ val msgText = part.text
378+ val msgCol = part.srcPos.startColumn
379+ // If we've added bars, col is position after last bar; if not, col is 0
380+ // We want the message to start at msgCol, with at least one space separation
381+ val msgPadding = if col == 0 then " " * msgCol else " " * Math .max(1 , msgCol - col)
382+ connectorLine.append(msgPadding).append(msgText)
383+
384+ sb.append(connectorLine).append(EOL )
341385
342386 // Add explanation if needed
343387 if Diagnostic .shouldExplain(dia) then
0 commit comments