From 85c8b6d5175f96e784dcac0811f63bcdd576c35b Mon Sep 17 00:00:00 2001 From: Lauro Moura Date: Thu, 11 Jul 2019 15:50:33 -0300 Subject: [PATCH] csharp: Tag exported API items. Summary: Attributes to be used by the API export tool. For end users, no changes in the public API (except for a new attribute in generated classes). Also simplifies constructor forwarding by not needing to pass the type of the first "generated" class to compare. Currently only automatically generated items are tagged. Depends: D9259 Reviewers: vitor.sousa, felipealmeida Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D9270 --- src/bin/eolian_mono/eolian/mono/enum_definition.hh | 1 + src/bin/eolian_mono/eolian/mono/events.hh | 1 + src/bin/eolian_mono/eolian/mono/function_pointer.hh | 1 + src/bin/eolian_mono/eolian/mono/klass.hh | 9 ++++++--- src/bin/eolian_mono/eolian/mono/struct_definition.hh | 1 + src/bindings/mono/eo_mono/EoWrapper.cs | 5 ++--- src/bindings/mono/eo_mono/iwrapper.cs | 16 ++++++++++++++++ 7 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/bin/eolian_mono/eolian/mono/enum_definition.hh b/src/bin/eolian_mono/eolian/mono/enum_definition.hh index 9224639..4dae3cc 100644 --- a/src/bin/eolian_mono/eolian/mono/enum_definition.hh +++ b/src/bin/eolian_mono/eolian/mono/enum_definition.hh @@ -25,6 +25,7 @@ struct enum_definition_generator if(!as_generator ( + "[Efl.Eo.BindingEntity]\n" "public enum " << string << "\n{\n" ) .generate(sink, name_helpers::typedecl_managed_name(enum_), context)) diff --git a/src/bin/eolian_mono/eolian/mono/events.hh b/src/bin/eolian_mono/eolian/mono/events.hh index c1a4503..d5d57c4 100644 --- a/src/bin/eolian_mono/eolian/mono/events.hh +++ b/src/bin/eolian_mono/eolian/mono/events.hh @@ -250,6 +250,7 @@ struct event_argument_wrapper_generator return as_generator("///Event argument wrapper for event .\n" + << "[Efl.Eo.BindingEntity]\n" << "public class " << name_helpers::managed_event_args_short_name(evt) << " : EventArgs {\n" << scope_tab << "///Actual event payload.\n" << scope_tab << "public " << type << " arg { get; set; }\n" diff --git a/src/bin/eolian_mono/eolian/mono/function_pointer.hh b/src/bin/eolian_mono/eolian/mono/function_pointer.hh index f724d80..721368f 100644 --- a/src/bin/eolian_mono/eolian/mono/function_pointer.hh +++ b/src/bin/eolian_mono/eolian/mono/function_pointer.hh @@ -44,6 +44,7 @@ struct function_pointer { // C# visible delegate if (!as_generator(documentation + << "[Efl.Eo.BindingEntity]\n" << "public delegate " << type << " " << string << "(" << (parameter % ", ") << ");\n") .generate(sink, std::make_tuple(f, f.return_type, f_name, f.parameters), funcptr_ctx)) diff --git a/src/bin/eolian_mono/eolian/mono/klass.hh b/src/bin/eolian_mono/eolian/mono/klass.hh index 99dac21..a98866e 100644 --- a/src/bin/eolian_mono/eolian/mono/klass.hh +++ b/src/bin/eolian_mono/eolian/mono/klass.hh @@ -106,6 +106,9 @@ struct klass .generate(sink, attributes::unused, iface_cxt)) return false; + if(!as_generator("[Efl.Eo.BindingEntity]\n").generate(sink, attributes::unused, iface_cxt)) + return false; + if(!as_generator ( "public " /*<< class_type*/ "interface" /*<<*/ " " << string << " : " @@ -279,6 +282,7 @@ struct klass ( documentation << "[" << name_helpers::klass_full_native_inherit_name(cls) << "]\n" + << "[Efl.Eo.BindingEntity]\n" << "public " << class_type << " " << name_helpers::klass_concrete_name(cls) << " : " << (klass_full_concrete_or_interface_name % ",") // classes << (root ? "Efl.Eo.EoWrapper" : "") // ... or root @@ -502,7 +506,7 @@ struct klass // For constructors with arguments, the parent is also required, as optional parameters can't come before non-optional paramenters. << scope_tab << "public " << inherit_name << "(Efl.Object parent" << ((constructors.size() > 0) ? "" : "= null") << "\n" << scope_tab << scope_tab << scope_tab << *(", " << constructor_param ) << ") : " - << "base(" << name_helpers::klass_get_name(cls) << "(), typeof(" << inherit_name << "), parent)\n" + << "base(" << name_helpers::klass_get_name(cls) << "(), parent)\n" << scope_tab << "{\n" << (*(scope_tab << scope_tab << constructor_invocation << "\n")) << scope_tab << scope_tab << "FinishInstantiation();\n" @@ -542,9 +546,8 @@ struct klass scope_tab << "/// Initializes a new instance of the class.\n" << scope_tab << "/// Internal usage: Constructor to forward the wrapper initialization to the root class that interfaces with native code. Should not be used directly.\n" << scope_tab << "/// The pointer to the base native Eo class.\n" - << scope_tab << "/// The managed type of the public constructor that originated this call.\n" << scope_tab << "/// The Efl.Object parent of this instance.\n" - << scope_tab << "protected " << inherit_name << "(IntPtr baseKlass, System.Type managedType, Efl.Object parent) : base(baseKlass, managedType, parent)\n" + << scope_tab << "protected " << inherit_name << "(IntPtr baseKlass, Efl.Object parent) : base(baseKlass, parent)\n" << scope_tab << "{\n" << scope_tab << "}\n\n" ).generate(sink, attributes::unused, context); diff --git a/src/bin/eolian_mono/eolian/mono/struct_definition.hh b/src/bin/eolian_mono/eolian/mono/struct_definition.hh index 851b9c4..c949783 100644 --- a/src/bin/eolian_mono/eolian/mono/struct_definition.hh +++ b/src/bin/eolian_mono/eolian/mono/struct_definition.hh @@ -396,6 +396,7 @@ struct struct_definition_generator if(!as_generator ( indent << "[StructLayout(LayoutKind.Sequential)]\n" + << indent << "[Efl.Eo.BindingEntity]\n" << indent << "public struct " << string << "\n" << indent << "{\n" ) diff --git a/src/bindings/mono/eo_mono/EoWrapper.cs b/src/bindings/mono/eo_mono/EoWrapper.cs index 03edea0..c2ee5e2 100644 --- a/src/bindings/mono/eo_mono/EoWrapper.cs +++ b/src/bindings/mono/eo_mono/EoWrapper.cs @@ -67,15 +67,14 @@ public abstract class EoWrapper : IWrapper, IDisposable /// Internal usage: Constructor to actually call the native library constructors. C# subclasses /// must use the public constructor only. /// The pointer to the base native Eo class. - /// The managed type of the public constructor that originated this call. /// The Efl.Object parent of this instance. /// Name of the file from where the constructor is called. /// Number of the line from where the constructor is called. - protected EoWrapper(IntPtr baseKlass, System.Type managedType, Efl.Object parent, + protected EoWrapper(IntPtr baseKlass, Efl.Object parent, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) { - generated = ((object)this).GetType() == managedType; + generated = Efl.Eo.BindingEntity.IsBindingEntity(((object)this).GetType()); IntPtr actual_klass = baseKlass; if (!generated) { diff --git a/src/bindings/mono/eo_mono/iwrapper.cs b/src/bindings/mono/eo_mono/iwrapper.cs index 833ae78..09c82a7 100644 --- a/src/bindings/mono/eo_mono/iwrapper.cs +++ b/src/bindings/mono/eo_mono/iwrapper.cs @@ -775,6 +775,22 @@ public class PrivateNativeClass : NativeClass } } +[System.AttributeUsage(System.AttributeTargets.Class | + System.AttributeTargets.Interface | + System.AttributeTargets.Enum | + System.AttributeTargets.Delegate | + System.AttributeTargets.Struct, + AllowMultiple = false, + Inherited = false) +] +public class BindingEntity: System.Attribute +{ + public static bool IsBindingEntity(System.Type t) + { + return Attribute.GetCustomAttribute(t, typeof(BindingEntity), false) != null; + } +} + public interface IWrapper { /// Pointer to internal Eo instance. -- 2.7.4