Reimplement removal fix-it hints in terms of replace

This patch eliminates class fixit_remove, reimplementing
rich_location::add_fixit_remove in terms of replacement with the
empty string.  Deleting the removal subclass simplifies
fixit-handling code, as we only have two concrete fixit_hint
subclasses to deal with, rather than three.

The patch also fixes some problems in diagnostic-show-locus.c for
situations where a replacement fix-it has a different range to the
range of the diagnostic, by unifying the drawing of the two kinds of
fixits.  For example, this:

  foo = bar.field;
      ^
            m_field

becomes:

  foo = bar.field;
      ^
            -----
            m_field

showing the range to be replaced.

gcc/ChangeLog:
	* diagnostic-show-locus.c
	(layout::annotation_line_showed_range_p): New method.
	(layout::print_any_fixits): Remove case fixit_hint::REMOVE.
	Reimplement case fixit_hint::REPLACE to cover removals, and
	replacements where the range of the replacement isn't one
	of the ranges in the rich_location.
	(test_one_liner_fixit_replace): Likewise.
	(selftest::test_one_liner_fixit_replace_non_equal_range): New
	function.
	(selftest::test_one_liner_fixit_replace_equal_secondary_range):
	New function.
	(selftest::test_diagnostic_show_locus_one_liner): Call the new
	functions.
	* diagnostic.c (print_parseable_fixits): Remove case
	fixit_hint::REMOVE.

libcpp/ChangeLog:
	* include/line-map.h (fixit_hint::kind): Delete REPLACE.
	(class fixit_remove): Delete.
	* line-map.c (rich_location::add_fixit_remove): Reimplement
	by calling add_fixit_replace with an empty string.
	(fixit_remove::fixit_remove): Delete.
	(fixit_remove::affects_line_p): Delete.

From-SVN: r239632
This commit is contained in:
David Malcolm
2016-08-19 21:18:05 +00:00
committed by David Malcolm
parent d9056349fc
commit 2ffe0809cb
6 changed files with 137 additions and 67 deletions

View File

@@ -1422,7 +1422,7 @@ protected:
class fixit_hint
{
public:
enum kind {INSERT, REMOVE, REPLACE};
enum kind {INSERT, REPLACE};
virtual ~fixit_hint () {}
@@ -1453,27 +1453,6 @@ class fixit_insert : public fixit_hint
size_t m_len;
};
class fixit_remove : public fixit_hint
{
public:
fixit_remove (source_range src_range);
~fixit_remove () {}
enum kind get_kind () const { return REMOVE; }
bool affects_line_p (const char *file, int line);
source_location get_start_loc () const { return m_src_range.m_start; }
bool maybe_get_end_loc (source_location *out) const
{
*out = m_src_range.m_finish;
return true;
}
source_range get_range () const { return m_src_range; }
private:
source_range m_src_range;
};
class fixit_replace : public fixit_hint
{
public: