コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }