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