public CodeType ToCodeType(Type type, bool parseGenerics = true) { if (CodeType.ByName(type.Name.ToLower()) != null) { return(CodeType.ByName(type.Name.ToLower())); } UserType ut = null; if (type.IsArray) { ut = new ArrayType(ToCodeType(type.GetElementType())); } else if (type.IsGenericType && parseGenerics) { CodeType[] parameters = new CodeType[type.GetGenericArguments().Length]; for (int i = 0; i < parameters.Length; i++) { parameters[i] = new GenericParameterType(ToCodeType(type.GetGenericArguments()[i]), i); } ut = GenericType.NewGenericType(UserType.NewUserType(type), parameters); } else { ut = UserType.NewUserType(type); } if (ut != null) { ReferenceTracker.AddUsedReference(ut.GetAssembly()); } return(ut); }
public override void Bind(IntermediateBuilder context) { if (_type != null) { return; } base.Bind(context); _owner.Bind(context); _param.Bind(context); _valType = _param.Type; _type = GenericType.NewGenericType(UserType.ToUserType(context.ResolveType(new BasicTypeName("System.Collections.Generic.IEnumerator`1"))), new CodeType[] { _valType }); CodeType ownerType = GenericType.NewGenericType(UserType.ToUserType(context.ResolveType(new BasicTypeName("System.Collections.Generic.IEnumerable`1"))), new CodeType[] { _valType }); _call = new InterCall("GetEnumerator", new CodeValue[0], true, _owner) { ThisPointerTypeOverride = ownerType }; _call.Bind(context); }
public CodeType ResolveType(TypeName name) { if (name is ArrayTypeName) { var array = name as ArrayTypeName; return(new ArrayType(ResolveType(array.ElementType))); } else if (name is GenericTypeName) { var generic = name as GenericTypeName; CodeType[] parameters = new CodeType[generic.GenericParameters.Length]; var genericName = UserType.ToUserType(ResolveType(new BasicTypeName(generic.baseName.Name + '`' + parameters.Length, generic.baseName.NamespaceContext))); for (int i = 0; i < parameters.Length; i++) { parameters[i] = ResolveType(generic.GenericParameters[i]); } return(GenericType.NewGenericType(genericName, parameters)); } if (name.NamespaceContext.GenericParameters.ContainsKey(name.Name)) { return(name.NamespaceContext.GenericParameters[name.Name]); } var ctype = CodeType.ByName(name.Name); if (ctype != null) { return(ctype); } foreach (string ns in name.NamespaceContext.TravelUpHierarchy()) { foreach (InterType type in Types) { if (type.FullName == ns + '.' + name.Name) { return(new InterUserType(type)); } } } foreach (string ns in ImportedNamespaces) { foreach (InterType type in Types) { if (type.FullName == ns + "." + name.Name) { return(new InterUserType(type)); } } foreach (var a in AssemblyReferences) { var directResolve = a.ResolveType(name.NamespaceContext.ToString() + '.' + name.Name); if (directResolve != null) { return(UserType.NewUserType(directResolve)); } foreach (string hr in name.NamespaceContext.TravelUpHierarchy()) { var type = a.ResolveType(ns + "." + name.Name); if (type != null) { ReferenceTracker.AddUsedReference(type); return(UserType.NewUserType(type)); } } } } return(null); }