diff options
author | Giuliano Belinassi <giuliano.belinassi@usp.br> | 2020-08-22 17:43:43 -0300 |
---|---|---|
committer | Giuliano Belinassi <giuliano.belinassi@usp.br> | 2020-08-22 17:43:43 -0300 |
commit | a926878ddbd5a98b272c22171ce58663fc04c3e0 (patch) | |
tree | 86af256e5d9a9c06263c00adc90e5fe348008c43 /gcc/diagnostic-format-json.cc | |
parent | 542730f087133690b47e036dfd43eb0db8a650ce (diff) | |
parent | 07cbaed8ba7d1b6e4ab3a9f44175502a4e1ecdb1 (diff) | |
download | gcc-devel/autopar_devel.zip gcc-devel/autopar_devel.tar.gz gcc-devel/autopar_devel.tar.bz2 |
Merge branch 'autopar_rebase2' into autopar_develdevel/autopar_devel
Quickly commit changes in the rebase branch.
Diffstat (limited to 'gcc/diagnostic-format-json.cc')
-rw-r--r-- | gcc/diagnostic-format-json.cc | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/gcc/diagnostic-format-json.cc b/gcc/diagnostic-format-json.cc index 7bda5c4..465c42f 100644 --- a/gcc/diagnostic-format-json.cc +++ b/gcc/diagnostic-format-json.cc @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "diagnostic.h" +#include "selftest-diagnostic.h" #include "diagnostic-metadata.h" #include "json.h" #include "selftest.h" @@ -43,21 +44,43 @@ static json::array *cur_children_array; /* Generate a JSON object for LOC. */ json::value * -json_from_expanded_location (location_t loc) +json_from_expanded_location (diagnostic_context *context, location_t loc) { expanded_location exploc = expand_location (loc); json::object *result = new json::object (); if (exploc.file) result->set ("file", new json::string (exploc.file)); result->set ("line", new json::integer_number (exploc.line)); - result->set ("column", new json::integer_number (exploc.column)); + + const enum diagnostics_column_unit orig_unit = context->column_unit; + struct + { + const char *name; + enum diagnostics_column_unit unit; + } column_fields[] = { + {"display-column", DIAGNOSTICS_COLUMN_UNIT_DISPLAY}, + {"byte-column", DIAGNOSTICS_COLUMN_UNIT_BYTE} + }; + int the_column = INT_MIN; + for (int i = 0; i != sizeof column_fields / sizeof (*column_fields); ++i) + { + context->column_unit = column_fields[i].unit; + const int col = diagnostic_converted_column (context, exploc); + result->set (column_fields[i].name, new json::integer_number (col)); + if (column_fields[i].unit == orig_unit) + the_column = col; + } + gcc_assert (the_column != INT_MIN); + result->set ("column", new json::integer_number (the_column)); + context->column_unit = orig_unit; return result; } /* Generate a JSON object for LOC_RANGE. */ static json::object * -json_from_location_range (const location_range *loc_range, unsigned range_idx) +json_from_location_range (diagnostic_context *context, + const location_range *loc_range, unsigned range_idx) { location_t caret_loc = get_pure_location (loc_range->m_loc); @@ -68,13 +91,13 @@ json_from_location_range (const location_range *loc_range, unsigned range_idx) location_t finish_loc = get_finish (loc_range->m_loc); json::object *result = new json::object (); - result->set ("caret", json_from_expanded_location (caret_loc)); + result->set ("caret", json_from_expanded_location (context, caret_loc)); if (start_loc != caret_loc && start_loc != UNKNOWN_LOCATION) - result->set ("start", json_from_expanded_location (start_loc)); + result->set ("start", json_from_expanded_location (context, start_loc)); if (finish_loc != caret_loc && finish_loc != UNKNOWN_LOCATION) - result->set ("finish", json_from_expanded_location (finish_loc)); + result->set ("finish", json_from_expanded_location (context, finish_loc)); if (loc_range->m_label) { @@ -91,14 +114,14 @@ json_from_location_range (const location_range *loc_range, unsigned range_idx) /* Generate a JSON object for HINT. */ static json::object * -json_from_fixit_hint (const fixit_hint *hint) +json_from_fixit_hint (diagnostic_context *context, const fixit_hint *hint) { json::object *fixit_obj = new json::object (); location_t start_loc = hint->get_start_loc (); - fixit_obj->set ("start", json_from_expanded_location (start_loc)); + fixit_obj->set ("start", json_from_expanded_location (context, start_loc)); location_t next_loc = hint->get_next_loc (); - fixit_obj->set ("next", json_from_expanded_location (next_loc)); + fixit_obj->set ("next", json_from_expanded_location (context, next_loc)); fixit_obj->set ("string", new json::string (hint->get_string ())); return fixit_obj; @@ -190,11 +213,13 @@ json_end_diagnostic (diagnostic_context *context, diagnostic_info *diagnostic, else { /* Otherwise, make diag_obj be the top-level object within the group; - add a "children" array. */ + add a "children" array and record the column origin. */ toplevel_array->append (diag_obj); cur_group = diag_obj; cur_children_array = new json::array (); diag_obj->set ("children", cur_children_array); + diag_obj->set ("column-origin", + new json::integer_number (context->column_origin)); } const rich_location *richloc = diagnostic->richloc; @@ -205,7 +230,7 @@ json_end_diagnostic (diagnostic_context *context, diagnostic_info *diagnostic, for (unsigned int i = 0; i < richloc->get_num_locations (); i++) { const location_range *loc_range = richloc->get_range (i); - json::object *loc_obj = json_from_location_range (loc_range, i); + json::object *loc_obj = json_from_location_range (context, loc_range, i); if (loc_obj) loc_array->append (loc_obj); } @@ -217,7 +242,7 @@ json_end_diagnostic (diagnostic_context *context, diagnostic_info *diagnostic, for (unsigned int i = 0; i < richloc->get_num_fixit_hints (); i++) { const fixit_hint *hint = richloc->get_fixit_hint (i); - json::object *fixit_obj = json_from_fixit_hint (hint); + json::object *fixit_obj = json_from_fixit_hint (context, hint); fixit_array->append (fixit_obj); } } @@ -320,7 +345,8 @@ namespace selftest { static void test_unknown_location () { - delete json_from_expanded_location (UNKNOWN_LOCATION); + test_diagnostic_context dc; + delete json_from_expanded_location (&dc, UNKNOWN_LOCATION); } /* Verify that we gracefully handle attempts to serialize bad @@ -338,7 +364,8 @@ test_bad_endpoints () loc_range.m_range_display_kind = SHOW_RANGE_WITH_CARET; loc_range.m_label = NULL; - json::object *obj = json_from_location_range (&loc_range, 0); + test_diagnostic_context dc; + json::object *obj = json_from_location_range (&dc, &loc_range, 0); /* We should have a "caret" value, but no "start" or "finish" values. */ ASSERT_TRUE (obj != NULL); ASSERT_TRUE (obj->get ("caret") != NULL); |