11
11
#include < util/exception_utils.h>
12
12
#include < util/expr.h>
13
13
#include < util/json_irep.h>
14
- #include < util/source_location.h>
15
14
#include < util/type.h>
16
15
17
- // / Return string value for a given key if present in the json object.
18
- // / \param in: The json object that is getting fetched as a string.
19
- // / \param key: The key for the json value to be fetched.
20
- // / \return A string value for the corresponding key.
21
- static const std::string &
22
- try_get_string (const jsont &in, const std::string &key)
16
+ const std::string &try_get_string (const jsont &in, const std::string &key)
23
17
{
24
18
if (!in.is_string ())
25
- throw deserialization_exceptiont (
26
- " symbol_from_json: expected string for key '" + key + " '" );
19
+ {
20
+ throw deserialization_exceptiont{" expected string for key '" + key + " '" };
21
+ }
27
22
return in.value ;
28
23
}
29
24
30
- // / Return boolean value for a given key if present in the json object.
31
- // / \param in: The json object that is getting fetched as a boolean.
32
- // / \param key: The key for the json value to be fetched.
33
- // / \return A boolean value for the corresponding key.
34
- static bool try_get_bool (const jsont &in, const std::string &key)
25
+ bool try_get_bool (const jsont &in, const std::string &key)
35
26
{
36
27
if (!(in.is_true () || in.is_false ()))
37
- throw deserialization_exceptiont (
38
- " symbol_from_json: expected bool for key '" + key + " '" );
28
+ {
29
+ throw deserialization_exceptiont{" expected bool for key '" + key + " '" };
30
+ }
39
31
return in.is_true ();
40
32
}
41
33
34
+ source_locationt try_get_source_location (const jsont &json)
35
+ {
36
+ if (!json.is_object ())
37
+ {
38
+ throw deserialization_exceptiont{
39
+ " source location should be encoded as an object" };
40
+ }
41
+
42
+ const json_objectt &json_object = to_json_object (json);
43
+
44
+ if (json_object.size () == 0 )
45
+ {
46
+ return source_locationt::nil ();
47
+ }
48
+ else if (json_object.find (" id" ) != json_object.end ())
49
+ {
50
+ json_irept json2irep{true };
51
+ irept irep = json2irep.convert_from_json (json_object);
52
+ return static_cast <source_locationt &>(irep);
53
+ }
54
+
55
+ source_locationt result;
56
+ for (const auto &kv : json_object)
57
+ {
58
+ if (kv.first == " workingDirectory" )
59
+ {
60
+ result.set_working_directory (
61
+ try_get_string (kv.second , " workingDirectory" ));
62
+ }
63
+ else if (kv.first == " file" )
64
+ {
65
+ result.set_file (try_get_string (kv.second , " file" ));
66
+ }
67
+ else if (kv.first == " line" )
68
+ {
69
+ result.set_line (try_get_string (kv.second , " line" ));
70
+ }
71
+ else if (kv.first == " column" )
72
+ {
73
+ result.set_column (try_get_string (kv.second , " column" ));
74
+ }
75
+ else if (kv.first == " function" )
76
+ {
77
+ result.set_function (try_get_string (kv.second , " function" ));
78
+ }
79
+ else if (kv.first == " bytecodeIndex" )
80
+ {
81
+ result.set_java_bytecode_index (
82
+ try_get_string (kv.second , " bytecodeIndex" ));
83
+ }
84
+ else if (kv.first == " propertyId" )
85
+ {
86
+ result.set_property_id (try_get_string (kv.second , " propertyId" ));
87
+ }
88
+ else if (kv.first == " propertyClass" )
89
+ {
90
+ result.set_property_class (try_get_string (kv.second , " propertyClass" ));
91
+ }
92
+ else if (kv.first == " comment" )
93
+ {
94
+ result.set_comment (try_get_string (kv.second , " comment" ));
95
+ }
96
+ else if (kv.first == " caseNumber" )
97
+ {
98
+ result.set_case_number (try_get_string (kv.second , " caseNumber" ));
99
+ }
100
+ else if (kv.first == " basicBlockSourceLines" )
101
+ {
102
+ json_irept json2irep{true };
103
+ irept irep = json2irep.convert_from_json (kv.second );
104
+ result.set_basic_block_source_lines (irep);
105
+ }
106
+ else if (kv.first == " propertyFatal" )
107
+ {
108
+ result.property_fatal (try_get_bool (kv.second , " propertyFatal" ));
109
+ }
110
+ else if (kv.first == " hide" )
111
+ {
112
+ if (try_get_bool (kv.second , " hide" ))
113
+ result.set_hide ();
114
+ }
115
+ else if (kv.first == " pragma" )
116
+ {
117
+ if (!kv.second .is_array ())
118
+ throw deserialization_exceptiont{" pragmas must be an array" };
119
+
120
+ for (const auto &pragma : to_json_array (kv.second ))
121
+ {
122
+ if (!pragma.is_string ())
123
+ throw deserialization_exceptiont{" pragma must be a string" };
124
+ result.add_pragma (pragma.value );
125
+ }
126
+ }
127
+ else
128
+ {
129
+ throw deserialization_exceptiont{
130
+ " try_get_source_location: unexpected key '" + kv.first + " '" };
131
+ }
132
+ }
133
+
134
+ return result;
135
+ }
136
+
42
137
// / Deserialise a json object to a symbolt.
43
138
// / \param in: The json object that is getting fetched as an object.
44
139
// / \return A symbolt representing the json object.
@@ -61,10 +156,7 @@ symbolt symbol_from_json(const jsont &in)
61
156
result.value = static_cast <exprt &>(irep);
62
157
}
63
158
else if (kv.first == " location" )
64
- {
65
- irept irep = json2irep.convert_from_json (kv.second );
66
- result.location = static_cast <source_locationt &>(irep);
67
- }
159
+ result.location = try_get_source_location (kv.second );
68
160
else if (kv.first == " name" )
69
161
result.name = try_get_string (kv.second , " name" );
70
162
else if (kv.first == " module" )
0 commit comments