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
1780
1780
}
1781
1781
}
1782
1782
1783
- static void write_produce (writer& w, TypeDef const & type)
1783
+ static void write_produce (writer& w, TypeDef const & type, cache const & c )
1784
1784
{
1785
1785
auto format = R"( template <typename D%>
1786
1786
struct produce<D, %> : produce_base<D, %>
@@ -1790,7 +1790,7 @@ namespace cppwinrt
1790
1790
1791
1791
auto generics = type.GenericParam ();
1792
1792
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 );
1794
1794
1795
1795
if (lean_and_mean)
1796
1796
{
Original file line number Diff line number Diff line change @@ -176,7 +176,7 @@ namespace cppwinrt
176
176
write_impl_namespace (w);
177
177
w.write_each <write_consume_definitions>(members.interfaces );
178
178
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 );
180
180
w.write_each <write_dispatch_overridable>(members.classes );
181
181
write_close_namespace (w);
182
182
Original file line number Diff line number Diff line change @@ -855,7 +855,7 @@ namespace cppwinrt
855
855
!members.delegates .empty ();
856
856
}
857
857
858
- static bool can_produce (TypeDef const & type)
858
+ static bool can_produce (TypeDef const & type, cache const & c )
859
859
{
860
860
auto attribute = get_attribute (type, " Windows.Foundation.Metadata" , " ExclusiveToAttribute" );
861
861
@@ -864,12 +864,26 @@ namespace cppwinrt
864
864
return true ;
865
865
}
866
866
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
+
867
882
if (!settings.component )
868
883
{
869
884
return false ;
870
885
}
871
886
872
- auto class_name = get_attribute_value<ElemSig::SystemType>(attribute, 0 ).name ;
873
887
return settings.component_filter .includes (class_name);
874
888
}
875
889
}
Original file line number Diff line number Diff line change @@ -35,8 +35,20 @@ namespace cppwinrt
35
35
name_space(type.TypeNamespace())
36
36
{
37
37
}
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
+ }
38
45
};
39
46
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
+
40
52
bool operator ==(type_name const & left, std::string_view const & right)
41
53
{
42
54
if (left.name .size () + 1 + left.name_space .size () != right.size ())
You can’t perform that action at this time.
0 commit comments