@@ -835,3 +835,45 @@ void get_dependencies_from_generic_parameters(
835835{
836836 get_dependencies_from_generic_parameters_rec (t, refs);
837837}
838+
839+ // / Construct a generic symbol type from base_ref and class_name_prefix which
840+ // / must correspond to a generic type
841+ // / (see \ref java_generic_symbol_typet::java_type_from_string).
842+ // / For instance `java_generic_symbol_typet(symbol_typet("Map"),
843+ // / "Ljava/util/Map<TK;TV;>;", "java/util/Map")` will generate a symbol type
844+ // / with identifier "Map", and two generic types with identifier
845+ // / "java/util/Map::K" and "java/util/Map::V" respectively.
846+ java_generic_symbol_typet::java_generic_symbol_typet (
847+ const symbol_typet &type,
848+ const std::string &base_ref,
849+ const std::string &class_name_prefix)
850+ : symbol_typet(type)
851+ {
852+ set (ID_C_java_generic_symbol, true );
853+ const typet &base_type = java_type_from_string (base_ref, class_name_prefix);
854+ PRECONDITION (is_java_generic_type (base_type));
855+ const java_generic_typet gen_base_type = to_java_generic_type (base_type);
856+ generic_types ().insert (
857+ generic_types ().end (),
858+ gen_base_type.generic_type_arguments ().begin (),
859+ gen_base_type.generic_type_arguments ().end ());
860+ }
861+
862+ // / Check if this symbol has the given generic type. If yes, return its index
863+ // / in the vector of generic types.
864+ // / \param type The type we are looking for.
865+ // / \return The index of the type in the vector of generic types.
866+ optionalt<size_t > java_generic_symbol_typet::generic_type_index (
867+ const java_generic_parametert &type) const
868+ {
869+ const auto &type_variable = type.type_variable ();
870+ const auto &generics = generic_types ();
871+ for (std::size_t i = 0 ; i < generics.size (); ++i)
872+ {
873+ if (
874+ is_java_generic_parameter (generics[i]) &&
875+ to_java_generic_parameter (generics[i]).type_variable () == type_variable)
876+ return i;
877+ }
878+ return {};
879+ }
0 commit comments