예제 #1
0
 private Class ResolveTypeVariable(JClassRef cr, Class parentClass, Method parentMethod)
 {
     if (!cr.IsTypeVariable)
     {
         throw new Exception();
     }
     if (cr.IsTypeVariableOwnedByMethod)
     {
         var arg = parentMethod.GenericArguments.Where(t => t.Name == cr.Name).FirstOrDefault();
         if (arg == null)
         {
             Warn("generic arg not found: " + parentMethod + " " + cr.Name);
             return(null);
         }
         return(arg);
     }
     else
     {
         var arg = parentClass.GenericArguments.Where(t => t.Name == cr.Name).FirstOrDefault();
         if (arg == null)
         {
             Warn("generic arg not found: " + parentClass + " " + cr.Name);
             return(null);
         }
         return(arg);
     }
 }
예제 #2
0
        Class Resolve(JClassRef cr, Class parentClass, Method parentMethod)
        {
            if (cr.IsArray)
            {
                var ce  = Resolve(cr.ArrayItemType, parentClass, parentMethod);
                var ce2 = Context.Context.MakeArrayClass(ce);
                return(ce2);
            }
            else if (cr.IsWildcardType)
            {
                var upperBounds = ResolveEach(cr.UpperBounds, parentClass, parentMethod);
                var lowerBounds = ResolveEach(cr.LowerBounds, parentClass, parentMethod);

                var ce = Context.WildcardClass;
                if (upperBounds.IsNotNullOrEmpty())
                {
                    var ce2 = upperBounds[0];
                    if (ce2 != Context.JavaLangObjectClass)
                    {
                        ce = ce2;
                    }
                }
                return(ce);
            }
            else if (cr.IsTypeVariable)
            {
                return(ResolveTypeVariable(cr, parentClass, parentMethod));
            }
            else
            {
                if (cr.IsParameterizedType)
                {
                    var genArgs = ResolveEach(cr.GenericArguments, parentClass, parentMethod);
                    var ce      = GetClass(cr.Name);
                    if (ce != null)
                    {
                        if (ce.GenericArguments.Count == 0 && genArgs.Count == 0)
                        {
                            return(ce);
                        }
                        var ce2 = MakeGenericClass(ce, genArgs);
                        return(ce2);
                    }
                    return(null);
                }
                else
                {
                    var ce = GetClass(cr.Name);
                    if (ce != null && ce.GenericArguments.Count > 0 && ce.GenericArguments.Any(t => t.IsGenericTypeArgument))
                    {
                        //var genArgs = ce.GenericArguments.Select(t => Context.WildcardClass).ToList();
                        var genArgs = ce.GenericArguments.Select(t => Context.ObjectClass).ToList();
                        var ce2     = MakeGenericClass(ce, genArgs);
                        return(ce2);
                    }
                    return(ce);
                }
            }
        }
예제 #3
0
        private static JClassRef VisitTypeVariable(TypeVariable <Q> me)
        {
            var cr = new JClassRef();

            cr.IsTypeVariable = true;
            cr.Name           = me.Name;
            if (me.GenericDeclaration is Method)
            {
                cr.IsTypeVariableOwnedByMethod = true;
            }
            return(cr);
        }
예제 #4
0
        private Class ResolveAndFix(JClassRef tr, Class parentClass, Method parentMethod)
        {
            if (tr == null)
            {
                return(null);
            }
            var x = Resolve(tr, parentClass, parentMethod);

            if (x == null)
            {
                return(null);
            }
            return(x);
            //TODO: AddMissingGenerics(tr);
        }
예제 #5
0
 private static JClassRef visitType(Type type)
 {
     if (type is Class <Q> )
     {
         var ce = (Class <Q>)type;
         var cr = new JClassRef();
         cr.Name    = ce.Name;
         cr.IsArray = ce.IsArray;
         if (ce.IsArray)
         {
             cr.ArrayItemType = visitType(ce.ComponentType);
         }
         return(cr);
     }
     else if (type is GenericArrayType)
     {
         var ce = (GenericArrayType)type;
         var cr = new JClassRef();
         cr.IsArray       = true;
         cr.ArrayItemType = visitType(ce.GenericComponentType);
         return(cr);
     }
     else if (type is ParameterizedType)
     {
         var ce = (ParameterizedType)type;
         var cr = visitType(ce.RawType);
         cr.IsParameterizedType = true;
         cr.GenericArguments    = visitEachType(ce.ActualTypeArguments);
         return(cr);
     }
     else if (type is TypeVariable <Q> )
     {
         var ce = (TypeVariable <Q>)type;
         var cr = VisitTypeVariable(ce);
         return(cr);
     }
     else if (type is WildcardType)
     {
         var ce = (WildcardType)type;
         var cr = new JClassRef();
         cr.IsWildcardType = true;
         cr.LowerBounds    = visitEachType(ce.LowerBounds);
         cr.UpperBounds    = visitEachType(ce.UpperBounds);
         return(cr);
     }
     return(null);
 }
예제 #6
0
 private Class ResolveAndFix(JClassRef tr, Method parentMethod)
 {
     return(ResolveAndFix(tr, parentMethod.DeclaringClass, parentMethod));
 }
예제 #7
0
 private Class ResolveAndFix(JClassRef tr, Class parentClass)
 {
     return(ResolveAndFix(tr, parentClass, null));
 }
예제 #8
0
 private Class ResolveAndFix(JClassRef tr)
 {
     return(ResolveAndFix(tr, null, null));
 }