11
11
12
12
#include " show_symbol_table.h"
13
13
14
+ #include < algorithm>
14
15
#include < iostream>
15
16
#include < memory>
16
17
17
18
#include < langapi/language.h>
18
19
#include < langapi/mode.h>
19
20
21
+ #include < util/json_irep.h>
22
+
20
23
#include " goto_model.h"
21
24
22
25
void show_symbol_table_xml_ui ()
@@ -68,16 +71,16 @@ void show_symbol_table_plain(
68
71
out << ' \n ' << " Symbols:" << ' \n ' << ' \n ' ;
69
72
70
73
// we want to sort alphabetically
71
- std::set<std::string> symbols;
74
+ std::vector<std::string> symbols;
75
+ symbols.reserve (symbol_table.symbols .size ());
72
76
73
77
for (const auto &symbol_pair : symbol_table.symbols )
74
- {
75
- symbols.insert (id2string (symbol_pair.first ));
76
- }
78
+ symbols.push_back (id2string (symbol_pair.first ));
79
+ std::sort (symbols.begin (), symbols.end ());
77
80
78
81
const namespacet ns (symbol_table);
79
82
80
- for (const std::string &id : symbols)
83
+ for (const irep_idt &id : symbols)
81
84
{
82
85
const symbolt &symbol=ns.lookup (id);
83
86
@@ -152,11 +155,139 @@ void show_symbol_table_plain(
152
155
}
153
156
}
154
157
158
+ static void show_symbol_table_json_ui (
159
+ const symbol_tablet &symbol_table,
160
+ message_handlert &message_handler)
161
+ {
162
+ json_stream_arrayt &out = message_handler.get_json_stream ();
163
+
164
+ json_stream_objectt &result_wrapper = out.push_back_stream_object ();
165
+ json_stream_objectt &result =
166
+ result_wrapper.push_back_stream_object (" symbolTable" );
167
+
168
+ const namespacet ns (symbol_table);
169
+ json_irept irep_converter (true );
170
+
171
+ for (const auto &id_and_symbol : symbol_table.symbols )
172
+ {
173
+ const symbolt &symbol = id_and_symbol.second ;
174
+
175
+ std::unique_ptr<languaget> ptr;
176
+
177
+ if (symbol.mode ==" " )
178
+ {
179
+ ptr=get_default_language ();
180
+ }
181
+ else
182
+ {
183
+ ptr=get_language_from_mode (symbol.mode );
184
+ }
185
+
186
+ if (!ptr)
187
+ throw " symbol " +id2string (symbol.name )+" has unknown mode" ;
188
+
189
+ std::string type_str, value_str;
190
+
191
+ if (symbol.type .is_not_nil ())
192
+ ptr->from_type (symbol.type , type_str, ns);
193
+
194
+ if (symbol.value .is_not_nil ())
195
+ ptr->from_expr (symbol.value , value_str, ns);
196
+
197
+ json_objectt symbol_json;
198
+ symbol_json[" prettyName" ] = json_stringt (symbol.pretty_name );
199
+ symbol_json[" baseName" ] = json_stringt (symbol.base_name );
200
+ symbol_json[" mode" ] = json_stringt (symbol.mode );
201
+ symbol_json[" module" ] = json_stringt (symbol.module );
202
+
203
+ symbol_json[" prettyType" ] = json_stringt (type_str);
204
+ symbol_json[" prettyValue" ] = json_stringt (value_str);
205
+
206
+ symbol_json[" type" ] = irep_converter.convert_from_irep (symbol.type );
207
+ symbol_json[" value" ] = irep_converter.convert_from_irep (symbol.value );
208
+ symbol_json[" location" ] = irep_converter.convert_from_irep (symbol.location );
209
+
210
+ symbol_json[" isType" ] = jsont::json_boolean (symbol.is_type );
211
+ symbol_json[" isMacro" ] = jsont::json_boolean (symbol.is_macro );
212
+ symbol_json[" isExported" ] = jsont::json_boolean (symbol.is_exported );
213
+ symbol_json[" isInput" ] = jsont::json_boolean (symbol.is_input );
214
+ symbol_json[" isOutput" ] = jsont::json_boolean (symbol.is_output );
215
+ symbol_json[" isStateVar" ] = jsont::json_boolean (symbol.is_state_var );
216
+ symbol_json[" isProperty" ] = jsont::json_boolean (symbol.is_property );
217
+ symbol_json[" isStaticLifetime" ] =
218
+ jsont::json_boolean (symbol.is_static_lifetime );
219
+ symbol_json[" isThreadLocal" ] =
220
+ jsont::json_boolean (symbol.is_thread_local );
221
+ symbol_json[" isLvalue" ] = jsont::json_boolean (symbol.is_lvalue );
222
+ symbol_json[" isFileLocal" ] = jsont::json_boolean (symbol.is_file_local );
223
+ symbol_json[" isExtern" ] = jsont::json_boolean (symbol.is_extern );
224
+ symbol_json[" isVolatile" ] = jsont::json_boolean (symbol.is_volatile );
225
+ symbol_json[" isParameter" ] = jsont::json_boolean (symbol.is_parameter );
226
+ symbol_json[" isAuxiliary" ] = jsont::json_boolean (symbol.is_auxiliary );
227
+ symbol_json[" isWeak" ] = jsont::json_boolean (symbol.is_weak );
228
+
229
+ result.push_back (id2string (symbol.name ), symbol_json);
230
+ }
231
+ }
232
+
233
+ static void show_symbol_table_brief_json_ui (
234
+ const symbol_tablet &symbol_table,
235
+ message_handlert &message_handler)
236
+ {
237
+ json_stream_arrayt &out = message_handler.get_json_stream ();
238
+
239
+ json_stream_objectt &result_wrapper = out.push_back_stream_object ();
240
+ json_stream_objectt &result =
241
+ result_wrapper.push_back_stream_object (" symbolTable" );
242
+
243
+ const namespacet ns (symbol_table);
244
+ json_irept irep_converter (true );
245
+
246
+ for (const auto &id_and_symbol : symbol_table.symbols )
247
+ {
248
+ const symbolt &symbol = id_and_symbol.second ;
249
+
250
+ std::unique_ptr<languaget> ptr;
251
+
252
+ if (symbol.mode ==" " )
253
+ {
254
+ ptr=get_default_language ();
255
+ }
256
+ else
257
+ {
258
+ ptr=get_language_from_mode (symbol.mode );
259
+ }
260
+
261
+ if (!ptr)
262
+ throw " symbol " +id2string (symbol.name )+" has unknown mode" ;
263
+
264
+ std::string type_str, value_str;
265
+
266
+ if (symbol.type .is_not_nil ())
267
+ ptr->from_type (symbol.type , type_str, ns);
268
+
269
+ if (symbol.value .is_not_nil ())
270
+ ptr->from_expr (symbol.value , value_str, ns);
271
+
272
+ json_objectt symbol_json;
273
+ symbol_json[" prettyName" ] = json_stringt (symbol.pretty_name );
274
+ symbol_json[" baseName" ] = json_stringt (symbol.base_name );
275
+ symbol_json[" mode" ] = json_stringt (symbol.mode );
276
+ symbol_json[" module" ] = json_stringt (symbol.module );
277
+
278
+ symbol_json[" prettyType" ] = json_stringt (type_str);
279
+
280
+ symbol_json[" type" ] = irep_converter.convert_from_irep (symbol.type );
281
+
282
+ result.push_back (id2string (symbol.name ), symbol_json);
283
+ }
284
+ }
285
+
155
286
void show_symbol_table (
156
287
const symbol_tablet &symbol_table,
157
- ui_message_handlert::uit ui)
288
+ ui_message_handlert & ui)
158
289
{
159
- switch (ui)
290
+ switch (ui. get_ui () )
160
291
{
161
292
case ui_message_handlert::uit::PLAIN:
162
293
show_symbol_table_plain (symbol_table, std::cout);
@@ -166,23 +297,26 @@ void show_symbol_table(
166
297
show_symbol_table_xml_ui ();
167
298
break ;
168
299
300
+ case ui_message_handlert::uit::JSON_UI:
301
+ show_symbol_table_json_ui (symbol_table, ui);
302
+
169
303
default :
170
304
break ;
171
305
}
172
306
}
173
307
174
308
void show_symbol_table (
175
309
const goto_modelt &goto_model,
176
- ui_message_handlert::uit ui)
310
+ ui_message_handlert & ui)
177
311
{
178
312
show_symbol_table (goto_model.symbol_table , ui);
179
313
}
180
314
181
315
void show_symbol_table_brief (
182
316
const symbol_tablet &symbol_table,
183
- ui_message_handlert::uit ui)
317
+ ui_message_handlert & ui)
184
318
{
185
- switch (ui)
319
+ switch (ui. get_ui () )
186
320
{
187
321
case ui_message_handlert::uit::PLAIN:
188
322
show_symbol_table_brief_plain (symbol_table, std::cout);
@@ -193,13 +327,14 @@ void show_symbol_table_brief(
193
327
break ;
194
328
195
329
default :
330
+ show_symbol_table_brief_json_ui (symbol_table, ui);
196
331
break ;
197
332
}
198
333
}
199
334
200
335
void show_symbol_table_brief (
201
336
const goto_modelt &goto_model,
202
- ui_message_handlert::uit ui)
337
+ ui_message_handlert & ui)
203
338
{
204
339
show_symbol_table_brief (goto_model.symbol_table , ui);
205
340
}
0 commit comments