Esempio n. 1
0
        void AddAbstractMembers(ClassGen klass, CodeGenerationOptions opt, CodeGeneratorContext context)
        {
            if (!klass.IsAbstract)
            {
                return;
            }

            foreach (var gen in klass.GetAllDerivedInterfaces())
            {
                AddInterfaceAbstractMembers(klass, gen, opt, context);
            }
        }
Esempio n. 2
0
        void AddMemberInvokers(ClassGen klass, CodeGenerationOptions opt, HashSet <string> members)
        {
            AddPropertyInvokers(klass, klass.Properties, members, opt);
            AddMethodInvokers(klass, klass.Methods, members, null, opt);

            foreach (var iface in klass.GetAllDerivedInterfaces())
            {
                AddPropertyInvokers(klass, iface.Properties.Where(p => !klass.ContainsProperty(p.Name, false, false)), members, opt);
                AddMethodInvokers(klass, iface.Methods.Where(m => (opt.SupportDefaultInterfaceMethods || !m.IsInterfaceDefaultMethod) && !klass.ContainsMethod(m, false, false) && !klass.IsCovariantMethod(m) && !klass.ExplicitlyImplementedInterfaceMethods.Contains(m.GetSignature())), members, iface, opt);
            }

            if (klass.BaseGen != null && klass.BaseGen.FullName != "Java.Lang.Object")
            {
                AddMemberInvokers(klass.BaseGen, opt, members);
            }
        }
Esempio n. 3
0
        void AddMethods(ClassGen klass, CodeGenerationOptions opt, CodeGeneratorContext context)
        {
            var methodsToDeclare = klass.Methods.AsEnumerable();

            // This does not exclude overrides (unlike virtual methods) because we're not sure
            // if calling the base interface default method via JNI expectedly dispatches to
            // the derived method.
            var defaultMethods = klass.GetAllDerivedInterfaces()
                                 .SelectMany(i => i.Methods)
                                 .Where(m => m.IsInterfaceDefaultMethod)
                                 .Where(m => !klass.ContainsMethod(m, false, false));

            var overrides = defaultMethods.Where(m => m.OverriddenInterfaceMethod != null);

            var overridens = defaultMethods.Where(m => overrides.Where(_ => _.Name == m.Name && _.JniSignature == m.JniSignature)
                                                  .Any(mm => mm.DeclaringType.GetAllDerivedInterfaces().Contains(m.DeclaringType)));

            methodsToDeclare = opt.SupportDefaultInterfaceMethods ? methodsToDeclare : methodsToDeclare.Concat(defaultMethods.Except(overridens)).Where(m => m.DeclaringType.IsGeneratable);

            foreach (var m in methodsToDeclare)
            {
                var virt = m.IsVirtual;
                m.IsVirtual = !klass.IsFinal && virt;

                if (m.IsAbstract && m.OverriddenInterfaceMethod == null && (opt.SupportDefaultInterfaceMethods || !m.IsInterfaceDefaultMethod))
                {
                    AddAbstractMethodDeclaration(klass, m, null);
                }
                else
                {
                    AddMethod(klass, m, opt);
                }

                context.ContextGeneratedMethods.Add(m);
                m.IsVirtual = virt;
            }

            var methods = klass.Methods.Concat(klass.Properties.Where(p => p.Setter != null).Select(p => p.Setter));

            foreach (var type in methods.Where(m => m.IsListenerConnector && m.EventName != string.Empty).Select(m => m.ListenerType).Distinct())
            {
                AddInlineComment($"#region \"Event implementation for {type.FullName}\"");
                SourceWriterExtensions.AddInterfaceListenerEventsAndProperties(this, type, klass, opt);
                AddInlineComment("#endregion");
            }
        }
Esempio n. 4
0
        public ClassInvokerClass(ClassGen klass, CodeGenerationOptions opt)
        {
            Name = $"{klass.Name}Invoker";

            IsInternal       = true;
            IsPartial        = true;
            UsePriorityOrder = true;

            Inherits = klass.Name;

            foreach (var igen in klass.GetAllDerivedInterfaces().Where(i => i.IsGeneric))
            {
                Implements.Add(opt.GetOutputName(igen.FullName));
            }

            Attributes.Add(new RegisterAttr(klass.RawJniName, noAcw: true, additionalProperties: klass.AdditionalAttributeString())
            {
                UseGlobal = true
            });

            var ctor = new ConstructorWriter {
                Name     = Name,
                IsPublic = true,
                BaseCall = "base (handle, transfer)"
            };

            ctor.Parameters.Add(new MethodParameterWriter("handle", TypeReferenceWriter.IntPtr));
            ctor.Parameters.Add(new MethodParameterWriter("transfer", new TypeReferenceWriter("JniHandleOwnership")));

            Constructors.Add(ctor);

            // ClassInvokerHandle
            Fields.Add(new PeerMembersField(opt, klass.RawJniName, $"{klass.Name}Invoker", false));
            Properties.Add(new JniPeerMembersGetter());
            Properties.Add(new ThresholdTypeGetter());

            AddMemberInvokers(klass, opt, new HashSet <string> ());
        }
Esempio n. 5
0
        public ClassInvokerClass(ClassGen klass, CodeGenerationOptions opt)
        {
            Name = $"{klass.Name}Invoker";

            IsInternal       = true;
            IsPartial        = true;
            UsePriorityOrder = true;

            Inherits = klass.Name;

            foreach (var igen in klass.GetAllDerivedInterfaces().Where(i => i.IsGeneric))
            {
                Implements.Add(opt.GetOutputName(igen.FullName));
            }

            if (opt.CodeGenerationTarget == CodeGenerationTarget.JavaInterop1)
            {
                Attributes.Add(new JniTypeSignatureAttr(klass.RawJniName, false));
            }
            else
            {
                Attributes.Add(new RegisterAttr(klass.RawJniName, noAcw: true, additionalProperties: klass.AdditionalAttributeString())
                {
                    UseGlobal = true
                });
            }

            SourceWriterExtensions.AddSupportedOSPlatform(Attributes, klass, opt);

            ConstructorWriter ctor = opt.CodeGenerationTarget == CodeGenerationTarget.JavaInterop1
                                ? new ConstructorWriter {
                Name       = Name,
                IsPublic   = true,
                BaseCall   = "base (ref reference, options)",
                Parameters =
                {
                    new MethodParameterWriter("reference", new TypeReferenceWriter("ref JniObjectReference")),
                    new MethodParameterWriter("options",   new TypeReferenceWriter("JniObjectReferenceOptions")),
                },
            }
                                : new ConstructorWriter {
                Name       = Name,
                IsPublic   = true,
                BaseCall   = "base (handle, transfer)",
                Parameters =
                {
                    new MethodParameterWriter("handle",   TypeReferenceWriter.IntPtr),
                    new MethodParameterWriter("transfer", new TypeReferenceWriter("JniHandleOwnership")),
                },
            }
            ;

            Constructors.Add(ctor);

            // ClassInvokerHandle
            Fields.Add(new PeerMembersField(opt, klass.RawJniName, $"{klass.Name}Invoker", false));
            Properties.Add(new JniPeerMembersGetter());
            if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1)
            {
                Properties.Add(new ThresholdTypeGetter());
            }

            AddMemberInvokers(klass, opt, new HashSet <string> ());
        }