From eeb783ed8b947e03f2fd708099e4ea4bceabeb7b Mon Sep 17 00:00:00 2001 From: Sophia Chen Date: Fri, 17 Jan 2025 14:47:18 -0800 Subject: [PATCH 1/2] make virtual --- src/cswinrt/code_writers.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cswinrt/code_writers.h b/src/cswinrt/code_writers.h index 37d90807d..a932b681c 100644 --- a/src/cswinrt/code_writers.h +++ b/src/cswinrt/code_writers.h @@ -1208,7 +1208,7 @@ namespace cswinrt // If this interface is overridable but the type is sealed, don't mark the member as virtual. // The C# compiler errors out about declaring a virtual member in a sealed class. - if (is_overridable && !class_type.Flags().Sealed()) + if (is_overridable && !class_type.Flags().Sealed() || settings.abstract_class) { // All overridable methods in the WinRT type system have protected visibility. access_spec = "protected "; @@ -1537,7 +1537,7 @@ remove => %; visibility = "protected "; } - if (is_overridable) + if (is_overridable || settings.abstract_class) { visibility = "protected virtual "; } @@ -3459,7 +3459,7 @@ private % AsInternal(InterfaceTag<%> _) => % ?? Make_%(); auto& [prop_type, getter_target, getter_platform, setter_target, setter_platform, is_overridable, is_public, is_private, getter_prop, setter_prop] = prop_data; if (is_private) continue; std::string_view access_spec = is_public ? "public "sv : "protected "sv; - std::string_view method_spec = is_overridable ? "virtual "sv : ""sv; + std::string_view method_spec = (is_overridable || settings.abstract_class)? "virtual "sv : ""sv; write_property(w, prop_name, prop_name, prop_type, getter_prop.has_value() ? w.write_temp("%", bind(getter_prop.value().first)) : getter_target, setter_prop.has_value() ? w.write_temp("%", bind(setter_prop.value().first)) : setter_target, From d390da9d7c1d05ed8be39b6013868878b43416d4 Mon Sep 17 00:00:00 2001 From: Sophia Chen Date: Tue, 21 Jan 2025 16:47:14 -0800 Subject: [PATCH 2/2] for properties --- src/cswinrt/code_writers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cswinrt/code_writers.h b/src/cswinrt/code_writers.h index a932b681c..c1bd3ba86 100644 --- a/src/cswinrt/code_writers.h +++ b/src/cswinrt/code_writers.h @@ -3458,7 +3458,7 @@ private % AsInternal(InterfaceTag<%> _) => % ?? Make_%(); { auto& [prop_type, getter_target, getter_platform, setter_target, setter_platform, is_overridable, is_public, is_private, getter_prop, setter_prop] = prop_data; if (is_private) continue; - std::string_view access_spec = is_public ? "public "sv : "protected "sv; + std::string_view access_spec = (is_public && !settings.abstract_class) ? "public "sv : "protected "sv; std::string_view method_spec = (is_overridable || settings.abstract_class)? "virtual "sv : ""sv; write_property(w, prop_name, prop_name, prop_type, getter_prop.has_value() ? w.write_temp("%", bind(getter_prop.value().first)) : getter_target,