Example #1
0
 public CSharpType(string name, Type nativeType, CSharpObject solutionType, IReadOnlyList <CSharpType> genericArguments)
 {
     this.Name             = name;
     this.NativeType       = nativeType;
     this.SolutionType     = solutionType;
     this.GenericArguments = genericArguments;
 }
Example #2
0
        private CSharpType Resolve(string typeName)
        {
            var chars            = typeName.ToCharArray();
            var index            = 0;
            var buffer           = new List <char>();
            var generic          = 0;
            var genericName      = typeName;
            var genericArguments = new List <CSharpType>();

            if (typeName.EndsWith("[]"))
            {
                genericName = "Array";
                var genericArgument = Resolve(typeName.Remove(typeName.Length - 2));
                genericArguments.Add(genericArgument);
            }
            else if (typeName.EndsWith("?"))
            {
                genericName = "Nullable";
                var genericArgument = Resolve(typeName.Remove(typeName.Length - 1));
                genericArguments.Add(genericArgument);
            }
            else
            {
                for (; index < chars.Length; index++)
                {
                    var c = chars[index];
                    switch (c)
                    {
                    case '<':
                    {
                        generic++;
                        if (generic > 1)
                        {
                            buffer.Add(c);
                        }
                        else
                        {
                            genericName = new String(buffer.ToArray());
                            buffer.Clear();
                        }
                        break;
                    }

                    case ',':
                    {
                        if (generic == 1)
                        {
                            var genericArgumentString = new String(buffer.ToArray());
                            var genericArgument       = Resolve(genericArgumentString);
                            genericArguments.Add(genericArgument);
                            buffer.Clear();
                        }
                        else
                        {
                            buffer.Add(c);
                        }
                        break;
                    }

                    case '>':
                    {
                        if (generic == 0)
                        {
                            throw new Exception();
                        }
                        generic--;
                        if (generic > 0)
                        {
                            buffer.Add(c);
                        }
                        else
                        {
                            var genericArgumentString = new String(buffer.ToArray());
                            var genericArgument       = Resolve(genericArgumentString);
                            genericArguments.Add(genericArgument);
                            buffer.Clear();
                        }
                        break;
                    }

                    default:
                    {
                        buffer.Add(c);
                        break;
                    }
                    }
                }
            }

            if (genericArguments.Count > 0)
            {
                genericName = $"{genericName}`{genericArguments.Count}";
            }

            var nativeType = Type.GetType(genericName);

            if (nativeType == null)
            {
                nativeType = GetSystemType(genericName);
            }

            if (nativeType == null)
            {
                foreach (var use in usings)
                {
                    nativeType = Type.GetType($"{use}.{genericName}");
                    if (nativeType != null)
                    {
                        break;
                    }
                }
            }

            CSharpObject solutionType = null;

            if (nativeType == null)
            {
                foreach (var item in solution.Classes.Concat(solution.Structs).Concat(solution.Interfaces).Concat(solution.Enums).Concat(solution.Delegates))
                {
                    if (ns.ToString() == item.Namespace?.ToString() || usings.Any(x => x.ToString() == item.Namespace?.ToString()))
                    {
                        if (item.Name == genericName)
                        {
                            solutionType = item;
                            break;
                        }
                    }
                }
            }

            var csType = new CSharpType(genericName, nativeType, solutionType, genericArguments);

            return(csType);
        }