Пример #1
0
 /// <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));
 }
Пример #2
0
        /// <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));
        }
Пример #3
0
 /// <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));
 }
Пример #4
0
 /// <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);
     }
 }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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));
        }
Пример #7
0
        /// <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));
            }
        }
Пример #8
0
 /// <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));
 }
Пример #9
0
        /// <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));
        }
Пример #10
0
        /// <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;
        }