@@ -11,12 +11,15 @@ Author: Daniel Kroening, kroening@kroening.com
1111
1212#include " show_symbol_table.h"
1313
14+ #include < algorithm>
1415#include < iostream>
1516#include < memory>
1617
1718#include < langapi/language.h>
1819#include < langapi/mode.h>
1920
21+ #include < util/json_irep.h>
22+
2023#include " goto_model.h"
2124
2225void show_symbol_table_xml_ui ()
@@ -68,16 +71,16 @@ void show_symbol_table_plain(
6871 out << ' \n ' << " Symbols:" << ' \n ' << ' \n ' ;
6972
7073 // we want to sort alphabetically
71- std::set<std::string> symbols;
74+ std::vector<std::string> symbols;
75+ symbols.reserve (symbol_table.symbols .size ());
7276
7377 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 ());
7780
7881 const namespacet ns (symbol_table);
7982
80- for (const std::string &id : symbols)
83+ for (const irep_idt &id : symbols)
8184 {
8285 const symbolt &symbol=ns.lookup (id);
8386
@@ -152,11 +155,139 @@ void show_symbol_table_plain(
152155 }
153156}
154157
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+
155286void show_symbol_table (
156287 const symbol_tablet &symbol_table,
157- ui_message_handlert::uit ui)
288+ ui_message_handlert & ui)
158289{
159- switch (ui)
290+ switch (ui. get_ui () )
160291 {
161292 case ui_message_handlert::uit::PLAIN:
162293 show_symbol_table_plain (symbol_table, std::cout);
@@ -166,23 +297,26 @@ void show_symbol_table(
166297 show_symbol_table_xml_ui ();
167298 break ;
168299
300+ case ui_message_handlert::uit::JSON_UI:
301+ show_symbol_table_json_ui (symbol_table, ui);
302+
169303 default :
170304 break ;
171305 }
172306}
173307
174308void show_symbol_table (
175309 const goto_modelt &goto_model,
176- ui_message_handlert::uit ui)
310+ ui_message_handlert & ui)
177311{
178312 show_symbol_table (goto_model.symbol_table , ui);
179313}
180314
181315void show_symbol_table_brief (
182316 const symbol_tablet &symbol_table,
183- ui_message_handlert::uit ui)
317+ ui_message_handlert & ui)
184318{
185- switch (ui)
319+ switch (ui. get_ui () )
186320 {
187321 case ui_message_handlert::uit::PLAIN:
188322 show_symbol_table_brief_plain (symbol_table, std::cout);
@@ -193,13 +327,14 @@ void show_symbol_table_brief(
193327 break ;
194328
195329 default :
330+ show_symbol_table_brief_json_ui (symbol_table, ui);
196331 break ;
197332 }
198333}
199334
200335void show_symbol_table_brief (
201336 const goto_modelt &goto_model,
202- ui_message_handlert::uit ui)
337+ ui_message_handlert & ui)
203338{
204339 show_symbol_table_brief (goto_model.symbol_table , ui);
205340}
0 commit comments