aboutsummaryrefslogtreecommitdiff
path: root/gcc/libsarifreplay.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/libsarifreplay.cc')
-rw-r--r--gcc/libsarifreplay.cc106
1 files changed, 105 insertions, 1 deletions
diff --git a/gcc/libsarifreplay.cc b/gcc/libsarifreplay.cc
index f5f1f20..6c79762 100644
--- a/gcc/libsarifreplay.cc
+++ b/gcc/libsarifreplay.cc
@@ -106,6 +106,82 @@ make_physical_location (libgdiagnostics::manager &mgr,
return mgr.new_location_from_range (start, start, end);
}
+static enum diagnostic_logical_location_kind_t
+get_logical_location_kind_for_json_kind (enum json::kind json_kind)
+{
+ switch (json_kind)
+ {
+ default:
+ gcc_unreachable ();
+
+ case json::JSON_OBJECT:
+ return DIAGNOSTIC_LOGICAL_LOCATION_KIND_OBJECT;
+
+ case json::JSON_ARRAY:
+ return DIAGNOSTIC_LOGICAL_LOCATION_KIND_ARRAY;
+
+ case json::JSON_INTEGER:
+ case json::JSON_FLOAT:
+ case json::JSON_STRING:
+ case json::JSON_TRUE:
+ case json::JSON_FALSE:
+ case json::JSON_NULL:
+ return DIAGNOSTIC_LOGICAL_LOCATION_KIND_PROPERTY;
+ /* Perhaps this should be DIAGNOSTIC_LOGICAL_LOCATION_KIND_VALUE,
+ but then we need to more carefully track context. */
+ }
+}
+
+static libgdiagnostics::logical_location
+make_logical_location_from_jv (libgdiagnostics::manager &mgr,
+ const json::value &jv)
+{
+ libgdiagnostics::logical_location parent;
+ const json::pointer::token &pointer_token = jv.get_pointer_token ();
+
+ if (pointer_token.m_parent)
+ /* Recursively ensure that we have ancestor locations. */
+ parent = make_logical_location_from_jv (mgr,
+ *jv.m_pointer_token.m_parent);
+
+ std::string short_name;
+ std::string fully_qualified_name;
+ switch (pointer_token.m_kind)
+ {
+ default:
+ gcc_unreachable ();
+
+ case json::pointer::token::kind::root_value:
+ short_name = "";
+ fully_qualified_name = "";
+ break;
+
+ case json::pointer::token::kind::object_member:
+ short_name = pointer_token.m_data.u_member;
+ gcc_assert (parent.m_inner);
+ fully_qualified_name
+ = std::string (parent.get_fully_qualified_name ()) + "/" + short_name;
+ break;
+
+ case json::pointer::token::kind::array_index:
+ short_name = std::to_string (pointer_token.m_data.u_index);
+ gcc_assert (parent.m_inner);
+ fully_qualified_name
+ = std::string (parent.get_fully_qualified_name ()) + "/" + short_name;
+ break;
+ }
+
+ enum diagnostic_logical_location_kind_t kind
+ = get_logical_location_kind_for_json_kind (jv.get_kind ());
+
+ return mgr.new_logical_location (kind,
+ parent,
+ short_name.c_str (),
+ fully_qualified_name.c_str (),
+ nullptr);
+}
+
+
enum class status
{
ok,
@@ -417,6 +493,9 @@ private:
m_json_location_map.get_range_for_value (jv));
diag.set_location (loc_range);
+ diag.set_logical_location (make_logical_location_from_jv (m_control_mgr,
+ jv));
+
diag.finish_va (gmsgid, args);
}
@@ -2008,7 +2087,32 @@ handle_logical_location_object (const json::object &logical_loc_obj,
{ "parameter",
DIAGNOSTIC_LOGICAL_LOCATION_KIND_PARAMETER },
{ "variable",
- DIAGNOSTIC_LOGICAL_LOCATION_KIND_VARIABLE } };
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_VARIABLE },
+
+ { "element",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_ELEMENT },
+ { "attribute",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_ATTRIBUTE },
+ { "text",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_TEXT },
+ { "comment",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_COMMENT },
+ { "processingInstruction",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_PROCESSING_INSTRUCTION },
+ { "dtd",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_DTD },
+ { "declaration",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_DECLARATION },
+
+ { "object",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_OBJECT },
+ { "array",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_ARRAY },
+ { "property",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_PROPERTY },
+ { "value",
+ DIAGNOSTIC_LOGICAL_LOCATION_KIND_VALUE },
+ };
auto result
= get_value_from_json_string<enum diagnostic_logical_location_kind_t>
(*kind_str, kind_prop, kind_values, ARRAY_SIZE (kind_values));