@@ -18,6 +18,8 @@ Author: Daniel Kroening, kroening@kroening.com
1818#include < langapi/language.h>
1919#include < langapi/mode.h>
2020
21+ #include < util/json_irep.h>
22+
2123#include " goto_model.h"
2224
2325void show_symbol_table_xml_ui ()
@@ -153,11 +155,139 @@ void show_symbol_table_plain(
153155 }
154156}
155157
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+
156286void show_symbol_table (
157287 const symbol_tablet &symbol_table,
158- ui_message_handlert::uit ui)
288+ ui_message_handlert & ui)
159289{
160- switch (ui)
290+ switch (ui. get_ui () )
161291 {
162292 case ui_message_handlert::uit::PLAIN:
163293 show_symbol_table_plain (symbol_table, std::cout);
@@ -167,23 +297,26 @@ void show_symbol_table(
167297 show_symbol_table_xml_ui ();
168298 break ;
169299
300+ case ui_message_handlert::uit::JSON_UI:
301+ show_symbol_table_json_ui (symbol_table, ui);
302+
170303 default :
171304 break ;
172305 }
173306}
174307
175308void show_symbol_table (
176309 const goto_modelt &goto_model,
177- ui_message_handlert::uit ui)
310+ ui_message_handlert & ui)
178311{
179312 show_symbol_table (goto_model.symbol_table , ui);
180313}
181314
182315void show_symbol_table_brief (
183316 const symbol_tablet &symbol_table,
184- ui_message_handlert::uit ui)
317+ ui_message_handlert & ui)
185318{
186- switch (ui)
319+ switch (ui. get_ui () )
187320 {
188321 case ui_message_handlert::uit::PLAIN:
189322 show_symbol_table_brief_plain (symbol_table, std::cout);
@@ -194,13 +327,14 @@ void show_symbol_table_brief(
194327 break ;
195328
196329 default :
330+ show_symbol_table_brief_json_ui (symbol_table, ui);
197331 break ;
198332 }
199333}
200334
201335void show_symbol_table_brief (
202336 const goto_modelt &goto_model,
203- ui_message_handlert::uit ui)
337+ ui_message_handlert & ui)
204338{
205339 show_symbol_table_brief (goto_model.symbol_table , ui);
206340}
0 commit comments