// 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); } }
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); } }