|
25 | 25 | #include <util/c_types.h>
|
26 | 26 | #include <util/expr_initializer.h>
|
27 | 27 | #include <util/namespace.h>
|
| 28 | +#include <util/prefix.h> |
28 | 29 | #include <util/std_expr.h>
|
29 | 30 | #include <util/suffix.h>
|
30 | 31 |
|
@@ -1038,12 +1039,10 @@ static void find_and_replace_parameter(
|
1038 | 1039 | const std::string &replacement_parameter_full_name =
|
1039 | 1040 | id2string(replacement_parameter_it->type_variable().get_identifier());
|
1040 | 1041 |
|
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); |
| 1042 | + // Check the replacement parameter comes from an outer class |
| 1043 | + PRECONDITION(has_prefix( |
| 1044 | + replacement_parameter_full_name, |
| 1045 | + get_without_final_name_component(parameter_full_name))); |
1047 | 1046 |
|
1048 | 1047 | parameter.type_variable_ref().set_identifier(replacement_parameter_full_name);
|
1049 | 1048 | }
|
@@ -1177,12 +1176,19 @@ void mark_java_implicitly_generic_class_type(
|
1177 | 1176 | to_java_class_type(outer_class_symbol.type);
|
1178 | 1177 | if(is_java_generic_class_type(outer_class_type))
|
1179 | 1178 | {
|
1180 |
| - const auto &outer_generic_type_parameters = |
1181 |
| - to_java_generic_class_type(outer_class_type).generic_types(); |
1182 |
| - implicit_generic_type_parameters.insert( |
1183 |
| - implicit_generic_type_parameters.begin(), |
1184 |
| - outer_generic_type_parameters.begin(), |
1185 |
| - outer_generic_type_parameters.end()); |
| 1179 | + for(const java_generic_parametert &outer_generic_type_parameter : |
| 1180 | + to_java_generic_class_type(outer_class_type).generic_types()) |
| 1181 | + { |
| 1182 | + // Create a new generic type parameter with name in the form: |
| 1183 | + // java::Outer$Inner::Outer::T |
| 1184 | + irep_idt identifier = qualified_class_name + "::" + |
| 1185 | + id2string(strip_java_namespace_prefix( |
| 1186 | + outer_generic_type_parameter.get_name())); |
| 1187 | + java_generic_parameter_tagt bound = to_java_generic_parameter_tag( |
| 1188 | + outer_generic_type_parameter.subtype()); |
| 1189 | + bound.type_variable_ref().set_identifier(identifier); |
| 1190 | + implicit_generic_type_parameters.emplace_back(identifier, bound); |
| 1191 | + } |
1186 | 1192 | }
|
1187 | 1193 | outer_class_delimiter = outer_class_name.rfind('$');
|
1188 | 1194 | }
|
|
0 commit comments