@@ -186,6 +186,34 @@ typet string_length_type()
186
186
return java_int_type ();
187
187
}
188
188
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
+
189
217
// / Add to the symbol table type declaration for a String-like Java class.
190
218
// / \param class_name: a name for the class such as "java.lang.String"
191
219
// / \param symbol_table: symbol table to which the class will be added
@@ -206,17 +234,10 @@ void java_string_library_preprocesst::add_string_type(
206
234
string_type.components ()[2 ].type () = pointer_type (java_char_type ());
207
235
string_type.set_access (ID_public);
208
236
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" ));
216
237
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) ));
220
241
221
242
symbolt tmp_string_symbol;
222
243
tmp_string_symbol.name =" java::" +id2string (class_name);
@@ -1848,16 +1869,19 @@ bool java_string_library_preprocesst::is_known_string_type(
1848
1869
return string_types.find (class_name)!=string_types.end ();
1849
1870
}
1850
1871
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 ()
1853
1873
{
1854
- character_preprocess.initialize_conversion_table ();
1855
-
1856
1874
string_types=
1857
1875
std::unordered_set<irep_idt, irep_id_hash>{" java.lang.String" ,
1858
1876
" java.lang.StringBuilder" ,
1859
1877
" java.lang.CharSequence" ,
1860
1878
" 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 ();
1861
1885
1862
1886
// The following list of function is organized by libraries, with
1863
1887
// constructors first and then methods in alphabetic order.
0 commit comments