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