Exemplo n.º 1
0
        static void Main(string[] args)
        {
            Console.WriteLine("Starting...");
            string       location   = args.Length > 0 ? args[0] : Console.ReadLine();
            const string argStart   = "--converter:";
            string       converterV = args.FirstOrDefault(v => v.StartsWith(argStart));

            if (converterV == null)
            {
                Console.WriteLine(@"What software would you like to convert for?
Currently Supported:
Bridge,
DuoCode");
            }
            string converterValue = converterV == null?Console.ReadLine() : converterV.Substring(argStart.Length);

            ConversionSoftware conversionSoftware = (ConversionSoftware)Enum.Parse(typeof(ConversionSoftware), converterValue);
            string             file;

            Console.WriteLine("Reading file...");
            try
            {
                file = File.ReadAllText(location);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return;
            }
            var parser = new MTypescriptParser
            {
                ParseString = file
            };

            Console.WriteLine("Parsing...");
            parser.Parse();
            Namespace globalNamespace = parser.globalNamespace;
            var       converter       = new TypescriptToCSConverter(conversionSoftware);

            globalNamespace.classes.AddRange(new[]
            {
                new TypeDeclaration
                {
                    name = "NullType"
                },
                new TypeDeclaration
                {
                    name   = "UndefinedType",
                    fields = new List <Field>
                    {
                        new Field
                        {
                            name      = "Undefined",
                            @readonly = true,
                            @static   = true,
                            template  = "undefined",
                            type      = new NamedType
                            {
                                Name = "UndefinedType"
                            }
                        }
                    }
                },
                new TypeDeclaration
                {
                    name       = "VoidType",
                    implements = new List <TypescriptParser.Type>
                    {
                        new NamedType {
                            Name = "UndefinedType"
                        }
                    }
                },
                new TypeDeclaration
                {
                    name    = "Symbol",
                    methods = new List <MethodOrDelegate>
                    {
                        new MethodOrDelegate
                        {
                            Arguments = new Arguments
                            {
                                Parameters = new List <Parameter>
                                {
                                    new Parameter
                                    {
                                        Name = "value",
                                        Type = new NamedType
                                        {
                                            Name = "string"
                                        }
                                    }
                                }
                            },
                            Name = "constructor"
                        },
                        new MethodOrDelegate
                        {
                            Name = "constructor"
                        }
                    }
                }
            });
            converter.globalNamespace = globalNamespace;
            //Console.WriteLine("Dotting...");
            //globalNamespace.ForeachTypeReference(v =>
            //{
            //    NamedType namedType = v as NamedType;
            //    if (string.IsNullOrEmpty(namedType?.Name))
            //        return;
            //    string[] dots = namedType.Name.Split('.');
            //    string[] preDots = new string[dots.Length - 1];
            //    Array.Copy(dots, preDots, dots.Length - 1);
            //    namedType.PreDots = preDots;
            //    namedType.Name = dots.Last();
            //});
            //Console.WriteLine("Merging...");
            //converter.MergeEnums(globalNamespace);
            //converter.RemoveAll(globalNamespace);
            Console.WriteLine("Referencing...");
            globalNamespace.ForeachTypeReference(converter.Reference);
            globalNamespace.ForeachType(v => converter.Reference(v.Type));
            Console.WriteLine("Unioning...");
            parser.Unions.ForEach(v =>
            {
                var typeA     = v.Generics.Generic[0] as NamedType;
                var typeB     = v.Generics.Generic[1] as NamedType;
                var typeDeclA = typeA.TypeDeclaration;
                var typeDeclB = typeB.TypeDeclaration;
                NamedType result;
                if (typeDeclA == null || typeDeclB == null)
                {
                    result = new NamedType
                    {
                        Name = "object"
                    }
                }
                ;
                else
                {
                    var shared = typeDeclA.FindSharedInterfaces(typeDeclB).Cast <TypescriptParser.Type>().ToList();
                    shared.Insert(0, new NamedType
                    {
                        Name     = "Union",
                        Generics = new Generics
                        {
                            Generic = new List <TypescriptParser.Type>
                            {
                                typeA, typeB
                            }
                        }
                    });
                    string name          = "Union_" + converter.Convert(typeA) + "_" + converter.Convert(typeB);
                    TypeDeclaration @ref = null;
                    globalNamespace.ForeachType(v2 => @ref = v2.name == name ? v2 : @ref);
                    bool create = @ref == null;
                    if (create)
                    {
                        @ref = new TypeDeclaration
                        {
                            name               = name,
                            implements         = shared,
                            IsUnion            = true,
                            GenericDeclaration = new GenericDeclaration
                            {
                                Generics = new List <string> {
                                    "A", "B"
                                }
                            }
                        }
                    }
                    ;
                    v.Name            = name;
                    v.TypeDeclaration = @ref;
                    if (create)
                    {
                        globalNamespace.classes.Add(@ref);
                    }
                }
            });
            Console.WriteLine("Renaming...");
            globalNamespace.ForeachType((Action <MethodOrDelegate>)(typeDeclaration =>
            {
                var delegatesFound = globalNamespace.FindType(new NamedType
                {
                    Name     = typeDeclaration.Name,
                    Generics = new Generics
                    {
                        Generic = typeDeclaration.GenericDeclaration.Generics.ConvertAll <TypescriptParser.Type>(v2 => new NamedType {
                            Name = v2
                        })
                    }
                }, converter.remove).delegatesFound;
                if (delegatesFound.Count > 1)
                {
                    typeDeclaration.Name += "_" + delegatesFound.Count;
                }
            }));
            Console.WriteLine("Removing duplicate fields...");
            converter.RemoveDuplicateFields();
            Console.WriteLine("Translating...");
            List <TypeDeclaration> toAdd = new List <TypeDeclaration>();

            globalNamespace.ForeachType(v => toAdd.AddRange(converter.Translate(v)));
            globalNamespace.ForeachType(v => converter.Cleanse(v.Type, v.GenericDeclaration, null));
            globalNamespace.classes.AddRange(toAdd);
            converter.remove.Clear();
            globalNamespace.ForeachType(converter.DeleteUnneededTypes);
            converter.RemoveAll(globalNamespace);
            Console.WriteLine("Writing C#...");
            //converter.ConvertUsingStatements(globalNamespace);
            converter.Result.Append(conversionSoftware == ConversionSoftware.Bridge ? "using Bridge;" : "using DuoCode.Runtime;");
            converter.Result.Append(
                @"
//using number = System.Double;
//using any = Bridge.Union<System.Delegate, object>;
//using boolean = System.Boolean;
#pragma warning disable CS0626
#pragma warning disable CS0824
//[assembly: Convention(Notation.LowerCamelCase)]
");
            converter.Convert(globalNamespace, false);
            Console.WriteLine("Writing...");
            File.WriteAllText($"{Path.GetFileNameWithoutExtension(location)}.cs", converter.Result.ToString());
            Console.WriteLine("Exiting...");
        }