summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenz Wildberg <lorenz@wild-fisch.de>2021-09-19 01:30:42 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2021-11-08 11:31:18 +0100
commit32366df9e1cfc73a9d521675a017a7db25f03a7c (patch)
tree430989feaecd668ff5161ea301002d442b03705e
parentf38fdde7e837251093a7dadab95dc576712a9fc7 (diff)
downloadvala-32366df9e1cfc73a9d521675a017a7db25f03a7c.tar.gz
vala: Add multi-line support to Vala.Report
To fix multi-line errors, the "^~~~"-underline appears now under all lines and columns between the begin and end of the source reference. Also a line number with a "|" at the left side is added for better finding the source of the error. This helps also one-line errors. Fixes https://gitlab.gnome.org/GNOME/vala/issues/764
-rw-r--r--vala/valareport.vala59
1 files changed, 31 insertions, 28 deletions
diff --git a/vala/valareport.vala b/vala/valareport.vala
index 0aad89f15..3d3a95fc8 100644
--- a/vala/valareport.vala
+++ b/vala/valareport.vala
@@ -232,39 +232,42 @@ public class Vala.Report {
* Pretty-print the actual line of offending code if possible.
*/
private void report_source (SourceReference source) {
- if (source.begin.line != source.end.line) {
- // FIXME Cannot report multi-line issues currently
- return;
- }
-
- string offending_line = source.file.get_source_line (source.begin.line);
-
- if (offending_line != null) {
- stderr.printf ("%s\n", offending_line);
- int idx;
-
- /* We loop in this manner so that we don't fall over on differing
- * tab widths. This means we get the ^s in the right places.
- */
- for (idx = 1; idx < source.begin.column; ++idx) {
- if (offending_line[idx - 1] == '\t') {
- stderr.printf ("\t");
- } else {
- stderr.printf (" ");
- }
- }
-
+ for (int idx = source.begin.line; idx <= source.end.line; idx++) {
+ string offending_line = source.file.get_source_line (idx);
+ stderr.printf ("%5d | %s\n", idx, offending_line);
+ stderr.printf (" | ");
stderr.puts (caret_color_start);
- for (idx = source.begin.column; idx <= source.end.column; ++idx) {
- if (offending_line[idx - 1] == '\t') {
- stderr.printf ("\t");
+ for (int jdx = 0; jdx < offending_line.length; jdx++) {
+ if (offending_line[jdx] == '\t') {
+ stderr.putc ('\t');
+ continue;
+ }
+ bool caret = false;
+ unowned SourceLocation begin = source.begin;
+ unowned SourceLocation end = source.end;
+ if (begin.line == idx && end.line == idx) {
+ if (begin.column <= jdx + 1 <= end.column) {
+ caret = true;
+ }
+ } else if (begin.line == idx && begin.column <= jdx + 1) {
+ caret = true;
+ } else if (begin.line < idx < end.line) {
+ caret = true;
+ } else if (end.line == idx && end.column >= jdx + 1) {
+ caret = true;
+ }
+ if (caret) {
+ if (begin.line == idx && begin.column == jdx + 1) {
+ stderr.putc ('^');
+ } else {
+ stderr.putc ('~');
+ }
} else {
- stderr.printf ("^");
+ stderr.putc (' ');
}
}
stderr.puts (caret_color_end);
-
- stderr.printf ("\n");
+ stderr.putc ('\n');
}
}