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);
        }
Beispiel #2
0
        private TypeName TypeNameFromNode(SyntaxTreeNode node)
        {
            switch (node.Op)
            {
            case "GenericType":
                TypeName   name       = TypeNameFromNode(node[0]);
                TypeName[] parameters = new TypeName[node[1].Children.Length];

                for (int i = 0; i < parameters.Length; i++)
                {
                    parameters[i] = TypeNameFromNode(node[1][i]);
                }

                return(new GenericTypeName(name, builder.CurrentNamespaceContext, parameters));

            case "Array":
                return(new ArrayTypeName(TypeNameFromNode(node[0]), builder.CurrentNamespaceContext));

            case "Type":
                return(new BasicTypeName(CodeType.ByName(node.ValueString).Name));

            default:
                return(new BasicTypeName(GetName(node), builder.CurrentNamespaceContext));
            }
        }
        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);
        }