diagnostics: cleanups to diagnostic-show-locus.cc

Reduce implicit usage of line_table global, and move source printing to
within diagnostic_context.

gcc/ChangeLog:
	* diagnostic-show-locus.cc (layout::m_line_table): New field.
	(compatible_locations_p): Convert to...
	(layout::compatible_locations_p): ...this, replacing uses of
	line_table global with m_line_table.
	(layout::layout): Convert "richloc" param from a pointer to a
	const reference.  Initialize m_line_table member.
	(layout::maybe_add_location_range):  Replace uses of line_table
	global with m_line_table.  Pass the latter to
	linemap_client_expand_location_to_spelling_point.
	(layout::print_leading_fixits): Pass m_line_table to
	affects_line_p.
	(layout::print_trailing_fixits): Likewise.
	(gcc_rich_location::add_location_if_nearby): Update for change
	to layout ctor params.
	(diagnostic_show_locus): Convert to...
	(diagnostic_context::maybe_show_locus): ...this, converting
	richloc param from a pointer to a const reference.  Make "loc"
	const.  Split out printing part of function to...
	(diagnostic_context::show_locus): ...this.
	(selftest::test_offset_impl): Update for change to layout ctor
	params.
	(selftest::test_layout_x_offset_display_utf8): Likewise.
	(selftest::test_layout_x_offset_display_tab): Likewise.
	(selftest::test_tab_expansion): Likewise.
	* diagnostic.h (diagnostic_context::maybe_show_locus): New decl.
	(diagnostic_context::show_locus): New decl.
	(diagnostic_show_locus): Convert from a decl to an inline function.
	* gdbinit.in (break-on-diagnostic): Update from a breakpoint
	on diagnostic_show_locus to one on
	diagnostic_context::maybe_show_locus.
	* genmatch.cc (linemap_client_expand_location_to_spelling_point):
	Add "set" param and use it in place of line_table global.
	* input.cc (expand_location_1): Likewise.
	(expand_location): Update for new param of expand_location_1.
	(expand_location_to_spelling_point): Likewise.
	(linemap_client_expand_location_to_spelling_point): Add "set"
	param and use it in place of line_table global.
	* tree-diagnostic-path.cc (event_range::print): Pass line_table
	for new param of linemap_client_expand_location_to_spelling_point.

libcpp/ChangeLog:
	* include/line-map.h (rich_location::get_expanded_location): Make
	const.
	(rich_location::get_line_table): New accessor.
	(rich_location::m_line_table): Make the pointer be const.
	(rich_location::m_have_expanded_location): Make mutable.
	(rich_location::m_expanded_location): Likewise.
	(fixit_hint::affects_line_p): Add const line_maps * param.
	(linemap_client_expand_location_to_spelling_point): Likewise.
	* line-map.cc (rich_location::get_expanded_location): Make const.
	Pass m_line_table to
	linemap_client_expand_location_to_spelling_point.
	(rich_location::maybe_add_fixit): Likewise.
	(fixit_hint::affects_line_p): Add set param and pass to
	linemap_client_expand_location_to_spelling_point.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
This commit is contained in:
David Malcolm 2023-11-09 17:22:52 -05:00
parent 0c6c9b6454
commit 8625aa2466
8 changed files with 129 additions and 87 deletions

View File

@ -366,7 +366,7 @@ class layout
{ {
public: public:
layout (const diagnostic_context &context, layout (const diagnostic_context &context,
rich_location *richloc, const rich_location &richloc,
diagnostic_t diagnostic_kind, diagnostic_t diagnostic_kind,
pretty_printer *pp); pretty_printer *pp);
@ -428,7 +428,10 @@ class layout
move_to_column (int *column, int dest_column, bool add_left_margin); move_to_column (int *column, int dest_column, bool add_left_margin);
private: private:
bool compatible_locations_p (location_t loc_a, location_t loc_b) const;
const diagnostic_source_printing_options &m_options; const diagnostic_source_printing_options &m_options;
const line_maps *m_line_table;
pretty_printer *m_pp; pretty_printer *m_pp;
char_display_policy m_policy; char_display_policy m_policy;
location_t m_primary_loc; location_t m_primary_loc;
@ -930,13 +933,13 @@ test_get_line_bytes_without_trailing_whitespace ()
erroneously was leading to hundreds of lines of irrelevant source erroneously was leading to hundreds of lines of irrelevant source
being printed. */ being printed. */
static bool bool
compatible_locations_p (location_t loc_a, location_t loc_b) layout::compatible_locations_p (location_t loc_a, location_t loc_b) const
{ {
if (IS_ADHOC_LOC (loc_a)) if (IS_ADHOC_LOC (loc_a))
loc_a = get_location_from_adhoc_loc (line_table, loc_a); loc_a = get_location_from_adhoc_loc (m_line_table, loc_a);
if (IS_ADHOC_LOC (loc_b)) if (IS_ADHOC_LOC (loc_b))
loc_b = get_location_from_adhoc_loc (line_table, loc_b); loc_b = get_location_from_adhoc_loc (m_line_table, loc_b);
/* If either location is one of the special locations outside of a /* If either location is one of the special locations outside of a
linemap, they are only compatible if they are equal. */ linemap, they are only compatible if they are equal. */
@ -944,10 +947,10 @@ compatible_locations_p (location_t loc_a, location_t loc_b)
|| loc_b < RESERVED_LOCATION_COUNT) || loc_b < RESERVED_LOCATION_COUNT)
return loc_a == loc_b; return loc_a == loc_b;
const line_map *map_a = linemap_lookup (line_table, loc_a); const line_map *map_a = linemap_lookup (m_line_table, loc_a);
linemap_assert (map_a); linemap_assert (map_a);
const line_map *map_b = linemap_lookup (line_table, loc_b); const line_map *map_b = linemap_lookup (m_line_table, loc_b);
linemap_assert (map_b); linemap_assert (map_b);
/* Are they within the same map? */ /* Are they within the same map? */
@ -959,9 +962,9 @@ compatible_locations_p (location_t loc_a, location_t loc_b)
/* If so, then they're only compatible if either both are /* If so, then they're only compatible if either both are
from the macro definition, or both from the macro arguments. */ from the macro definition, or both from the macro arguments. */
bool loc_a_from_defn bool loc_a_from_defn
= linemap_location_from_macro_definition_p (line_table, loc_a); = linemap_location_from_macro_definition_p (m_line_table, loc_a);
bool loc_b_from_defn bool loc_b_from_defn
= linemap_location_from_macro_definition_p (line_table, loc_b); = linemap_location_from_macro_definition_p (m_line_table, loc_b);
if (loc_a_from_defn != loc_b_from_defn) if (loc_a_from_defn != loc_b_from_defn)
return false; return false;
@ -969,11 +972,11 @@ compatible_locations_p (location_t loc_a, location_t loc_b)
recurse. */ recurse. */
const line_map_macro *macro_map = linemap_check_macro (map_a); const line_map_macro *macro_map = linemap_check_macro (map_a);
location_t loc_a_toward_spelling location_t loc_a_toward_spelling
= linemap_macro_map_loc_unwind_toward_spelling (line_table, = linemap_macro_map_loc_unwind_toward_spelling (m_line_table,
macro_map, macro_map,
loc_a); loc_a);
location_t loc_b_toward_spelling location_t loc_b_toward_spelling
= linemap_macro_map_loc_unwind_toward_spelling (line_table, = linemap_macro_map_loc_unwind_toward_spelling (m_line_table,
macro_map, macro_map,
loc_b); loc_b);
return compatible_locations_p (loc_a_toward_spelling, return compatible_locations_p (loc_a_toward_spelling,
@ -1180,37 +1183,38 @@ make_policy (const diagnostic_context &dc,
will fit within the max_width provided by the diagnostic_context. */ will fit within the max_width provided by the diagnostic_context. */
layout::layout (const diagnostic_context &context, layout::layout (const diagnostic_context &context,
rich_location *richloc, const rich_location &richloc,
diagnostic_t diagnostic_kind, diagnostic_t diagnostic_kind,
pretty_printer *pp) pretty_printer *pp)
: m_options (context.m_source_printing), : m_options (context.m_source_printing),
m_line_table (richloc.get_line_table ()),
m_pp (pp ? pp : context.printer), m_pp (pp ? pp : context.printer),
m_policy (make_policy (context, *richloc)), m_policy (make_policy (context, richloc)),
m_primary_loc (richloc->get_range (0)->m_loc), m_primary_loc (richloc.get_range (0)->m_loc),
m_exploc (richloc->get_expanded_location (0), m_policy, m_exploc (richloc.get_expanded_location (0), m_policy,
LOCATION_ASPECT_CARET), LOCATION_ASPECT_CARET),
m_colorizer (m_pp, diagnostic_kind), m_colorizer (m_pp, diagnostic_kind),
m_diagnostic_path_p (diagnostic_kind == DK_DIAGNOSTIC_PATH), m_diagnostic_path_p (diagnostic_kind == DK_DIAGNOSTIC_PATH),
m_layout_ranges (richloc->get_num_locations ()), m_layout_ranges (richloc.get_num_locations ()),
m_fixit_hints (richloc->get_num_fixit_hints ()), m_fixit_hints (richloc.get_num_fixit_hints ()),
m_line_spans (1 + richloc->get_num_locations ()), m_line_spans (1 + richloc.get_num_locations ()),
m_linenum_width (0), m_linenum_width (0),
m_x_offset_display (0), m_x_offset_display (0),
m_escape_on_output (richloc->escape_on_output_p ()) m_escape_on_output (richloc.escape_on_output_p ())
{ {
for (unsigned int idx = 0; idx < richloc->get_num_locations (); idx++) for (unsigned int idx = 0; idx < richloc.get_num_locations (); idx++)
{ {
/* This diagnostic printer can only cope with "sufficiently sane" ranges. /* This diagnostic printer can only cope with "sufficiently sane" ranges.
Ignore any ranges that are awkward to handle. */ Ignore any ranges that are awkward to handle. */
const location_range *loc_range = richloc->get_range (idx); const location_range *loc_range = richloc.get_range (idx);
maybe_add_location_range (loc_range, idx, false); maybe_add_location_range (loc_range, idx, false);
} }
/* Populate m_fixit_hints, filtering to only those that are in the /* Populate m_fixit_hints, filtering to only those that are in the
same file. */ same file. */
for (unsigned int i = 0; i < richloc->get_num_fixit_hints (); i++) for (unsigned int i = 0; i < richloc.get_num_fixit_hints (); i++)
{ {
const fixit_hint *hint = richloc->get_fixit_hint (i); const fixit_hint *hint = richloc.get_fixit_hint (i);
if (validate_fixit_hint_p (hint)) if (validate_fixit_hint_p (hint))
m_fixit_hints.safe_push (hint); m_fixit_hints.safe_push (hint);
} }
@ -1249,18 +1253,18 @@ layout::maybe_add_location_range (const location_range *loc_range,
gcc_assert (loc_range); gcc_assert (loc_range);
/* Split the "range" into caret and range information. */ /* Split the "range" into caret and range information. */
source_range src_range = get_range_from_loc (line_table, loc_range->m_loc); source_range src_range = get_range_from_loc (m_line_table, loc_range->m_loc);
/* Expand the various locations. */ /* Expand the various locations. */
expanded_location start expanded_location start
= linemap_client_expand_location_to_spelling_point = linemap_client_expand_location_to_spelling_point
(src_range.m_start, LOCATION_ASPECT_START); (m_line_table, src_range.m_start, LOCATION_ASPECT_START);
expanded_location finish expanded_location finish
= linemap_client_expand_location_to_spelling_point = linemap_client_expand_location_to_spelling_point
(src_range.m_finish, LOCATION_ASPECT_FINISH); (m_line_table, src_range.m_finish, LOCATION_ASPECT_FINISH);
expanded_location caret expanded_location caret
= linemap_client_expand_location_to_spelling_point = linemap_client_expand_location_to_spelling_point
(loc_range->m_loc, LOCATION_ASPECT_CARET); (m_line_table, loc_range->m_loc, LOCATION_ASPECT_CARET);
/* If any part of the range isn't in the same file as the primary /* If any part of the range isn't in the same file as the primary
location of this diagnostic, ignore the range. */ location of this diagnostic, ignore the range. */
@ -2098,7 +2102,7 @@ layout::print_leading_fixits (linenum_type row)
gcc_assert (hint->insertion_p ()); gcc_assert (hint->insertion_p ());
if (hint->affects_line_p (m_exploc.file, row)) if (hint->affects_line_p (m_line_table, m_exploc.file, row))
{ {
/* Printing the '+' with normal colorization /* Printing the '+' with normal colorization
and the inserted line with "insert" colorization and the inserted line with "insert" colorization
@ -2550,7 +2554,7 @@ layout::print_trailing_fixits (linenum_type row)
if (hint->ends_with_newline_p ()) if (hint->ends_with_newline_p ())
continue; continue;
if (hint->affects_line_p (m_exploc.file, row)) if (hint->affects_line_p (m_line_table, m_exploc.file, row))
corrections.add_hint (hint); corrections.add_hint (hint);
} }
@ -2808,7 +2812,7 @@ gcc_rich_location::add_location_if_nearby (location_t loc,
/* Use the layout location-handling logic to sanitize LOC, /* Use the layout location-handling logic to sanitize LOC,
filtering it to the current line spans within a temporary filtering it to the current line spans within a temporary
layout instance. */ layout instance. */
layout layout (*global_dc, this, DK_ERROR, nullptr); layout layout (*global_dc, *this, DK_ERROR, nullptr);
location_range loc_range; location_range loc_range;
loc_range.m_loc = loc; loc_range.m_loc = loc;
loc_range.m_range_display_kind = SHOW_RANGE_WITHOUT_CARET; loc_range.m_range_display_kind = SHOW_RANGE_WITHOUT_CARET;
@ -2820,19 +2824,17 @@ gcc_rich_location::add_location_if_nearby (location_t loc,
return true; return true;
} }
/* Print the physical source code corresponding to the location of /* As per diagnostic_context::show_locus, but don't print anything
this diagnostic, with additional annotations. if source printing is disabled, or if the location hasn't changed. */
If PP is non-null, then use it rather than CONTEXT's printer. */
void void
diagnostic_show_locus (diagnostic_context * context, diagnostic_context::maybe_show_locus (const rich_location &richloc,
rich_location *richloc,
diagnostic_t diagnostic_kind, diagnostic_t diagnostic_kind,
pretty_printer *pp) pretty_printer *pp)
{ {
location_t loc = richloc->get_loc (); const location_t loc = richloc.get_loc ();
/* Do nothing if source-printing has been disabled. */ /* Do nothing if source-printing has been disabled. */
if (!context->m_source_printing.enabled) if (!m_source_printing.enabled)
return; return;
/* Don't attempt to print source for UNKNOWN_LOCATION and for builtins. */ /* Don't attempt to print source for UNKNOWN_LOCATION and for builtins. */
@ -2841,20 +2843,32 @@ diagnostic_show_locus (diagnostic_context * context,
/* Don't print the same source location twice in a row, unless we have /* Don't print the same source location twice in a row, unless we have
fix-it hints, or multiple locations, or a label. */ fix-it hints, or multiple locations, or a label. */
if (loc == context->m_last_location if (loc == m_last_location
&& richloc->get_num_fixit_hints () == 0 && richloc.get_num_fixit_hints () == 0
&& richloc->get_num_locations () == 1 && richloc.get_num_locations () == 1
&& richloc->get_range (0)->m_label == NULL) && richloc.get_range (0)->m_label == NULL)
return; return;
context->m_last_location = loc; m_last_location = loc;
layout layout (*context, richloc, diagnostic_kind, pp); show_locus (richloc, diagnostic_kind, pp);
}
/* Print the physical source code corresponding to the location of
this diagnostic, with additional annotations.
If PP is non-null, then use it rather than this context's printer. */
void
diagnostic_context::show_locus (const rich_location &richloc,
diagnostic_t diagnostic_kind,
pretty_printer *pp)
{
layout layout (*this, richloc, diagnostic_kind, pp);
for (int line_span_idx = 0; line_span_idx < layout.get_num_line_spans (); for (int line_span_idx = 0; line_span_idx < layout.get_num_line_spans ();
line_span_idx++) line_span_idx++)
{ {
const line_span *line_span = layout.get_line_span (line_span_idx); const line_span *line_span = layout.get_line_span (line_span_idx);
if (context->m_source_printing.show_line_numbers_p) if (m_source_printing.show_line_numbers_p)
{ {
/* With line numbers, we should show whenever the line-numbering /* With line numbers, we should show whenever the line-numbering
"jumps". */ "jumps". */
@ -2868,7 +2882,7 @@ diagnostic_show_locus (diagnostic_context * context,
{ {
expanded_location exploc expanded_location exploc
= layout.get_expanded_location (line_span); = layout.get_expanded_location (line_span);
context->m_text_callbacks.start_span (context, exploc); m_text_callbacks.start_span (this, exploc);
} }
} }
/* Iterate over the lines within this span (using linenum_arith_t to /* Iterate over the lines within this span (using linenum_arith_t to
@ -2961,7 +2975,7 @@ test_offset_impl (int caret_byte_col, int max_width,
rich_location richloc (line_table, rich_location richloc (line_table,
linemap_position_for_column (line_table, linemap_position_for_column (line_table,
caret_byte_col)); caret_byte_col));
layout test_layout (dc, &richloc, DK_ERROR, nullptr); layout test_layout (dc, richloc, DK_ERROR, nullptr);
ASSERT_EQ (left_margin - test_linenum_sep, ASSERT_EQ (left_margin - test_linenum_sep,
test_layout.get_linenum_width ()); test_layout.get_linenum_width ());
ASSERT_EQ (expected_x_offset_display, ASSERT_EQ (expected_x_offset_display,
@ -3076,7 +3090,7 @@ test_layout_x_offset_display_utf8 (const line_table_case &case_)
rich_location richloc (line_table, rich_location richloc (line_table,
linemap_position_for_column (line_table, linemap_position_for_column (line_table,
emoji_col)); emoji_col));
layout test_layout (dc, &richloc, DK_ERROR, nullptr); layout test_layout (dc, richloc, DK_ERROR, nullptr);
test_layout.print_line (1); test_layout.print_line (1);
ASSERT_STREQ (" | 1 \n" ASSERT_STREQ (" | 1 \n"
" | 1 \n" " | 1 \n"
@ -3101,7 +3115,7 @@ test_layout_x_offset_display_utf8 (const line_table_case &case_)
rich_location richloc (line_table, rich_location richloc (line_table,
linemap_position_for_column (line_table, linemap_position_for_column (line_table,
emoji_col + 2)); emoji_col + 2));
layout test_layout (dc, &richloc, DK_ERROR, nullptr); layout test_layout (dc, richloc, DK_ERROR, nullptr);
test_layout.print_line (1); test_layout.print_line (1);
ASSERT_STREQ (" | 1 1 \n" ASSERT_STREQ (" | 1 1 \n"
" | 1 2 \n" " | 1 2 \n"
@ -3178,7 +3192,7 @@ test_layout_x_offset_display_tab (const line_table_case &case_)
{ {
test_diagnostic_context dc; test_diagnostic_context dc;
dc.m_tabstop = tabstop; dc.m_tabstop = tabstop;
layout test_layout (dc, &richloc, DK_ERROR, nullptr); layout test_layout (dc, richloc, DK_ERROR, nullptr);
test_layout.print_line (1); test_layout.print_line (1);
const char *out = pp_formatted_text (dc.printer); const char *out = pp_formatted_text (dc.printer);
ASSERT_EQ (NULL, strchr (out, '\t')); ASSERT_EQ (NULL, strchr (out, '\t'));
@ -3201,7 +3215,7 @@ test_layout_x_offset_display_tab (const line_table_case &case_)
dc.m_source_printing.min_margin_width dc.m_source_printing.min_margin_width
= test_left_margin - test_linenum_sep + 1; = test_left_margin - test_linenum_sep + 1;
dc.m_source_printing.show_line_numbers_p = true; dc.m_source_printing.show_line_numbers_p = true;
layout test_layout (dc, &richloc, DK_ERROR, nullptr); layout test_layout (dc, richloc, DK_ERROR, nullptr);
test_layout.print_line (1); test_layout.print_line (1);
/* We have arranged things so that two columns will be printed before /* We have arranged things so that two columns will be printed before
@ -5513,7 +5527,7 @@ test_tab_expansion (const line_table_case &case_)
rich_location richloc (line_table, rich_location richloc (line_table,
linemap_position_for_column (line_table, linemap_position_for_column (line_table,
first_non_ws_byte_col)); first_non_ws_byte_col));
layout test_layout (dc, &richloc, DK_ERROR, nullptr); layout test_layout (dc, richloc, DK_ERROR, nullptr);
test_layout.print_line (1); test_layout.print_line (1);
ASSERT_STREQ (" This: ` ' is a tab.\n" ASSERT_STREQ (" This: ` ' is a tab.\n"
" ^\n", " ^\n",
@ -5528,7 +5542,7 @@ test_tab_expansion (const line_table_case &case_)
rich_location richloc (line_table, rich_location richloc (line_table,
linemap_position_for_column (line_table, linemap_position_for_column (line_table,
right_quote_byte_col)); right_quote_byte_col));
layout test_layout (dc, &richloc, DK_ERROR, nullptr); layout test_layout (dc, richloc, DK_ERROR, nullptr);
test_layout.print_line (1); test_layout.print_line (1);
ASSERT_STREQ (" This: ` ' is a tab.\n" ASSERT_STREQ (" This: ` ' is a tab.\n"
" ^\n", " ^\n",

View File

@ -410,6 +410,10 @@ public:
m_option_classifier.pop (where); m_option_classifier.pop (where);
} }
void maybe_show_locus (const rich_location &richloc,
diagnostic_t diagnostic_kind,
pretty_printer *pp);
void emit_diagram (const diagnostic_diagram &diagram); void emit_diagram (const diagnostic_diagram &diagram);
/* Various setters for use by option-handling logic. */ /* Various setters for use by option-handling logic. */
@ -496,6 +500,10 @@ private:
void get_any_inlining_info (diagnostic_info *diagnostic); void get_any_inlining_info (diagnostic_info *diagnostic);
void show_locus (const rich_location &richloc,
diagnostic_t diagnostic_kind,
pretty_printer *pp);
/* Data members. /* Data members.
Ideally, all of these would be private and have "m_" prefixes. */ Ideally, all of these would be private and have "m_" prefixes. */
@ -816,10 +824,15 @@ diagnostic_report_current_module (diagnostic_context *context,
context->report_current_module (where); context->report_current_module (where);
} }
extern void diagnostic_show_locus (diagnostic_context *, inline void
diagnostic_show_locus (diagnostic_context *context,
rich_location *richloc, rich_location *richloc,
diagnostic_t diagnostic_kind, diagnostic_t diagnostic_kind,
pretty_printer *pp = nullptr); pretty_printer *pp = nullptr)
{
gcc_assert (richloc);
context->maybe_show_locus (*richloc, diagnostic_kind, pp);
}
/* Because we read source files a second time after the frontend did it the /* Because we read source files a second time after the frontend did it the
first time, we need to know how the frontend handled things like character first time, we need to know how the frontend handled things like character

View File

@ -293,7 +293,7 @@ See also 'help-gcc-hooks'.
end end
define break-on-diagnostic define break-on-diagnostic
break diagnostic_show_locus break diagnostic_context::maybe_show_locus
end end
document break-on-diagnostic document break-on-diagnostic

View File

@ -62,12 +62,13 @@ static class line_maps *line_table;
This is the implementation for genmatch. */ This is the implementation for genmatch. */
expanded_location expanded_location
linemap_client_expand_location_to_spelling_point (location_t loc, linemap_client_expand_location_to_spelling_point (const line_maps *set,
location_t loc,
enum location_aspect) enum location_aspect)
{ {
const struct line_map_ordinary *map; const struct line_map_ordinary *map;
loc = linemap_resolve_location (line_table, loc, LRK_SPELLING_LOCATION, &map); loc = linemap_resolve_location (set, loc, LRK_SPELLING_LOCATION, &map);
return linemap_expand_location (line_table, map, loc); return linemap_expand_location (set, map, loc);
} }
static bool static bool

View File

@ -215,7 +215,8 @@ class line_maps *saved_line_table;
ASPECT controls which part of the location to use. */ ASPECT controls which part of the location to use. */
static expanded_location static expanded_location
expand_location_1 (location_t loc, expand_location_1 (const line_maps *set,
location_t loc,
bool expansion_point_p, bool expansion_point_p,
enum location_aspect aspect) enum location_aspect aspect)
{ {
@ -243,11 +244,11 @@ expand_location_1 (location_t loc,
location for a built-in token), let's consider the first location for a built-in token), let's consider the first
location (toward the expansion point) that is not reserved; location (toward the expansion point) that is not reserved;
that is, the first location that is in real source code. */ that is, the first location that is in real source code. */
loc = linemap_unwind_to_first_non_reserved_loc (line_table, loc = linemap_unwind_to_first_non_reserved_loc (set,
loc, NULL); loc, NULL);
lrk = LRK_SPELLING_LOCATION; lrk = LRK_SPELLING_LOCATION;
} }
loc = linemap_resolve_location (line_table, loc, lrk, &map); loc = linemap_resolve_location (set, loc, lrk, &map);
/* loc is now either in an ordinary map, or is a reserved location. /* loc is now either in an ordinary map, or is a reserved location.
If it is a compound location, the caret is in a spelling location, If it is a compound location, the caret is in a spelling location,
@ -266,18 +267,18 @@ expand_location_1 (location_t loc,
{ {
location_t start = get_start (loc); location_t start = get_start (loc);
if (start != loc) if (start != loc)
return expand_location_1 (start, expansion_point_p, aspect); return expand_location_1 (set, start, expansion_point_p, aspect);
} }
break; break;
case LOCATION_ASPECT_FINISH: case LOCATION_ASPECT_FINISH:
{ {
location_t finish = get_finish (loc); location_t finish = get_finish (loc);
if (finish != loc) if (finish != loc)
return expand_location_1 (finish, expansion_point_p, aspect); return expand_location_1 (set, finish, expansion_point_p, aspect);
} }
break; break;
} }
xloc = linemap_expand_location (line_table, map, loc); xloc = linemap_expand_location (set, map, loc);
} }
xloc.data = block; xloc.data = block;
@ -1127,7 +1128,7 @@ is_location_from_builtin_token (location_t loc)
expanded_location expanded_location
expand_location (location_t loc) expand_location (location_t loc)
{ {
return expand_location_1 (loc, /*expansion_point_p=*/true, return expand_location_1 (line_table, loc, /*expansion_point_p=*/true,
LOCATION_ASPECT_CARET); LOCATION_ASPECT_CARET);
} }
@ -1141,7 +1142,8 @@ expanded_location
expand_location_to_spelling_point (location_t loc, expand_location_to_spelling_point (location_t loc,
enum location_aspect aspect) enum location_aspect aspect)
{ {
return expand_location_1 (loc, /*expansion_point_p=*/false, aspect); return expand_location_1 (line_table, loc, /*expansion_point_p=*/false,
aspect);
} }
/* The rich_location class within libcpp requires a way to expand /* The rich_location class within libcpp requires a way to expand
@ -1154,10 +1156,11 @@ expand_location_to_spelling_point (location_t loc,
which simply calls into expand_location_1. */ which simply calls into expand_location_1. */
expanded_location expanded_location
linemap_client_expand_location_to_spelling_point (location_t loc, linemap_client_expand_location_to_spelling_point (const line_maps *set,
location_t loc,
enum location_aspect aspect) enum location_aspect aspect)
{ {
return expand_location_1 (loc, /*expansion_point_p=*/false, aspect); return expand_location_1 (set, loc, /*expansion_point_p=*/false, aspect);
} }

View File

@ -204,7 +204,7 @@ struct event_range
{ {
expanded_location exploc expanded_location exploc
= linemap_client_expand_location_to_spelling_point = linemap_client_expand_location_to_spelling_point
(initial_loc, LOCATION_ASPECT_CARET); (line_table, initial_loc, LOCATION_ASPECT_CARET);
if (exploc.file != LOCATION_FILE (dc->m_last_location)) if (exploc.file != LOCATION_FILE (dc->m_last_location))
dc->m_text_callbacks.start_span (dc, exploc); dc->m_text_callbacks.start_span (dc, exploc);
} }

View File

@ -1658,7 +1658,7 @@ class rich_location
const location_range *get_range (unsigned int idx) const; const location_range *get_range (unsigned int idx) const;
location_range *get_range (unsigned int idx); location_range *get_range (unsigned int idx);
expanded_location get_expanded_location (unsigned int idx); expanded_location get_expanded_location (unsigned int idx) const;
void void
override_column (int column); override_column (int column);
@ -1762,6 +1762,8 @@ class rich_location
bool escape_on_output_p () const { return m_escape_on_output; } bool escape_on_output_p () const { return m_escape_on_output; }
void set_escape_on_output (bool flag) { m_escape_on_output = flag; } void set_escape_on_output (bool flag) { m_escape_on_output = flag; }
const line_maps *get_line_table () const { return m_line_table; }
private: private:
bool reject_impossible_fixit (location_t where); bool reject_impossible_fixit (location_t where);
void stop_supporting_fixits (); void stop_supporting_fixits ();
@ -1773,17 +1775,17 @@ public:
static const int STATICALLY_ALLOCATED_RANGES = 3; static const int STATICALLY_ALLOCATED_RANGES = 3;
protected: protected:
line_maps *m_line_table; line_maps * const m_line_table;
semi_embedded_vec <location_range, STATICALLY_ALLOCATED_RANGES> m_ranges; semi_embedded_vec <location_range, STATICALLY_ALLOCATED_RANGES> m_ranges;
int m_column_override; int m_column_override;
bool m_have_expanded_location; mutable bool m_have_expanded_location;
bool m_seen_impossible_fixit; bool m_seen_impossible_fixit;
bool m_fixits_cannot_be_auto_applied; bool m_fixits_cannot_be_auto_applied;
bool m_escape_on_output; bool m_escape_on_output;
expanded_location m_expanded_location; mutable expanded_location m_expanded_location;
static const int MAX_STATIC_FIXIT_HINTS = 2; static const int MAX_STATIC_FIXIT_HINTS = 2;
semi_embedded_vec <fixit_hint *, MAX_STATIC_FIXIT_HINTS> m_fixit_hints; semi_embedded_vec <fixit_hint *, MAX_STATIC_FIXIT_HINTS> m_fixit_hints;
@ -1916,7 +1918,9 @@ class fixit_hint
const char *new_content); const char *new_content);
~fixit_hint () { free (m_bytes); } ~fixit_hint () { free (m_bytes); }
bool affects_line_p (const char *file, int line) const; bool affects_line_p (const line_maps *set,
const char *file,
int line) const;
location_t get_start_loc () const { return m_start; } location_t get_start_loc () const { return m_start; }
location_t get_next_loc () const { return m_next_loc; } location_t get_next_loc () const { return m_next_loc; }
bool maybe_append (location_t start, bool maybe_append (location_t start,
@ -2103,7 +2107,8 @@ enum location_aspect
Hence we require client code of libcpp to implement the following Hence we require client code of libcpp to implement the following
symbol. */ symbol. */
extern expanded_location extern expanded_location
linemap_client_expand_location_to_spelling_point (location_t, linemap_client_expand_location_to_spelling_point (const line_maps *,
location_t,
enum location_aspect); enum location_aspect);
#endif /* !LIBCPP_LINE_MAP_H */ #endif /* !LIBCPP_LINE_MAP_H */

View File

@ -2212,7 +2212,7 @@ rich_location::get_range (unsigned int idx)
location. */ location. */
expanded_location expanded_location
rich_location::get_expanded_location (unsigned int idx) rich_location::get_expanded_location (unsigned int idx) const
{ {
if (idx == 0) if (idx == 0)
{ {
@ -2221,7 +2221,7 @@ rich_location::get_expanded_location (unsigned int idx)
{ {
m_expanded_location m_expanded_location
= linemap_client_expand_location_to_spelling_point = linemap_client_expand_location_to_spelling_point
(get_loc (0), LOCATION_ASPECT_CARET); (m_line_table, get_loc (0), LOCATION_ASPECT_CARET);
if (m_column_override) if (m_column_override)
m_expanded_location.column = m_column_override; m_expanded_location.column = m_column_override;
m_have_expanded_location = true; m_have_expanded_location = true;
@ -2231,7 +2231,7 @@ rich_location::get_expanded_location (unsigned int idx)
} }
else else
return linemap_client_expand_location_to_spelling_point return linemap_client_expand_location_to_spelling_point
(get_loc (idx), LOCATION_ASPECT_CARET); (m_line_table, get_loc (idx), LOCATION_ASPECT_CARET);
} }
/* Set the column of the primary location, with 0 meaning /* Set the column of the primary location, with 0 meaning
@ -2490,10 +2490,12 @@ rich_location::maybe_add_fixit (location_t start,
/* Only allow fix-it hints that affect a single line in one file. /* Only allow fix-it hints that affect a single line in one file.
Compare the end-points. */ Compare the end-points. */
expanded_location exploc_start expanded_location exploc_start
= linemap_client_expand_location_to_spelling_point (start, = linemap_client_expand_location_to_spelling_point (m_line_table,
start,
LOCATION_ASPECT_START); LOCATION_ASPECT_START);
expanded_location exploc_next_loc expanded_location exploc_next_loc
= linemap_client_expand_location_to_spelling_point (next_loc, = linemap_client_expand_location_to_spelling_point (m_line_table,
next_loc,
LOCATION_ASPECT_START); LOCATION_ASPECT_START);
/* They must be within the same file... */ /* They must be within the same file... */
if (exploc_start.file != exploc_next_loc.file) if (exploc_start.file != exploc_next_loc.file)
@ -2581,17 +2583,21 @@ fixit_hint::fixit_hint (location_t start,
/* Does this fix-it hint affect the given line? */ /* Does this fix-it hint affect the given line? */
bool bool
fixit_hint::affects_line_p (const char *file, int line) const fixit_hint::affects_line_p (const line_maps *set,
const char *file,
int line) const
{ {
expanded_location exploc_start expanded_location exploc_start
= linemap_client_expand_location_to_spelling_point (m_start, = linemap_client_expand_location_to_spelling_point (set,
m_start,
LOCATION_ASPECT_START); LOCATION_ASPECT_START);
if (file != exploc_start.file) if (file != exploc_start.file)
return false; return false;
if (line < exploc_start.line) if (line < exploc_start.line)
return false; return false;
expanded_location exploc_next_loc expanded_location exploc_next_loc
= linemap_client_expand_location_to_spelling_point (m_next_loc, = linemap_client_expand_location_to_spelling_point (set,
m_next_loc,
LOCATION_ASPECT_START); LOCATION_ASPECT_START);
if (file != exploc_next_loc.file) if (file != exploc_next_loc.file)
return false; return false;