diff options
author | David Malcolm <dmalcolm@redhat.com> | 2019-10-01 21:58:17 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2019-10-01 21:58:17 +0000 |
commit | e9c9a142b49d069c5b7c24d47b07756e9d591956 (patch) | |
tree | 1733bd2afdb942dcf5381fec2e6e5d79071d9db8 /gcc/diagnostic-show-locus.c | |
parent | a16bc2f317ddfeb45a6b293aec4d89afe0e79a72 (diff) | |
download | gcc-e9c9a142b49d069c5b7c24d47b07756e9d591956.zip gcc-e9c9a142b49d069c5b7c24d47b07756e9d591956.tar.gz gcc-e9c9a142b49d069c5b7c24d47b07756e9d591956.tar.bz2 |
Support prefixes in diagnostic_show_locus
Previously, diagnostic_show_locus saved and restored the pretty_printer's
prefix, clearing it for the duration of the call.
I have a patch kit in development that can benefit from applying a prefix
to the output of d_s_l, so this patch adds support to d_s_l for printing
such prefixes.
It moves the save and restore of the pp's prefix from d_s_l to all of its
callers, and updates diagnostic-show-locus.c to properly handle prefixes.
gcc/c-family/ChangeLog:
* c-opts.c (c_diagnostic_finalizer): Temporarily clear prefix when
calling diagnostic_show_locus, rather than destroying it afterwards.
gcc/ChangeLog:
* diagnostic-show-locus.c (layout::print_gap_in_line_numbering):
Call pp_emit_prefix.
(layout::print_source_line): Likewise.
(layout::start_annotation_line): Likewise.
(diagnostic_show_locus): Remove call to temporarily clear the
prefix.
(selftest::test_one_liner_fixit_remove): Add test coverage for the
interaction of pp_set_prefix with rulers and fix-it hints.
* diagnostic.c (default_diagnostic_finalizer): Temporarily clear
prefix when calling diagnostic_show_locus, rather than destroying
it afterwards.
(print_parseable_fixits): Temporarily clear prefix.
* pretty-print.c (pp_format): Save and restore line_length, rather
than assuming it is zero.
(pp_output_formatted_text): Remove assertion that line_length is
zero.
gcc/fortran/ChangeLog:
* error.c (gfc_diagnostic_starter): Clear the prefix before
calling diagnostic_show_locus.
gcc/testsuite/ChangeLog:
* gcc.dg/plugin/diagnostic_group_plugin.c (test_begin_group_cb):
Clear the prefix before emitting the "END GROUP" line.
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
(custom_diagnostic_finalizer): Temporarily clear prefix when
calling diagnostic_show_locus, rather than destroying it
afterwards.
From-SVN: r276433
Diffstat (limited to 'gcc/diagnostic-show-locus.c')
-rw-r--r-- | gcc/diagnostic-show-locus.c | 96 |
1 files changed, 83 insertions, 13 deletions
diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index 6612cbb6..cb920f6 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -1039,6 +1039,8 @@ layout::print_gap_in_line_numbering () { gcc_assert (m_show_line_numbers_p); + pp_emit_prefix (m_pp); + for (int i = 0; i < m_linenum_width + 1; i++) pp_character (m_pp, '.'); @@ -1266,6 +1268,8 @@ layout::print_source_line (linenum_type row, const char *line, int line_width, line_width); line += m_x_offset; + pp_emit_prefix (m_pp); + if (m_show_line_numbers_p) { int width = num_digits (row); @@ -1346,6 +1350,7 @@ layout::should_print_annotation_line_p (linenum_type row) const void layout::start_annotation_line (char margin_char) const { + pp_emit_prefix (m_pp); if (m_show_line_numbers_p) { /* Print the margin. If MARGIN_CHAR != ' ', then print up to 3 @@ -2297,9 +2302,6 @@ diagnostic_show_locus (diagnostic_context * context, context->last_location = loc; - char *saved_prefix = pp_take_prefix (context->printer); - pp_set_prefix (context->printer, NULL); - layout layout (context, richloc, diagnostic_kind); for (int line_span_idx = 0; line_span_idx < layout.get_num_line_spans (); line_span_idx++) @@ -2329,8 +2331,6 @@ diagnostic_show_locus (diagnostic_context * context, row <= last_line; row++) layout.print_line (row); } - - pp_set_prefix (context->printer, saved_prefix); } #if CHECKING_P @@ -2463,23 +2463,93 @@ test_one_liner_fixit_insert_after () pp_formatted_text (dc.printer)); } -/* Removal fix-it hint: removal of the ".field". */ +/* Removal fix-it hint: removal of the ".field". + Also verify the interaction of pp_set_prefix with rulers and + fix-it hints. */ static void test_one_liner_fixit_remove () { - test_diagnostic_context dc; location_t start = linemap_position_for_column (line_table, 10); location_t finish = linemap_position_for_column (line_table, 15); location_t dot = make_location (start, start, finish); rich_location richloc (line_table, dot); richloc.add_fixit_remove (); - diagnostic_show_locus (&dc, &richloc, DK_ERROR); - ASSERT_STREQ ("\n" - " foo = bar.field;\n" - " ^~~~~~\n" - " ------\n", - pp_formatted_text (dc.printer)); + + /* Normal. */ + { + test_diagnostic_context dc; + diagnostic_show_locus (&dc, &richloc, DK_ERROR); + ASSERT_STREQ ("\n" + " foo = bar.field;\n" + " ^~~~~~\n" + " ------\n", + pp_formatted_text (dc.printer)); + } + + /* Test of adding a prefix. */ + { + test_diagnostic_context dc; + pp_prefixing_rule (dc.printer) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + pp_set_prefix (dc.printer, xstrdup ("TEST PREFIX:")); + diagnostic_show_locus (&dc, &richloc, DK_ERROR); + ASSERT_STREQ ("\n" + "TEST PREFIX: foo = bar.field;\n" + "TEST PREFIX: ^~~~~~\n" + "TEST PREFIX: ------\n", + pp_formatted_text (dc.printer)); + } + + /* Normal, with ruler. */ + { + test_diagnostic_context dc; + dc.show_ruler_p = true; + dc.caret_max_width = 104; + diagnostic_show_locus (&dc, &richloc, DK_ERROR); + ASSERT_STREQ ("\n" + " 0 0 0 0 0 0 0 0 0 1 \n" + " 1 2 3 4 5 6 7 8 9 0 \n" + " 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234\n" + " foo = bar.field;\n" + " ^~~~~~\n" + " ------\n", + pp_formatted_text (dc.printer)); + } + + /* Test of adding a prefix, with ruler. */ + { + test_diagnostic_context dc; + dc.show_ruler_p = true; + dc.caret_max_width = 50; + pp_prefixing_rule (dc.printer) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + pp_set_prefix (dc.printer, xstrdup ("TEST PREFIX:")); + diagnostic_show_locus (&dc, &richloc, DK_ERROR); + ASSERT_STREQ ("\n" + "TEST PREFIX: 1 2 3 4 5\n" + "TEST PREFIX: 12345678901234567890123456789012345678901234567890\n" + "TEST PREFIX: foo = bar.field;\n" + "TEST PREFIX: ^~~~~~\n" + "TEST PREFIX: ------\n", + pp_formatted_text (dc.printer)); + } + + /* Test of adding a prefix, with ruler and line numbers. */ + { + test_diagnostic_context dc; + dc.show_ruler_p = true; + dc.caret_max_width = 50; + dc.show_line_numbers_p = true; + pp_prefixing_rule (dc.printer) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + pp_set_prefix (dc.printer, xstrdup ("TEST PREFIX:")); + diagnostic_show_locus (&dc, &richloc, DK_ERROR); + ASSERT_STREQ ("\n" + "TEST PREFIX: | 1 2 3 4 5\n" + "TEST PREFIX: | 12345678901234567890123456789012345678901234567890\n" + "TEST PREFIX: 1 | foo = bar.field;\n" + "TEST PREFIX: | ^~~~~~\n" + "TEST PREFIX: | ------\n", + pp_formatted_text (dc.printer)); + } } /* Replace fix-it hint: replacing "field" with "m_field". */ |