Skip to content

Commit 586a10f

Browse files
authored
WINRT_LEAN_AND_MEAN should not exclude overridable interfaces (#416)
1 parent c721363 commit 586a10f

File tree

4 files changed

+31
-5
lines changed

4 files changed

+31
-5
lines changed

cppwinrt/code_writers.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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
{

cppwinrt/file_writers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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

cppwinrt/helpers.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff 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
}

cppwinrt/type_writers.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff 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())

0 commit comments

Comments
 (0)