Skip to content

Commit 143155b

Browse files
Change naming of implicit type parameters for inner classes
Previously they duplicated the names for the type parameters of the outer classes
1 parent 6469ec1 commit 143155b

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

jbmc/src/java_bytecode/java_bytecode_convert_class.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Author: Daniel Kroening, [email protected]
2525
#include <util/c_types.h>
2626
#include <util/expr_initializer.h>
2727
#include <util/namespace.h>
28+
#include <util/prefix.h>
2829
#include <util/std_expr.h>
2930
#include <util/suffix.h>
3031

@@ -1038,12 +1039,10 @@ static void find_and_replace_parameter(
10381039
const std::string &replacement_parameter_full_name =
10391040
id2string(replacement_parameter_it->type_variable().get_identifier());
10401041

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)));
10471046

10481047
parameter.type_variable_ref().set_identifier(replacement_parameter_full_name);
10491048
}
@@ -1177,12 +1176,19 @@ void mark_java_implicitly_generic_class_type(
11771176
to_java_class_type(outer_class_symbol.type);
11781177
if(is_java_generic_class_type(outer_class_type))
11791178
{
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+
}
11861192
}
11871193
outer_class_delimiter = outer_class_name.rfind('$');
11881194
}

0 commit comments

Comments
 (0)