/// <summary> /// Resolve the given java based type reference to a Cecil based type reference. /// </summary> internal static NetTypeReference Resolve(this TypeReference jRef, TargetFramework target, IBuilderGenericContext gcontext, bool convertSignedBytes) { NetTypeReference result; if (TryResolve(jRef, target, gcontext, convertSignedBytes, out result)) return result; throw new ArgumentException(string.Format("Unknown java type ref. {0}", jRef)); }
/// <summary> /// Gets a mapping /// </summary> public NetTypeReference GetType(ObjectTypeReference javaTypeRef, TargetFramework target, IBuilderGenericContext gcontext) { NetTypeReference result; if (TryGetType(javaTypeRef, target, gcontext, out result)) return result; //var names = map.Keys.OrderBy(x => x).ToArray(); throw new ArgumentException(string.Format("{0} not found", javaTypeRef)); }
/// <summary> /// Resolve the given java based type reference to a Cecil based type reference. /// </summary> internal static bool TryResolve(this TypeReference jRef, TargetFramework target, IBuilderGenericContext gcontext, bool convertSignedBytes, out NetTypeReference result) { result = null; if (jRef.IsArray) { var aType = (ArrayTypeReference) jRef; NetTypeReference elementType; if (!aType.ElementType.TryResolve(target, gcontext, convertSignedBytes, out elementType)) return false; result = new NetArrayType(elementType); return true; } if (jRef.IsVoid) { result = target.TypeNameMap.GetByType(typeof(void)); return true; } if (jRef.IsBaseType) { var bType = (BaseTypeReference) jRef; result = target.TypeNameMap.GetByType(bType.GetClrType(convertSignedBytes)); return true; } if (jRef.IsObjectType) { return TryResolveObjectType((ObjectTypeReference) jRef, target, gcontext, out result); } if (jRef.IsTypeVariable) { var tRef = (TypeVariableReference) jRef; if (gcontext.TryResolveTypeParameter(tRef.ClassName, target, out result)) return true; result = target.TypeNameMap.Object; // Hack for incorrect behaving java classes return true; } return false; //throw new ArgumentException(string.Format("Unknown java type ref. {0}", jRef)); }
/// <summary> /// Resolve the given java based type reference to a Cecil based type reference. /// </summary> private static bool TryResolveObjectType(ObjectTypeReference jRef, TargetFramework target, IBuilderGenericContext gcontext, out NetTypeReference result) { var objecType = jRef; switch (objecType.ClassName) { case "java/lang/Exception": case "java/lang/Throwable": result = target.TypeNameMap.GetByType(typeof(Exception)); return true; case "java/lang/Boolean": case "java/lang/Byte": case "java/lang/Character": case "java/lang/Double": case "java/lang/Float": case "java/lang/Integer": case "java/lang/Long": case "java/lang/Short": result = new NetNullableType(target.TypeNameMap.GetType(objecType, target, gcontext)); return true; default: return target.TypeNameMap.TryGetType(objecType, target, gcontext, out result); } }
/// <summary> /// Gets a mapping /// </summary> public bool TryGetType(ObjectTypeReference javaTypeRef, TargetFramework target, IBuilderGenericContext gcontext, out NetTypeReference result) { NetTypeDefinition typeDef; if (TryGetByJavaClassName(javaTypeRef.ClassName, out typeDef)) { // Custom /*if (typeDef.FullName.StartsWith("System.Type")) * { * }*/ // Create result if (!javaTypeRef.Arguments.Any() && (typeDef.GenericParameters.Count == 0)) { // Normal non-generic type result = typeDef; return(true); } if (typeDef.IgnoreGenericArguments) { // Force use as normal type result = typeDef; return(true); } // Generic type is used as non-generic? NetTypeReference declaringType = null; if (javaTypeRef.Prefix != null) { TryGetType(javaTypeRef.Prefix, target, gcontext, out declaringType); } var git = new NetGenericInstanceType(typeDef, declaringType); if (!javaTypeRef.Arguments.Any() && (typeDef.GenericParameters.Count > 0)) { // Add "object" arguments foreach (var tp in typeDef.GenericParameters) { git.AddGenericArgument(Object, this); } result = git; return(true); } if (javaTypeRef.Arguments.Count() != typeDef.GenericParameters.Count) { if ((resolver == null) || (typeDef.GenericParameters.Count != 0) || (!resolver.AcceptLackOfGenericParameters)) { throw new ArgumentException(string.Format("Mismatch between generic parameter count and generic argument count in {0}", javaTypeRef)); } if ((resolver != null) && (resolver.AcceptLackOfGenericParameters) && (typeDef.GenericParameters.Count == 0)) { result = typeDef; return(true); } } // Type with generic arguments foreach (var typeArg in javaTypeRef.Arguments) { NetTypeReference arg; if (typeArg.IsAny) { arg = Object; } else { if (!typeArg.Signature.TryResolve(target, gcontext, false, out arg)) { arg = Object; //result = null; //return false; } } git.AddGenericArgument(arg, this); } result = git; return(true); } #if DEBUG var names = map.Keys.OrderBy(x => x).ToArray(); #endif //throw new ArgumentException(string.Format("{0} not found", javaTypeRef)); result = null; return(false); }
/// <summary> /// Gets a mapping /// </summary> public NetTypeReference GetType(ObjectTypeReference javaTypeRef, TargetFramework target, IBuilderGenericContext gcontext) { NetTypeReference result; if (TryGetType(javaTypeRef, target, gcontext, out result)) { return(result); } //var names = map.Keys.OrderBy(x => x).ToArray(); throw new ArgumentException(string.Format("{0} not found", javaTypeRef)); }
/// <summary> /// Resolve the given java based type reference to a Cecil based type reference. /// </summary> private static bool TryResolveObjectType(ObjectTypeReference jRef, TargetFramework target, IBuilderGenericContext gcontext, out NetTypeReference result) { var objecType = jRef; switch (objecType.ClassName) { case "java/lang/Exception": case "java/lang/Throwable": result = target.TypeNameMap.GetByType(typeof(Exception)); return(true); case "java/lang/Boolean": case "java/lang/Byte": case "java/lang/Character": case "java/lang/Double": case "java/lang/Float": case "java/lang/Integer": case "java/lang/Long": case "java/lang/Short": result = new NetNullableType(target.TypeNameMap.GetType(objecType, target, gcontext)); return(true); default: return(target.TypeNameMap.TryGetType(objecType, target, gcontext, out result)); } }
/// <summary> /// Resolve the given java based type reference to a Cecil based type reference. /// </summary> internal static bool TryResolve(this TypeReference jRef, TargetFramework target, IBuilderGenericContext gcontext, bool convertSignedBytes, out NetTypeReference result) { result = null; if (jRef.IsArray) { var aType = (ArrayTypeReference)jRef; NetTypeReference elementType; if (!aType.ElementType.TryResolve(target, gcontext, convertSignedBytes, out elementType)) { return(false); } result = new NetArrayType(elementType); return(true); } if (jRef.IsVoid) { result = target.TypeNameMap.GetByType(typeof(void)); return(true); } if (jRef.IsBaseType) { var bType = (BaseTypeReference)jRef; result = target.TypeNameMap.GetByType(bType.GetClrType(convertSignedBytes)); return(true); } if (jRef.IsObjectType) { return(TryResolveObjectType((ObjectTypeReference)jRef, target, gcontext, out result)); } if (jRef.IsTypeVariable) { var tRef = (TypeVariableReference)jRef; if (gcontext.TryResolveTypeParameter(tRef.ClassName, target, out result)) { return(true); } result = target.TypeNameMap.Object; // Hack for incorrect behaving java classes return(true); } return(false); //throw new ArgumentException(string.Format("Unknown java type ref. {0}", jRef)); }
/// <summary> /// Resolve the given java based type reference to a Cecil based type reference. /// </summary> internal static NetTypeReference Resolve(this TypeReference jRef, TargetFramework target, IBuilderGenericContext gcontext, bool convertSignedBytes) { NetTypeReference result; if (TryResolve(jRef, target, gcontext, convertSignedBytes, out result)) { return(result); } throw new ArgumentException(string.Format("Unknown java type ref. {0}", jRef)); }
/// <summary> /// Gets a mapping /// </summary> public bool TryGetType(ObjectTypeReference javaTypeRef, TargetFramework target, IBuilderGenericContext gcontext, out NetTypeReference result) { NetTypeDefinition typeDef; if (TryGetByJavaClassName(javaTypeRef.ClassName, out typeDef)) { // Custom /*if (typeDef.FullName.StartsWith("System.Type")) { }*/ // Create result if (!javaTypeRef.Arguments.Any() && (typeDef.GenericParameters.Count == 0)) { // Normal non-generic type result = typeDef; return true; } if (typeDef.IgnoreGenericArguments) { // Force use as normal type result = typeDef; return true; } // Generic type is used as non-generic? NetTypeReference declaringType = null; if (javaTypeRef.Prefix != null) { TryGetType(javaTypeRef.Prefix, target, gcontext, out declaringType); } var git = new NetGenericInstanceType(typeDef, declaringType); if (!javaTypeRef.Arguments.Any() && (typeDef.GenericParameters.Count > 0)) { // Add "object" arguments foreach (var tp in typeDef.GenericParameters) { git.AddGenericArgument(Object, this); } result = git; return true; } if (javaTypeRef.Arguments.Count() != typeDef.GenericParameters.Count) { if ((resolver == null) || (typeDef.GenericParameters.Count != 0) || (!resolver.AcceptLackOfGenericParameters)) { throw new ArgumentException(string.Format("Mismatch between generic parameter count and generic argument count in {0}", javaTypeRef)); } if ((resolver != null) && (resolver.AcceptLackOfGenericParameters) && (typeDef.GenericParameters.Count == 0)) { result = typeDef; return true; } } // Type with generic arguments foreach (var typeArg in javaTypeRef.Arguments) { NetTypeReference arg; if (typeArg.IsAny) { arg = Object; } else { if (!typeArg.Signature.TryResolve(target, gcontext, false, out arg)) { arg = Object; //result = null; //return false; } } git.AddGenericArgument(arg, this); } result = git; return true; } #if DEBUG var names = map.Keys.OrderBy(x => x).ToArray(); #endif //throw new ArgumentException(string.Format("{0} not found", javaTypeRef)); result = null; return false; }