@@ -117,22 +117,61 @@ typet generate_java_generic_typet::substitute_type(
117
117
return parameter_type;
118
118
}
119
119
}
120
- else if (
121
- parameter_type.id () == ID_pointer &&
122
- parameter_type.subtype ().id () == ID_symbol)
120
+ else if (parameter_type.id () == ID_pointer)
123
121
{
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))
127
123
{
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);
129
167
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);
132
170
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
+ }
136
175
}
137
176
}
138
177
return parameter_type;
0 commit comments