File tree Expand file tree Collapse file tree 4 files changed +31
-5
lines changed
Expand file tree Collapse file tree 4 files changed +31
-5
lines changed Original file line number Diff line number Diff line change @@ -1780,7 +1780,7 @@ namespace cppwinrt
17801780 }
17811781 }
17821782
1783- static void write_produce (writer& w, TypeDef const & type)
1783+ static void write_produce (writer& w, TypeDef const & type, cache const & c )
17841784 {
17851785 auto format = R"( template <typename D%>
17861786 struct produce<D, %> : produce_base<D, %>
@@ -1790,7 +1790,7 @@ namespace cppwinrt
17901790
17911791 auto generics = type.GenericParam ();
17921792 auto guard{ w.push_generic_params (generics) };
1793- bool const lean_and_mean = !can_produce (type);
1793+ bool const lean_and_mean = !can_produce (type, c );
17941794
17951795 if (lean_and_mean)
17961796 {
Original file line number Diff line number Diff line change @@ -176,7 +176,7 @@ namespace cppwinrt
176176 write_impl_namespace (w);
177177 w.write_each <write_consume_definitions>(members.interfaces );
178178 w.write_each <write_delegate_implementation>(members.delegates );
179- w.write_each <write_produce>(members.interfaces );
179+ w.write_each <write_produce>(members.interfaces , c );
180180 w.write_each <write_dispatch_overridable>(members.classes );
181181 write_close_namespace (w);
182182
Original file line number Diff line number Diff line change @@ -855,7 +855,7 @@ namespace cppwinrt
855855 !members.delegates .empty ();
856856 }
857857
858- static bool can_produce (TypeDef const & type)
858+ static bool can_produce (TypeDef const & type, cache const & c )
859859 {
860860 auto attribute = get_attribute (type, " Windows.Foundation.Metadata" , " ExclusiveToAttribute" );
861861
@@ -864,12 +864,26 @@ namespace cppwinrt
864864 return true ;
865865 }
866866
867+ auto interface_name = type_name (type);
868+ auto class_name = get_attribute_value<ElemSig::SystemType>(attribute, 0 ).name ;
869+ auto class_type = c.find_required (class_name);
870+
871+ for (auto && impl : class_type.InterfaceImpl ())
872+ {
873+ if (has_attribute (impl, " Windows.Foundation.Metadata" , " OverridableAttribute" ))
874+ {
875+ if (interface_name == type_name (impl.Interface ()))
876+ {
877+ return true ;
878+ }
879+ }
880+ }
881+
867882 if (!settings.component )
868883 {
869884 return false ;
870885 }
871886
872- auto class_name = get_attribute_value<ElemSig::SystemType>(attribute, 0 ).name ;
873887 return settings.component_filter .includes (class_name);
874888 }
875889}
Original file line number Diff line number Diff line change @@ -35,8 +35,20 @@ namespace cppwinrt
3535 name_space(type.TypeNamespace())
3636 {
3737 }
38+
39+ explicit type_name (coded_index<TypeDefOrRef> const & type)
40+ {
41+ auto const & [type_namespace, type_name] = get_type_namespace_and_name (type);
42+ name_space = type_namespace;
43+ name = type_name;
44+ }
3845 };
3946
47+ bool operator ==(type_name const & left, type_name const & right)
48+ {
49+ return left.name == right.name && left.name_space == right.name_space ;
50+ }
51+
4052 bool operator ==(type_name const & left, std::string_view const & right)
4153 {
4254 if (left.name .size () + 1 + left.name_space .size () != right.size ())
You can’t perform that action at this time.
0 commit comments