summaryrefslogtreecommitdiff
path: root/libcpp/line-map.c
diff options
context:
space:
mode:
authordmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>2016-09-13 16:08:59 +0000
committerdmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>2016-09-13 16:08:59 +0000
commit68ef907cd5704cca533b3cdf6db112b973e52b74 (patch)
treef49ba2c7c6f8a048ee6c7db0ecc48ec1bbe3d897 /libcpp/line-map.c
parentf339fac19fcd0eb730be8b0bee8f0c5e178ffb8c (diff)
downloadgcc-68ef907cd5704cca533b3cdf6db112b973e52b74.tar.gz
fix-it hints: insert_before vs insert_after
The API for adding "insert text" fix-it hints was unclear about exactly where the text should be inserted relative to the given insertion point. This patch clarifies things by renaming the pertinent methods from richloc.add_fixit_insert to richloc.add_fixit_insert_before and adding: richloc.add_fixit_insert_after The latter allows us to consolidate some failure-handling into class rich_location, rather than having to have every such diagnostic check for it. The patch also adds a description of how fix-it hints work to the comment for class rich_location within libcpp/include/line-map.h. gcc/c-family/ChangeLog: * c-common.c (warn_logical_not_parentheses): Replace rich_location::add_fixit_insert calls with add_fixit_insert_before and add_fixit_insert_after, eliminating the "next_loc" calculation. gcc/c/ChangeLog: * c-parser.c (c_parser_declaration_or_fndef): Update for renaming of add_fixit_insert to add_fixit_insert_before. gcc/cp/ChangeLog: * parser.c (cp_parser_class_specifier_1): Update for renaming of add_fixit_insert to add_fixit_insert_before. (cp_parser_class_head): Likewise. gcc/ChangeLog: * diagnostic-show-locus.c (selftest::test_one_liner_fixit_insert): Rename to... (selftest::test_one_liner_fixit_insert_before): ...this, and update for renaming of add_fixit_insert to add_fixit_insert_before. (selftest::test_one_liner_fixit_insert_after): New function. (selftest::test_one_liner_fixit_validation_adhoc_locations): Update for renaming of add_fixit_insert to add_fixit_insert_before. (selftest::test_one_liner_many_fixits): Likewise. (selftest::test_diagnostic_show_locus_one_liner): Update for renaming, call new test function. (selftest::test_diagnostic_show_locus_fixit_lines): Update for renaming of add_fixit_insert to add_fixit_insert_before. (selftest::test_fixit_consolidation): Likewise. * diagnostic.c (selftest::test_print_parseable_fixits_insert): Likewise. * edit-context.c (selftest::test_applying_fixits_insert): Rename to... (selftest::test_applying_fixits_insert_before): ...this. (selftest::test_applying_fixits_insert): Update for renaming of add_fixit_insert to add_fixit_insert_before. (selftest::test_applying_fixits_insert_after): New function. (selftest::test_applying_fixits_insert_after_at_line_end): New function. (selftest::test_applying_fixits_insert_after_failure): New function. (selftest::test_applying_fixits_multiple): Update for renaming of add_fixit_insert to add_fixit_insert_before. (selftest::change_line): Likewise. (selftest::test_applying_fixits_unreadable_file): Likewise. (selftest::test_applying_fixits_line_out_of_range): Likewise. (selftest::test_applying_fixits_column_validation): Likewise. (selftest::test_applying_fixits_column_validation): Likewise. (selftest::edit_context_c_tests): Update for renamed test function; call new test functions. gcc/testsuite/ChangeLog: * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c (test_show_locus): Replace rich_location::add_fixit_insert calls with add_fixit_insert_before and add_fixit_insert_after. libcpp/ChangeLog: * include/line-map.h (class rich_location): Add description of fix-it hints to leading comment. (rich_location::add_fixit_insert): Rename both overloaded methods to.. (rich_location::add_fixit_insert_before): ...this, updating their comments. (rich_location::add_fixit_insert_after): Two new overloaded methods. (rich_location::stop_supporting_fixits): New method. * line-map.c (rich_location::add_fixit_insert): Rename both overloaded methods to.. (rich_location::add_fixit_insert_before): ...this, updating their comments. (rich_location::add_fixit_insert_after): Two new methods. (rich_location::reject_impossible_fixit): Split out failure-handling into... (rich_location::stop_supporting_fixits): New method. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240115 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp/line-map.c')
-rw-r--r--libcpp/line-map.c65
1 files changed, 54 insertions, 11 deletions
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index f69c60c7837..742af0a07bb 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -2109,26 +2109,61 @@ rich_location::set_range (line_maps * /*set*/, unsigned int idx,
/* Methods for adding insertion fix-it hints. */
/* Add a fixit-hint, suggesting insertion of NEW_CONTENT
- at the primary range's caret location. */
+ immediately before the primary range's start location. */
void
-rich_location::add_fixit_insert (const char *new_content)
+rich_location::add_fixit_insert_before (const char *new_content)
{
- add_fixit_insert (get_loc (), new_content);
+ add_fixit_insert_before (get_loc (), new_content);
}
/* Add a fixit-hint, suggesting insertion of NEW_CONTENT
- at WHERE. */
+ immediately before the start of WHERE. */
void
-rich_location::add_fixit_insert (source_location where,
- const char *new_content)
+rich_location::add_fixit_insert_before (source_location where,
+ const char *new_content)
{
- where = get_pure_location (m_line_table, where);
+ source_location start = get_range_from_loc (m_line_table, where).m_start;
- if (reject_impossible_fixit (where))
+ if (reject_impossible_fixit (start))
return;
- add_fixit (new fixit_insert (where, new_content));
+ add_fixit (new fixit_insert (start, new_content));
+}
+
+/* Add a fixit-hint, suggesting insertion of NEW_CONTENT
+ immediately after the primary range's end-point. */
+
+void
+rich_location::add_fixit_insert_after (const char *new_content)
+{
+ add_fixit_insert_after (get_loc (), new_content);
+}
+
+/* Add a fixit-hint, suggesting insertion of NEW_CONTENT
+ immediately after the end-point of WHERE. */
+
+void
+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);
+
+ /* linemap_position_for_loc_and_offset can fail, if so, it returns
+ its input value. */
+ if (next_loc == finish)
+ {
+ stop_supporting_fixits ();
+ return;
+ }
+
+ add_fixit (new fixit_insert (next_loc, new_content));
}
/* Methods for adding removal fix-it hints. */
@@ -2278,14 +2313,22 @@ rich_location::reject_impossible_fixit (source_location where)
/* Otherwise we have an attempt to add a fix-it with an "awkward"
location: either one that we can't obtain column information
for (within an ordinary map), or one within a macro expansion. */
+ stop_supporting_fixits ();
+ return true;
+}
+
+/* Mark this rich_location as not supporting fixits, purging any that were
+ already added. */
+
+void
+rich_location::stop_supporting_fixits ()
+{
m_seen_impossible_fixit = true;
/* Purge the rich_location of any fix-its that were already added. */
for (unsigned int i = 0; i < m_fixit_hints.count (); i++)
delete get_fixit_hint (i);
m_fixit_hints.truncate (0);
-
- return true;
}
/* Add HINT to the fix-it hints in this rich_location. */