public static JavaFieldModel ParseField(JavaTypeModel type, XElement element)
        {
            var field = new JavaFieldModel(
                name: element.XGetAttribute("name"),
                visibility: element.XGetAttribute("visibility"),
                type: element.XGetAttribute("type"),
                typeGeneric: element.XGetAttribute("type-generic-aware"),
                isStatic: element.XGetAttributeAsBool("static"),
                value: element.Attribute("value")?.Value,
                declaringType: type,
                isFinal: element.XGetAttributeAsBool("final"),
                deprecated: element.XGetAttribute("deprecated"),
                jniSignature: element.XGetAttribute("jni-signature"),
                isTransient: element.XGetAttributeAsBool("transient"),
                isVolatile: element.XGetAttributeAsBool("volatile"),
                isNotNull: element.XGetAttributeAsBool("not-null")
                );

            if (element.XGetAttribute("merge.SourceFile") is string source && source.HasValue())
            {
                field.PropertyBag.Add("merge.SourceFile", source);
            }
            if (element.XGetAttribute("deprecated-since") is string dep && dep.HasValue())
            {
                field.PropertyBag.Add("deprecated-since", dep);
            }

            return(field);
        }
Ejemplo n.º 2
0
        static void AddReferenceTypeRecursive(JavaTypeModel type, JavaTypeCollection collection)
        {
            collection.AddReferencedType(type);

            foreach (var nested in type.NestedTypes)
            {
                AddReferenceTypeRecursive(nested, collection);
            }
        }
        static void SaveType(JavaTypeModel type, XmlWriter writer)
        {
            if (type is JavaClassModel cls)
            {
                SaveType(type, writer, "class", XmlConvert.ToString(cls.IsAbstract), cls.BaseType, cls.BaseTypeGeneric, cls.BaseTypeJni);
            }
            else
            {
                SaveType(type, writer, "interface", "true", null, null, null);
            }

            foreach (var nested in type.NestedTypes)
            {
                SaveType(nested, writer);
            }
        }
        public static JavaMethodModel ParseMethod(JavaTypeModel type, XElement element)
        {
            var method = new JavaMethodModel(
                javaName: element.XGetAttribute("name"),
                javaVisibility: element.XGetAttribute("visibility"),
                javaAbstract: element.XGetAttributeAsBool("abstract"),
                javaFinal: element.XGetAttributeAsBool("final"),
                javaStatic: element.XGetAttributeAsBool("static"),
                javaReturn: element.XGetAttribute("return"),
                javaDeclaringType: type,
                deprecated: element.XGetAttribute("deprecated"),
                jniSignature: element.XGetAttribute("jni-signature"),
                isSynthetic: element.XGetAttributeAsBool("synthetic"),
                isBridge: element.XGetAttributeAsBool("bridge"),
                returnJni: element.XGetAttribute("jni-return"),
                isNative: element.XGetAttributeAsBool("native"),
                isSynchronized: element.XGetAttributeAsBool("synchronized"),
                returnNotNull: element.XGetAttributeAsBool("return-not-null")
                );

            if (element.Element("typeParameters") is XElement tp)
            {
                ParseTypeParameters(method.TypeParameters, tp);
            }

            foreach (var child in element.Elements("parameter"))
            {
                method.Parameters.Add(ParseParameter(method, child));
            }
            foreach (var child in element.Elements("exception"))
            {
                method.Exceptions.Add(ParseException(child));
            }

            if (element.XGetAttribute("merge.SourceFile") is string source && source.HasValue())
            {
                method.PropertyBag.Add("merge.SourceFile", source);
            }
            if (element.XGetAttribute("deprecated-since") is string dep && dep.HasValue())
            {
                method.PropertyBag.Add("deprecated-since", dep);
            }

            return(method);
        }
Ejemplo n.º 5
0
        public static JavaMethodModel?ParseMethod(MethodDefinition method, JavaTypeModel declaringType)
        {
            if (method.IsPrivate || method.IsAssembly)
            {
                return(null);
            }

            var obs_attr = GetObsoleteAttribute(method.CustomAttributes);
            var reg_attr = GetRegisterAttribute(method.CustomAttributes);

            if (reg_attr is null)
            {
                return(null);
            }

            var deprecated    = (obs_attr != null) ? (string)obs_attr.ConstructorArguments [0].Value ?? "deprecated" : "not deprecated";
            var jni_signature = JniSignature.Parse((string)reg_attr.ConstructorArguments [1].Value !);

            var model = new JavaMethodModel(
                javaName: (string)reg_attr.ConstructorArguments [0].Value,
                javaVisibility: method.Visibility(),
                javaAbstract: method.IsAbstract,
                javaFinal: method.IsFinal,
                javaStatic: method.IsStatic,
                javaReturn: jni_signature.Return.Type,
                javaDeclaringType: declaringType,
                deprecated: deprecated,
                jniSignature: jni_signature.ToString(),
                isSynthetic: false,
                isBridge: false,
                returnJni: jni_signature.Return.Jni,
                isNative: false,
                isSynchronized: false,
                returnNotNull: false
                );

            for (var i = 0; i < jni_signature.Parameters.Count; i++)
            {
                model.Parameters.Add(ParseParameterModel(model, jni_signature.Parameters [i], method.Parameters [i]));
            }

            return(model);
        }
Ejemplo n.º 6
0
        static void ParseImplementedInterfaces(TypeDefinition type, JavaTypeModel model)
        {
            foreach (var iface_impl in type.Interfaces)
            {
                var iface     = iface_impl.InterfaceType;
                var iface_def = iface.Resolve();

                if (iface_def is null || iface_def.IsNotPublic)
                {
                    continue;
                }

                if (GetRegisterAttribute(iface_def.CustomAttributes) is CustomAttribute reg_attr)
                {
                    var jni  = (string)reg_attr.ConstructorArguments [0].Value;
                    var name = jni.Replace('/', '.').Replace('$', '.');

                    model.Implements.Add(new JavaImplementsModel(name, name, $"L{jni};"));
                }
            }
        }
        public static JavaConstructorModel ParseConstructor(JavaTypeModel type, XElement element)
        {
            var method = new JavaConstructorModel(
                javaName: element.XGetAttribute("name"),
                javaVisibility: element.XGetAttribute("visibility"),
                javaStatic: element.XGetAttributeAsBool("static"),
                javaDeclaringType: type,
                deprecated: element.XGetAttribute("deprecated"),
                jniSignature: element.XGetAttribute("jni-signature"),
                isSynthetic: element.XGetAttributeAsBool("synthetic"),
                isBridge: element.XGetAttributeAsBool("bridge")
                );

            // Yes, constructors in Java can have generic type parameters ¯\_(ツ)_/¯
            if (element.Element("typeParameters") is XElement tp)
            {
                ParseTypeParameters(method.TypeParameters, tp);
            }

            foreach (var child in element.Elements("exception"))
            {
                method.Exceptions.Add(ParseException(child));
            }

            foreach (var child in element.Elements("parameter"))
            {
                method.Parameters.Add(ParseParameter(method, child));
            }

            if (element.XGetAttribute("merge.SourceFile") is string source && source.HasValue())
            {
                method.PropertyBag.Add("merge.SourceFile", source);
            }
            if (element.XGetAttribute("deprecated-since") is string dep && dep.HasValue())
            {
                method.PropertyBag.Add("deprecated-since", dep);
            }

            return(method);
        }
        static void SaveType(JavaTypeModel cls, XmlWriter writer, string elementName, string abs, string?ext, string?extgen, string?jniExt)
        {
            writer.WriteStartElement(elementName);

            writer.WriteAttributeStringIfValue("abstract", abs);
            writer.WriteAttributeString("deprecated", cls.Deprecated);
            writer.WriteAttributeStringIfValue("extends", ext);
            writer.WriteAttributeStringIfValue("extends-generic-aware", extgen);
            writer.WriteAttributeStringIfValue("jni-extends", jniExt);
            writer.WriteAttributeString("final", XmlConvert.ToString(cls.IsFinal));
            writer.WriteAttributeString("name", cls.NestedName);
            writer.WriteAttributeString("static", XmlConvert.ToString(cls.IsStatic));
            writer.WriteAttributeString("visibility", cls.Visibility);
            writer.WriteAttributeStringIfValue("jni-signature", cls.ExtendedJniSignature);

            if (cls.PropertyBag.TryGetValue("merge.SourceFile", out var source))
            {
                writer.WriteAttributeString("merge.SourceFile", source);
            }
            if (cls.PropertyBag.TryGetValue("deprecated-since", out var dep))
            {
                writer.WriteAttributeString("deprecated-since", dep);
            }

            SaveTypeParameters(cls.TypeParameters, writer);

            foreach (var imp in cls.Implements.OrderBy(i => i.Name, StringComparer.Ordinal))
            {
                writer.WriteStartElement("implements");
                writer.WriteAttributeString("name", imp.Name);
                writer.WriteAttributeString("name-generic-aware", imp.NameGeneric);
                writer.WriteAttributeStringIfValue("jni-type", imp.JniType);

                if (imp.PropertyBag.TryGetValue("merge.SourceFile", out var imp_source))
                {
                    writer.WriteAttributeString("merge.SourceFile", imp_source);
                }

                WriteFullEndElement(writer);
            }

            if (cls is JavaClassModel klass)
            {
                foreach (var m in klass.Constructors.OrderBy(m => m.Name, StringComparer.OrdinalIgnoreCase).ThenBy(m => string.Join(", ", m.Parameters.Select(p => p.Type))).ThenBy(m => m.IsSynthetic))
                {
                    SaveConstructor(m, writer);
                }
            }

            foreach (var m in cls.Methods.OrderBy(m => m.Name, StringComparer.Ordinal).ThenBy(m => string.Join(", ", m.Parameters.Select(p => p.Type))).ThenBy(m => m.IsSynthetic))
            {
                SaveMethod(m, writer);
            }

            foreach (var m in cls.Fields.OrderBy(m => m.Name, StringComparer.OrdinalIgnoreCase))
            {
                SaveField(m, writer);
            }

            WriteFullEndElement(writer);
        }