Пример #1
0
        /// <summary>
        /// Gets a Dex method reference for the given type reference.
        /// </summary>
        internal static MethodReference GetReference(this XMethodReference method, DexTargetPackage targetPackage)
        {
            if (method == null)
            {
                throw new ArgumentNullException("method");
            }

//#if DEBUG
//            if (method.DeclaringType.IsArray)
//            {
//                Debugger.Launch();
//            }
//#endif

            // Resolve the type to a method definition
            XMethodDefinition methodDef;

            if (method.TryResolve(out methodDef))
            {
                string className;
                string memberName;
                string descriptor;
                if (methodDef.TryGetDexImportNames(out memberName, out descriptor, out className))
                {
                    var prototype = PrototypeBuilder.ParseMethodSignature(descriptor);
                    return(new MethodReference(GetDeclaringTypeReference(className), memberName, prototype));
                }

                // Method is in the assembly itself
                // Use the mapping
                return(targetPackage.NameConverter.GetMethod(methodDef));
            }

            var javaMethod = method as XModel.Java.XBuilder.JavaMethodReference;

            if (javaMethod != null)
            {
                var prototype = PrototypeBuilder.ParseMethodSignature(javaMethod.JavaDecriptor);
                return(new MethodReference(GetDeclaringTypeReference(javaMethod.JavaClassName), javaMethod.JavaName, prototype));
            }

            // Return reference to a method we do not know yet
            throw new ResolveException(string.Format("Method {0} not found", method.FullName));
        }
Пример #2
0
        /// <summary>
        /// Gets a Dex field reference for the given field reference.
        /// </summary>
        internal static FieldReference GetReference(this XFieldReference field, DexTargetPackage targetPackage)
        {
            if (field == null)
            {
                throw new ArgumentNullException("field");
            }

            // Resolve the field to a field definition
            XFieldDefinition fieldDef;

            if (field.TryResolve(out fieldDef))
            {
                string className;
                string memberName;
                string descriptor;
                if (fieldDef.TryGetDexImportNames(out memberName, out descriptor, out className))
                {
                    var prototype = PrototypeBuilder.ParseFieldType(descriptor);
                    return(new FieldReference(new ClassReference(className), memberName, prototype));
                }
                if (fieldDef.TryGetJavaImportNames(out memberName, out descriptor, out className))
                {
                    var prototype = PrototypeBuilder.ParseFieldType(descriptor);
                    return(new FieldReference(new ClassReference(className), memberName, prototype));
                }

                // Field is in the assembly itself
                // Use the mapping
                return(targetPackage.NameConverter.GetField(fieldDef));
            }

            var javaField = field as XModel.Java.XBuilder.JavaFieldReference;

            if (javaField != null)
            {
                var prototype = PrototypeBuilder.ParseFieldType(javaField.JavaDecriptor);
                return(new FieldReference(new ClassReference(javaField.JavaClassName), javaField.JavaName, prototype));
            }

            throw new ResolveException(string.Format("Field {0} not found", field.FullName));
        }