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