From 4cd760c9a7f806614f929cf435f99bc2436527fa Mon Sep 17 00:00:00 2001 From: Lauro Moura Date: Fri, 19 Jan 2018 10:30:00 -0300 Subject: [PATCH] eolian_mono: Fix visibility of generated events Protected members do not make sense in sealed classes like the Concrete ones. Also document the placeholder field in extern structures. --- src/bin/eolian_mono/eolian/mono/klass.hh | 19 ++++++++++++++----- .../eolian/mono/struct_definition.hh | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/bin/eolian_mono/eolian/mono/klass.hh b/src/bin/eolian_mono/eolian/mono/klass.hh index 119cd73d12..8657faf573 100644 --- a/src/bin/eolian_mono/eolian/mono/klass.hh +++ b/src/bin/eolian_mono/eolian/mono/klass.hh @@ -72,6 +72,13 @@ get_function_count(grammar::attributes::klass_def const& cls) }); } +template +static bool +is_inherit_context(Context const& context) +{ + return context_find_tag(context).current_wrapper_kind == class_context::inherit; +} + struct get_csharp_type_visitor { typedef get_csharp_type_visitor visitor_type; @@ -281,7 +288,7 @@ struct klass << scope_tab << scope_tab << "Dispose(false);\n" << scope_tab << "}\n" << scope_tab << "///Releases the underlying native instance.\n" - << scope_tab << "protected void Dispose(bool disposing)\n" + << scope_tab << "internal void Dispose(bool disposing)\n" << scope_tab << "{\n" << scope_tab << scope_tab << "if (handle != System.IntPtr.Zero) {\n" << scope_tab << scope_tab << scope_tab << "efl.eo.Globals.efl_unref(handle);\n" @@ -550,6 +557,8 @@ struct klass if (!has_events(cls)) return true; + std::string visibility = is_inherit_context(context) ? "protected" : "private"; + if (!as_generator(scope_tab << "private readonly object eventLock = new object();\n" << scope_tab << "private Dictionary event_cb_count = new Dictionary();\n") .generate(sink, NULL, context)) @@ -627,9 +636,9 @@ struct klass return false; if(!as_generator( - scope_tab << "protected event EventHandler" << wrapper_args_template << " " << upper_name << ";\n" + scope_tab << visibility << " event EventHandler" << wrapper_args_template << " " << upper_name << ";\n" << scope_tab << "///Method to raise event "<< event_name << ".\n" - << scope_tab << "protected void On_" << event_name << "(" << wrapper_args_type << " e)\n" + << scope_tab << visibility << " void On_" << event_name << "(" << wrapper_args_type << " e)\n" << scope_tab << "{\n" << scope_tab << scope_tab << "EventHandler" << wrapper_args_template << " evt;\n" << scope_tab << scope_tab << "lock (eventLock) {\n" @@ -717,9 +726,9 @@ struct klass return false; if (!as_generator( - scope_tab << "protected event EventHandler" << wrapper_args_template << " " << wrapper_evt_name << ";\n" + scope_tab << visibility << " event EventHandler" << wrapper_args_template << " " << wrapper_evt_name << ";\n" << scope_tab << "///Method to raise event "<< wrapper_evt_name << ".\n" - << scope_tab << "protected void On_" << wrapper_evt_name << "(" << wrapper_args_type.str() << " e)\n" + << scope_tab << visibility << " void On_" << wrapper_evt_name << "(" << wrapper_args_type.str() << " e)\n" << scope_tab << "{\n" << scope_tab << scope_tab << "EventHandler" << wrapper_args_template << " evt;\n" << scope_tab << scope_tab << "lock (eventLock) {\n" diff --git a/src/bin/eolian_mono/eolian/mono/struct_definition.hh b/src/bin/eolian_mono/eolian/mono/struct_definition.hh index 5db84e0a9b..324e787748 100644 --- a/src/bin/eolian_mono/eolian/mono/struct_definition.hh +++ b/src/bin/eolian_mono/eolian/mono/struct_definition.hh @@ -67,7 +67,7 @@ struct struct_definition_generator // those 'mini-amd64.c condition fields not met' crashes. if (struct_.fields.size() == 0) { - if (!as_generator("public IntPtr field;\n").generate(sink, nullptr, context)) + if (!as_generator("///Placeholder field\npublic IntPtr field;\n").generate(sink, nullptr, context)) return false; }