18
18
#include < langapi/language.h>
19
19
#include < langapi/mode.h>
20
20
21
+ #include < util/json_irep.h>
22
+
21
23
#include " goto_model.h"
22
24
23
25
void show_symbol_table_xml_ui ()
@@ -153,11 +155,139 @@ void show_symbol_table_plain(
153
155
}
154
156
}
155
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
+
156
286
void show_symbol_table (
157
287
const symbol_tablet &symbol_table,
158
- ui_message_handlert::uit ui)
288
+ ui_message_handlert & ui)
159
289
{
160
- switch (ui)
290
+ switch (ui. get_ui () )
161
291
{
162
292
case ui_message_handlert::uit::PLAIN:
163
293
show_symbol_table_plain (symbol_table, std::cout);
@@ -167,23 +297,26 @@ void show_symbol_table(
167
297
show_symbol_table_xml_ui ();
168
298
break ;
169
299
300
+ case ui_message_handlert::uit::JSON_UI:
301
+ show_symbol_table_json_ui (symbol_table, ui);
302
+
170
303
default :
171
304
break ;
172
305
}
173
306
}
174
307
175
308
void show_symbol_table (
176
309
const goto_modelt &goto_model,
177
- ui_message_handlert::uit ui)
310
+ ui_message_handlert & ui)
178
311
{
179
312
show_symbol_table (goto_model.symbol_table , ui);
180
313
}
181
314
182
315
void show_symbol_table_brief (
183
316
const symbol_tablet &symbol_table,
184
- ui_message_handlert::uit ui)
317
+ ui_message_handlert & ui)
185
318
{
186
- switch (ui)
319
+ switch (ui. get_ui () )
187
320
{
188
321
case ui_message_handlert::uit::PLAIN:
189
322
show_symbol_table_brief_plain (symbol_table, std::cout);
@@ -194,13 +327,14 @@ void show_symbol_table_brief(
194
327
break ;
195
328
196
329
default :
330
+ show_symbol_table_brief_json_ui (symbol_table, ui);
197
331
break ;
198
332
}
199
333
}
200
334
201
335
void show_symbol_table_brief (
202
336
const goto_modelt &goto_model,
203
- ui_message_handlert::uit ui)
337
+ ui_message_handlert & ui)
204
338
{
205
339
show_symbol_table_brief (goto_model.symbol_table , ui);
206
340
}
0 commit comments