@@ -989,6 +989,16 @@ bool java_bytecode_convert_class(
989
989
return true ;
990
990
}
991
991
992
+ static std::string get_final_name_component (const std::string &name)
993
+ {
994
+ return name.substr (name.rfind (" ::" ) + 2 );
995
+ }
996
+
997
+ static std::string get_without_final_name_component (const std::string &name)
998
+ {
999
+ return name.substr (0 , name.rfind (" ::" ));
1000
+ }
1001
+
992
1002
// / For a given generic type parameter, check if there is a parameter in the
993
1003
// / given vector of replacement parameters with a matching name. If yes,
994
1004
// / replace the identifier of the parameter at hand by the identifier of
@@ -1008,39 +1018,34 @@ static void find_and_replace_parameter(
1008
1018
// get the name of the parameter, e.g., `T` from `java::Class::T`
1009
1019
const std::string ¶meter_full_name =
1010
1020
id2string (parameter.type_variable_ref ().get_identifier ());
1011
- const std::string & parameter_name =
1012
- parameter_full_name. substr (parameter_full_name. rfind ( " :: " ) + 2 );
1021
+ const std::string parameter_name =
1022
+ get_final_name_component (parameter_full_name);
1013
1023
1014
1024
// check if there is a replacement parameter with the same name
1015
- const auto replacement_parameter_p = std::find_if (
1025
+ const auto replacement_parameter_it = std::find_if (
1016
1026
replacement_parameters.begin (),
1017
1027
replacement_parameters.end (),
1018
1028
[¶meter_name](const java_generic_parametert &replacement_param)
1019
1029
{
1020
- const std::string &replacement_parameter_full_name =
1021
- id2string (replacement_param.type_variable ().get_identifier ());
1022
- return parameter_name.compare (
1023
- replacement_parameter_full_name.substr (
1024
- replacement_parameter_full_name.rfind (" ::" ) + 2 )) == 0 ;
1030
+ return parameter_name ==
1031
+ get_final_name_component (
1032
+ id2string (replacement_param.type_variable ().get_identifier ()));
1025
1033
});
1034
+ if (replacement_parameter_it == replacement_parameters.end ())
1035
+ return ;
1026
1036
1027
- // if a replacement parameter was found, update the identifier
1028
- if (replacement_parameter_p != replacement_parameters.end ())
1029
- {
1030
- const std::string &replacement_parameter_full_name =
1031
- id2string (replacement_parameter_p->type_variable ().get_identifier ());
1032
-
1033
- // the replacement parameter is a viable one, i.e., it comes from an outer
1034
- // class
1035
- PRECONDITION (
1036
- parameter_full_name.substr (0 , parameter_full_name.rfind (" ::" ))
1037
- .compare (
1038
- replacement_parameter_full_name.substr (
1039
- 0 , replacement_parameter_full_name.rfind (" ::" ))) > 0 );
1040
-
1041
- parameter.type_variable_ref ().set_identifier (
1042
- replacement_parameter_full_name);
1043
- }
1037
+ // A replacement parameter was found, update the identifier
1038
+ const std::string &replacement_parameter_full_name =
1039
+ id2string (replacement_parameter_it->type_variable ().get_identifier ());
1040
+
1041
+ // the replacement parameter is a viable one, i.e., it comes from an outer
1042
+ // class
1043
+ PRECONDITION (
1044
+ get_without_final_name_component (parameter_full_name)
1045
+ .compare (
1046
+ get_without_final_name_component (replacement_parameter_full_name)) > 0 );
1047
+
1048
+ parameter.type_variable_ref ().set_identifier (replacement_parameter_full_name);
1044
1049
}
1045
1050
1046
1051
// / Recursively find all generic type parameters of a given type and replace
@@ -1136,12 +1141,13 @@ void mark_java_implicitly_generic_class_type(
1136
1141
{
1137
1142
const std::string qualified_class_name = " java::" + id2string (class_name);
1138
1143
PRECONDITION (symbol_table.has_symbol (qualified_class_name));
1144
+ // This will have its type changed
1139
1145
symbolt &class_symbol = symbol_table.get_writeable_ref (qualified_class_name);
1140
- java_class_typet &class_type = to_java_class_type (class_symbol.type );
1146
+ const java_class_typet &class_type = to_java_class_type (class_symbol.type );
1141
1147
1142
1148
// the class must be an inner non-static class, i.e., have a field this$*
1143
1149
// TODO this should be simplified once static inner classes are marked
1144
- // during parsing
1150
+ // during parsing
1145
1151
bool no_this_field = std::none_of (
1146
1152
class_type.components ().begin (),
1147
1153
class_type.components ().end (),
@@ -1158,7 +1164,7 @@ void mark_java_implicitly_generic_class_type(
1158
1164
// the order from the outer-most inwards
1159
1165
std::vector<java_generic_parametert> implicit_generic_type_parameters;
1160
1166
std::string::size_type outer_class_delimiter =
1161
- qualified_class_name.rfind (" $ " );
1167
+ qualified_class_name.rfind (' $ ' );
1162
1168
while (outer_class_delimiter != std::string::npos)
1163
1169
{
1164
1170
std::string outer_class_name =
@@ -1178,7 +1184,7 @@ void mark_java_implicitly_generic_class_type(
1178
1184
outer_generic_type_parameters.begin (),
1179
1185
outer_generic_type_parameters.end ());
1180
1186
}
1181
- outer_class_delimiter = outer_class_name.rfind (" $ " );
1187
+ outer_class_delimiter = outer_class_name.rfind (' $ ' );
1182
1188
}
1183
1189
else
1184
1190
{
@@ -1191,19 +1197,21 @@ void mark_java_implicitly_generic_class_type(
1191
1197
// implicitly generic and update identifiers of type parameters used in fields
1192
1198
if (!implicit_generic_type_parameters.empty ())
1193
1199
{
1194
- class_symbol. type = java_implicitly_generic_class_typet (
1200
+ java_implicitly_generic_class_typet new_class_type (
1195
1201
class_type, implicit_generic_type_parameters);
1196
1202
1197
- for (auto &field : class_type .components ())
1203
+ for (auto &field : new_class_type .components ())
1198
1204
{
1199
1205
find_and_replace_parameters (
1200
1206
field.type (), implicit_generic_type_parameters);
1201
1207
}
1202
1208
1203
- for (auto &base : class_type .bases ())
1209
+ for (auto &base : new_class_type .bases ())
1204
1210
{
1205
1211
find_and_replace_parameters (
1206
1212
base.type (), implicit_generic_type_parameters);
1207
1213
}
1214
+
1215
+ class_symbol.type = new_class_type;
1208
1216
}
1209
1217
}
0 commit comments