public static ClassGen CreateClass(XElement pkg, XElement elem, CodeGenerationOptions options) { var klass = new ClassGen(CreateGenBaseSupport(pkg, elem, false)) { BaseType = elem.XGetAttribute("extends"), FromXml = true, IsAbstract = elem.XGetAttribute("abstract") == "true", IsFinal = elem.XGetAttribute("final") == "true", // Only use an explicitly set XML attribute Unnest = elem.XGetAttribute("unnest") == "true" ? true : elem.XGetAttribute("unnest") == "false" ? false : !options.SupportNestedInterfaceTypes }; FillApiSince(klass, pkg, elem); SetLineInfo(klass, elem, options); foreach (var child in elem.Elements()) { switch (child.Name.LocalName) { case "implements": var iname = child.XGetAttribute("name-generic-aware"); iname = iname.Length > 0 ? iname : child.XGetAttribute("name"); klass.AddImplementedInterface(iname); break; case "method": if (child.XGetAttribute("visibility") != "kotlin-internal") { klass.AddMethod(CreateMethod(klass, child, options)); } break; case "constructor": if (child.XGetAttribute("visibility") != "kotlin-internal") { klass.Ctors.Add(CreateCtor(klass, child, options)); } break; case "field": if (child.XGetAttribute("visibility") != "kotlin-internal") { klass.AddField(CreateField(klass, child, options)); } break; case "typeParameters": break; // handled at GenBaseSupport default: Report.LogCodedWarning(0, Report.WarningUnexpectedChild, klass, child.Name.ToString()); break; } } return(klass); }
public static ClassGen CreateClass(XElement pkg, XElement elem) { var klass = new ClassGen(CreateGenBaseSupport(pkg, elem, false)) { BaseType = elem.XGetAttribute("extends"), FromXml = true, IsAbstract = elem.XGetAttribute("abstract") == "true", IsFinal = elem.XGetAttribute("final") == "true" }; foreach (var child in elem.Elements()) { switch (child.Name.LocalName) { case "implements": var iname = child.XGetAttribute("name-generic-aware"); iname = iname.Length > 0 ? iname : child.XGetAttribute("name"); klass.AddImplementedInterface(iname); break; case "method": klass.AddMethod(CreateMethod(klass, child)); break; case "constructor": klass.Ctors.Add(CreateCtor(klass, child)); break; case "field": klass.AddField(CreateField(child)); break; case "typeParameters": break; // handled at GenBaseSupport default: Report.Warning(0, Report.WarningClassGen + 1, "unexpected class child {0}.", child.Name); break; } } return(klass); }
public static ClassGen CreateClass(TypeDefinition t, CodeGenerationOptions opt) { var klass = new ClassGen(CreateGenBaseSupport(t, opt)) { IsAbstract = t.IsAbstract, IsFinal = t.IsSealed, IsShallow = opt.UseShallowReferencedTypes, }; foreach (var ifaceImpl in t.Interfaces) { var iface = ifaceImpl.InterfaceType; var def = ifaceImpl.InterfaceType.Resolve(); if (def != null && def.IsNotPublic) { continue; } klass.AddImplementedInterface(iface.FullNameCorrected()); } Action populate = () => { var implements_charsequence = t.Interfaces.Any(it => it.InterfaceType.FullName == "Java.Lang.CharSequence"); foreach (var m in t.Methods) { if (m.IsPrivate || m.IsAssembly || GetRegisterAttribute(m.CustomAttributes) == null) { continue; } if (implements_charsequence && t.Methods.Any(mm => mm.Name == m.Name + "Formatted")) { continue; } if (m.IsConstructor) { klass.Ctors.Add(CreateCtor(klass, m)); } else { klass.AddMethod(CreateMethod(klass, m)); } } foreach (var f in t.Fields) { if (!f.IsPrivate && GetRegisterAttribute(f.CustomAttributes) == null) { klass.AddField(CreateField(f)); } } }; if (klass.IsShallow) { klass.PopulateAction = populate; } else { populate(); } TypeReference nominal_base_type; for (nominal_base_type = t.BaseType; nominal_base_type != null && (nominal_base_type.HasGenericParameters || nominal_base_type.IsGenericInstance); nominal_base_type = nominal_base_type.Resolve().BaseType) { ; // iterate up to non-generic type, at worst System.Object. } klass.BaseType = nominal_base_type?.FullNameCorrected(); return(klass); }