Example #1
0
        // For each interface, generate either an abstract method or an explicit implementation method.
        void AddInterfaceAbstractMembers(ClassGen klass, InterfaceGen iface, CodeGenerationOptions opt, CodeGeneratorContext context)
        {
            foreach (var method in iface.Methods.Where(m => !m.IsInterfaceDefaultMethod && !m.IsStatic))
            {
                var mapped = false;
                var sig    = method.GetSignature();

                if (context.ContextGeneratedMethods.Any(_ => _.Name == method.Name && _.JniSignature == method.JniSignature))
                {
                    continue;
                }

                for (var cls = klass; cls != null; cls = cls.BaseGen)
                {
                    if (cls.ContainsMethod(method, false) || cls != klass && klass.ExplicitlyImplementedInterfaceMethods.Contains(sig))
                    {
                        mapped = true;
                        break;
                    }
                }

                if (mapped)
                {
                    continue;
                }

                if (klass.ExplicitlyImplementedInterfaceMethods.Contains(sig))
                {
                    Methods.Add(new MethodExplicitInterfaceImplementation(iface, method, opt));
                }
                else
                {
                    AddAbstractMethodDeclaration(klass, method, iface);
                }

                context.ContextGeneratedMethods.Add(method);
            }

            foreach (var prop in iface.Properties.Where(p => !p.Getter.IsInterfaceDefaultMethod && !p.Getter.IsStatic))
            {
                if (klass.ContainsProperty(prop.Name, false))
                {
                    continue;
                }

                AddAbstractPropertyDeclaration(klass, prop, opt);
            }
        }
Example #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);
            }
        }