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); } }
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); } } }
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); }
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); }
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); }
private Class ResolveAndFix(JClassRef tr, Method parentMethod) { return(ResolveAndFix(tr, parentMethod.DeclaringClass, parentMethod)); }
private Class ResolveAndFix(JClassRef tr, Class parentClass) { return(ResolveAndFix(tr, parentClass, null)); }
private Class ResolveAndFix(JClassRef tr) { return(ResolveAndFix(tr, null, null)); }