@@ -117,22 +117,61 @@ typet generate_java_generic_typet::substitute_type(
117117 return parameter_type;
118118 }
119119 }
120- else if (
121- parameter_type.id () == ID_pointer &&
122- parameter_type.subtype ().id () == ID_symbol)
120+ else if (parameter_type.id () == ID_pointer)
123121 {
124- const symbol_typet &array_subtype =
125- to_symbol_type (parameter_type.subtype ());
126- if (is_java_array_tag (array_subtype.get_identifier ()))
122+ if (is_java_generic_type (parameter_type))
127123 {
128- const typet &array_element_type = java_array_element_type (array_subtype);
124+ const java_generic_typet &generic_type =
125+ to_java_generic_type (parameter_type);
126+
127+ java_generic_typet::generic_type_variablest replaced_type_variables;
128+
129+ // Swap each parameter
130+ std::transform (
131+ generic_type.generic_type_variables ().begin (),
132+ generic_type.generic_type_variables ().end (),
133+ std::back_inserter (replaced_type_variables),
134+ [&](const java_generic_parametert &generic_param)
135+ -> java_generic_parametert {
136+ const typet &replacement_type =
137+ substitute_type (generic_param, generic_class, generic_reference);
138+
139+ // This code will be simplified when references aren't considered to
140+ // be generic parameters
141+ if (is_java_generic_parameter (replacement_type))
142+ {
143+ return to_java_generic_parameter (replacement_type);
144+ }
145+ else
146+ {
147+ INVARIANT (
148+ is_reference (replacement_type),
149+ " All generic parameters should be references" );
150+ return java_generic_inst_parametert (
151+ to_symbol_type (replacement_type.subtype ()));
152+ }
153+ });
154+
155+ java_generic_typet new_type = generic_type;
156+ new_type.generic_type_variables () = replaced_type_variables;
157+ return new_type;
158+ }
159+ else if (parameter_type.subtype ().id () == ID_symbol)
160+ {
161+ const symbol_typet &array_subtype =
162+ to_symbol_type (parameter_type.subtype ());
163+ if (is_java_array_tag (array_subtype.get_identifier ()))
164+ {
165+ const typet &array_element_type =
166+ java_array_element_type (array_subtype);
129167
130- const typet &new_array_type =
131- substitute_type (array_element_type, generic_class, generic_reference);
168+ const typet &new_array_type =
169+ substitute_type (array_element_type, generic_class, generic_reference);
132170
133- typet replacement_array_type = java_array_type (' a' );
134- replacement_array_type.subtype ().set (ID_C_element_type, new_array_type);
135- return replacement_array_type;
171+ typet replacement_array_type = java_array_type (' a' );
172+ replacement_array_type.subtype ().set (ID_C_element_type, new_array_type);
173+ return replacement_array_type;
174+ }
136175 }
137176 }
138177 return parameter_type;
0 commit comments