aboutsummaryrefslogtreecommitdiff
path: root/libcpp/line-map.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcpp/line-map.c')
-rw-r--r--libcpp/line-map.c218
1 files changed, 67 insertions, 151 deletions
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index 949489e..176e58d 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -881,8 +881,7 @@ linemap_position_for_loc_and_offset (struct line_maps *set,
loc = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
/* This function does not support virtual locations yet. */
- if (linemap_assert_fails
- (!linemap_location_from_macro_expansion_p (set, loc)))
+ if (linemap_location_from_macro_expansion_p (set, loc))
return loc;
if (column_offset == 0
@@ -2003,28 +2002,6 @@ line_table_dump (FILE *stream, struct line_maps *set, unsigned int num_ordinary,
}
}
-/* struct source_range. */
-
-/* Is there any part of this range on the given line? */
-
-bool
-source_range::intersects_line_p (const char *file, int line) const
-{
- expanded_location exploc_start
- = linemap_client_expand_location_to_spelling_point (m_start);
- if (file != exploc_start.file)
- return false;
- if (line < exploc_start.line)
- return false;
- expanded_location exploc_finish
- = linemap_client_expand_location_to_spelling_point (m_finish);
- if (file != exploc_finish.file)
- return false;
- if (line > exploc_finish.line)
- return false;
- return true;
-}
-
/* class rich_location. */
/* Construct a rich_location with location LOC as its initial range. */
@@ -2173,16 +2150,7 @@ rich_location::add_fixit_insert_before (source_location where,
const char *new_content)
{
source_location start = get_range_from_loc (m_line_table, where).m_start;
-
- if (reject_impossible_fixit (start))
- return;
- /* We do not yet support newlines within fix-it hints. */
- if (strchr (new_content, '\n'))
- {
- stop_supporting_fixits ();
- return;
- }
- add_fixit (new fixit_insert (start, new_content));
+ maybe_add_fixit (start, start, new_content);
}
/* Add a fixit-hint, suggesting insertion of NEW_CONTENT
@@ -2202,10 +2170,6 @@ rich_location::add_fixit_insert_after (source_location where,
const char *new_content)
{
source_location finish = get_range_from_loc (m_line_table, where).m_finish;
-
- if (reject_impossible_fixit (finish))
- return;
-
source_location next_loc
= linemap_position_for_loc_and_offset (m_line_table, finish, 1);
@@ -2217,7 +2181,7 @@ rich_location::add_fixit_insert_after (source_location where,
return;
}
- add_fixit (new fixit_insert (next_loc, new_content));
+ maybe_add_fixit (next_loc, next_loc, new_content);
}
/* Methods for adding removal fix-it hints. */
@@ -2250,44 +2214,6 @@ rich_location::add_fixit_remove (source_range src_range)
add_fixit_replace (src_range, "");
}
-/* Return true iff A is in the column directly before B, on the
- same line of the same source file. */
-
-static bool
-column_before_p (line_maps *set, source_location a, source_location b)
-{
- if (IS_ADHOC_LOC (a))
- a = get_location_from_adhoc_loc (set, a);
- if (IS_ADHOC_LOC (b))
- b = get_location_from_adhoc_loc (set, b);
-
- /* They must both be in ordinary maps. */
- const struct line_map *linemap_a = linemap_lookup (set, a);
- if (linemap_macro_expansion_map_p (linemap_a))
- return false;
- const struct line_map *linemap_b = linemap_lookup (set, b);
- if (linemap_macro_expansion_map_p (linemap_b))
- return false;
-
- /* To be on the same line, they must be in the same ordinary map. */
- if (linemap_a != linemap_b)
- return false;
-
- linenum_type line_a
- = SOURCE_LINE (linemap_check_ordinary (linemap_a), a);
- linenum_type line_b
- = SOURCE_LINE (linemap_check_ordinary (linemap_b), b);
- if (line_a != line_b)
- return false;
-
- linenum_type column_a
- = SOURCE_COLUMN (linemap_check_ordinary (linemap_a), a);
- linenum_type column_b
- = SOURCE_COLUMN (linemap_check_ordinary (linemap_b), b);
-
- return column_b == column_a + 1;
-}
-
/* Add a fixit-hint, suggesting replacement of the content covered
by range 0 with NEW_CONTENT. */
@@ -2317,28 +2243,22 @@ void
rich_location::add_fixit_replace (source_range src_range,
const char *new_content)
{
- src_range.m_start = get_pure_location (m_line_table, src_range.m_start);
- src_range.m_finish = get_pure_location (m_line_table, src_range.m_finish);
-
- if (reject_impossible_fixit (src_range.m_start))
- return;
- if (reject_impossible_fixit (src_range.m_finish))
- return;
+ source_location start = get_pure_location (m_line_table, src_range.m_start);
+ source_location finish = get_pure_location (m_line_table, src_range.m_finish);
- /* We do not yet support newlines within fix-it hints. */
- if (strchr (new_content, '\n'))
+ /* Fix-it hints use half-closed ranges, so attempt to offset the endpoint. */
+ source_location next_loc
+ = linemap_position_for_loc_and_offset (m_line_table, finish, 1);
+ /* linemap_position_for_loc_and_offset can fail, if so, it returns
+ its input value. */
+ if (next_loc == finish)
{
stop_supporting_fixits ();
return;
}
+ finish = next_loc;
- /* Consolidate neighboring fixits. */
- fixit_hint *prev = get_last_fixit_hint ();
- if (prev)
- if (prev->maybe_append_replace (m_line_table, src_range, new_content))
- return;
-
- add_fixit (new fixit_replace (src_range, new_content));
+ maybe_add_fixit (start, finish, new_content);
}
/* Get the last fix-it hint within this rich_location, or NULL if none. */
@@ -2392,89 +2312,85 @@ rich_location::stop_supporting_fixits ()
m_fixit_hints.truncate (0);
}
-/* Add HINT to the fix-it hints in this rich_location. */
+/* Add HINT to the fix-it hints in this rich_location,
+ consolidating into the prior fixit if possible. */
void
-rich_location::add_fixit (fixit_hint *hint)
+rich_location::maybe_add_fixit (source_location start,
+ source_location next_loc,
+ const char *new_content)
{
- m_fixit_hints.push (hint);
-}
-
-/* class fixit_insert. */
-
-fixit_insert::fixit_insert (source_location where,
- const char *new_content)
-: m_where (where),
- m_bytes (xstrdup (new_content)),
- m_len (strlen (new_content))
-{
-}
-
-fixit_insert::~fixit_insert ()
-{
- free (m_bytes);
-}
-
-/* Implementation of fixit_hint::affects_line_p for fixit_insert. */
+ if (reject_impossible_fixit (start))
+ return;
+ if (reject_impossible_fixit (next_loc))
+ return;
-bool
-fixit_insert::affects_line_p (const char *file, int line) const
-{
- expanded_location exploc
- = linemap_client_expand_location_to_spelling_point (m_where);
- if (file == exploc.file)
- if (line == exploc.line)
- return true;
- return false;
-}
+ /* We do not yet support newlines within fix-it hints. */
+ if (strchr (new_content, '\n'))
+ {
+ stop_supporting_fixits ();
+ return;
+ }
-/* Implementation of maybe_append_replace for fixit_insert. Reject
- the attempt to consolidate fix-its. */
+ /* Consolidate neighboring fixits. */
+ fixit_hint *prev = get_last_fixit_hint ();
+ if (prev)
+ if (prev->maybe_append (start, next_loc, new_content))
+ return;
-bool
-fixit_insert::maybe_append_replace (line_maps *, source_range, const char *)
-{
- return false;
+ m_fixit_hints.push (new fixit_hint (start, next_loc, new_content));
}
-/* class fixit_replace. */
+/* class fixit_hint. */
-fixit_replace::fixit_replace (source_range src_range,
- const char *new_content)
-: m_src_range (src_range),
+fixit_hint::fixit_hint (source_location start,
+ source_location next_loc,
+ const char *new_content)
+: m_start (start),
+ m_next_loc (next_loc),
m_bytes (xstrdup (new_content)),
m_len (strlen (new_content))
{
}
-fixit_replace::~fixit_replace ()
-{
- free (m_bytes);
-}
-
-/* Implementation of fixit_hint::affects_line_p for fixit_replace. */
+/* Does this fix-it hint affect the given line? */
bool
-fixit_replace::affects_line_p (const char *file, int line) const
+fixit_hint::affects_line_p (const char *file, int line) const
{
- return m_src_range.intersects_line_p (file, line);
+ expanded_location exploc_start
+ = linemap_client_expand_location_to_spelling_point (m_start);
+ if (file != exploc_start.file)
+ return false;
+ if (line < exploc_start.line)
+ return false;
+ expanded_location exploc_next_loc
+ = linemap_client_expand_location_to_spelling_point (m_next_loc);
+ if (file != exploc_next_loc.file)
+ return false;
+ if (line > exploc_next_loc.line)
+ return false;
+ return true;
}
-/* Implementation of maybe_append_replace for fixit_replace. If
- possible, merge the new replacement into this one and return true.
+/* Method for consolidating fix-it hints, for use by
+ rich_location::maybe_add_fixit.
+ If possible, merge a pending fix-it hint with the given params
+ into this one and return true.
Otherwise return false. */
bool
-fixit_replace::maybe_append_replace (line_maps *set,
- source_range src_range,
- const char *new_content)
+fixit_hint::maybe_append (source_location start,
+ source_location next_loc,
+ const char *new_content)
{
- /* Does SRC_RANGE start immediately after this one finishes? */
- if (!column_before_p (set, m_src_range.m_finish, src_range.m_start))
+ /* For consolidation to be possible, START must be at this hint's
+ m_next_loc. */
+ if (start != m_next_loc)
return false;
- /* We have neighboring replacements; merge them. */
- m_src_range.m_finish = src_range.m_finish;
+ /* If so, we have neighboring replacements; merge them. */
+ m_next_loc = next_loc;
size_t extra_len = strlen (new_content);
m_bytes = (char *)xrealloc (m_bytes, m_len + extra_len + 1);
memcpy (m_bytes + m_len, new_content, extra_len);