@@ -186,6 +186,34 @@ typet string_length_type()
186186 return java_int_type ();
187187}
188188
189+ // / Gets the base classes for known String and String-related types, or returns
190+ // / an empty list for other types.
191+ // / \param class_name: class identifier, without "java::" prefix.
192+ // / \return a list of base classes, again without "java::" prefix.
193+ std::vector<irep_idt>
194+ java_string_library_preprocesst::get_string_type_base_classes (
195+ const irep_idt &class_name)
196+ {
197+ if (!is_known_string_type (class_name))
198+ return {};
199+
200+ std::vector<irep_idt> bases;
201+ bases.reserve (3 );
202+ if (class_name != " java.lang.CharSequence" )
203+ {
204+ bases.push_back (" java.io.Serializable" );
205+ bases.push_back (" java.lang.CharSequence" );
206+ }
207+ if (class_name == " java.lang.String" )
208+ bases.push_back (" java.lang.Comparable" );
209+
210+ if (class_name == " java.lang.StringBuilder" ||
211+ class_name == " java.lang.StringBuffer" )
212+ bases.push_back (" java.lang.AbstractStringBuilder" );
213+
214+ return bases;
215+ }
216+
189217// / Add to the symbol table type declaration for a String-like Java class.
190218// / \param class_name: a name for the class such as "java.lang.String"
191219// / \param symbol_table: symbol table to which the class will be added
@@ -206,17 +234,10 @@ void java_string_library_preprocesst::add_string_type(
206234 string_type.components ()[2 ].type () = pointer_type (java_char_type ());
207235 string_type.set_access (ID_public);
208236 string_type.add_base (symbol_typet (" java::java.lang.Object" ));
209- if (class_name!=" java.lang.CharSequence" )
210- {
211- string_type.add_base (symbol_typet (" java::java.io.Serializable" ));
212- string_type.add_base (symbol_typet (" java::java.lang.CharSequence" ));
213- }
214- if (class_name==" java.lang.String" )
215- string_type.add_base (symbol_typet (" java::java.lang.Comparable" ));
216237
217- if (class_name== " java.lang.StringBuilder " ||
218- class_name== " java.lang.StringBuffer " )
219- string_type.add_base (symbol_typet (" java::java.lang.AbstractStringBuilder " ));
238+ std::vector<irep_idt> bases = get_string_type_base_classes (class_name);
239+ for ( const irep_idt &base_name : bases )
240+ string_type.add_base (symbol_typet (" java::" + id2string (base_name) ));
220241
221242 symbolt tmp_string_symbol;
222243 tmp_string_symbol.name =" java::" +id2string (class_name);
@@ -1848,16 +1869,19 @@ bool java_string_library_preprocesst::is_known_string_type(
18481869 return string_types.find (class_name)!=string_types.end ();
18491870}
18501871
1851- // / fill maps with correspondence from java method names to conversion functions
1852- void java_string_library_preprocesst::initialize_conversion_table ()
1872+ void java_string_library_preprocesst::initialize_known_type_table ()
18531873{
1854- character_preprocess.initialize_conversion_table ();
1855-
18561874 string_types=
18571875 std::unordered_set<irep_idt, irep_id_hash>{" java.lang.String" ,
18581876 " java.lang.StringBuilder" ,
18591877 " java.lang.CharSequence" ,
18601878 " java.lang.StringBuffer" };
1879+ }
1880+
1881+ // / fill maps with correspondence from java method names to conversion functions
1882+ void java_string_library_preprocesst::initialize_conversion_table ()
1883+ {
1884+ character_preprocess.initialize_conversion_table ();
18611885
18621886 // The following list of function is organized by libraries, with
18631887 // constructors first and then methods in alphabetic order.
0 commit comments