コード例 #1
0
ファイル: Program.cs プロジェクト: ChazZeromus/gscc
        static Boolean ProcessFile(CompilerFrontEnd cfe, FileInfo file, int total, int current, Boolean basic = true)
        {
            SyntaxBuilder sb        = null;
            Boolean       OscarKilo = false;
            ConsoleKey    ck;

            while (!OscarKilo)
            {
                sb = new SyntaxBuilder(cfe, file.FullName);
                WriteLine(file.Name);
                SyntaxBuilder.Stages last = (SyntaxBuilder.Stages)(-1);
                while (sb.Step())
                {
                    if (last != sb.Stage)
                    {
                        Write(ConCol.Info, "\r({0}/{1}): {2}", current + 1, total, (last = sb.Stage).ToString());
                    }
                }
                WriteLine();


                if (!sb.OscarKilo)
                {
                    if (!sb.Success)
                    {
                        WriteLine(ConCol.Error, "Unable to process [{0}]:", file.Name);
                    }
                    if (sb.Warns.Count > 0)
                    {
                        WriteLine(ConCol.Warning, "Warnings:");
                        foreach (var m in sb.Warns.AsIndexable())
                        {
                            WriteLine(ConCol.Warning, "{0}) {1}", m.Index + 1, m.Value);
                        }
                        WriteLine();
                    }
                    if (sb.Errors.Count > 0)
                    {
                        WriteLine(ConCol.Error, "Errors:");
                        foreach (var m in sb.Errors.AsIndexable())
                        {
                            WriteLine(ConCol.Error, "{0}) {1}", m.Index + 1, m.Value);
                        }
                        if (sb.Errors.Count > 0)
                        {
                            ExecuteOnError(file.FullName, sb.Errors[0].Location.Value);
                        }
                    }
                    WriteLine("Press anything...");
                    Console.ReadKey(true);

                    ck = CharQuestion("Do you want to (c)ontinue or (t)ry again?", ConsoleKey.C, ConsoleKey.T, ConsoleKey.F);
                    if (ck == ConsoleKey.C)
                    {
                        break;
                    }
                }
                else
                {
                    OscarKilo = true;
                }
            }

            if (sb.Success)
            {
                cfe.UserDefinedDOM = sb.GetFinalDOM(ValidationBuilder.GetExtlessName(file.Name));
            }

            if (sb.Success && !basic)
            {
                String targetName   = paramCopyName == null ? file.Name : paramCopyName;
                String finalTarget  = Path.Combine(paramOutputFolder, targetName);
                String targetPacked = "{0}.packed{1}".Fmt(ValidationBuilder.GetExtlessName(targetName),
                                                          (new FileInfo(targetName)).Extension), finalTargetPacked = null;


                if (paramCopyName != null || paramCrossCheck)
                {
                    CheckOutputFolder();
                    WriteLine(ConCol.Info, "Outputing generated source.");
                    using (var sw = new StreamWriter(finalTarget))
                        sw.Write(cfe.UserDefinedDOM.Express(0));
                    WriteLine(ConCol.Info, "Emitted generated file [{0}].".Fmt(targetName));
                }

                if (paramEmitPacked)
                {
                    finalTargetPacked = Path.Combine(paramOutputFolder, targetPacked);
                    try
                    {
                        using (StreamWriter sw = new StreamWriter(finalTargetPacked))
                            sb.SavePacked(sw);
                        WriteLine(ConCol.Success, "Emitted packed source [{0}].", finalTargetPacked);
                    }
                    catch (Exception e)
                    {
                        WriteLine(ConCol.Error, "Unable to emit packed source of [{0}]: {1}", targetPacked, e.Message);
                        e.BreakException();
                        return(false);
                    }
                }

                if (paramCrossCheck)
                {
                    try
                    {
                        CodeDOMModule A, B;
                        CheckOutputFolder();
                        A = cfe.UserDefinedDOM;

                        if (!ProcessFile(cfe, new FileInfo(finalTarget), total, current))
                        {
                            WriteLine(ConCol.Error, "Cross check failed! Please contact Chaz pronto!");
                            throw new Exception("Cross check failed. Compiler isn't up to standard.");
                        }

                        B = cfe.UserDefinedDOM;

                        var d = CodeDOMComparer.CompareDOM(A, B);

                        if (d.Count == 0)
                        {
                            WriteLine(ConCol.Success, "Crosscheck Original To Copy Success!");
                        }
                        else
                        {
                            WriteLine(ConCol.Warning, "Crosscheck returned differences:");
                            foreach (var item in d.AsIndexable())
                            {
                                WriteLine(ConCol.Warning, "{0}> {1}", item.Index + 1, item.Value.ToString());
                            }
                            throw new Exception("Cross check failed. Compiler isn't up to standard.");
                        }

                        if (paramEmitPacked)
                        {
                            WriteLine(ConCol.Info, "Now cross checking with packed [{0}].", finalTargetPacked);
                            if (!ProcessFile(cfe, new FileInfo(finalTargetPacked), total, current))
                            {
                                WriteLine(ConCol.Error, "Packed cross check failed! Please contact Chaz pronto!");
                                throw new Exception("Packed cross check failed. Compiler isn't up to standard.");
                            }

                            B = cfe.UserDefinedDOM;

                            d = CodeDOMComparer.CompareDOM(A, B);

                            if (d.Count == 0)
                            {
                                WriteLine(ConCol.Success, "Crosscheck Original To Packed Success!");
                            }
                            else
                            {
                                WriteLine(ConCol.Warning, "Packed crosscheck returned differences:");
                                foreach (var item in d.AsIndexable())
                                {
                                    WriteLine(ConCol.Warning, "{0}> {1}", item.Index + 1, item.Value.ToString());
                                }
                                throw new Exception("Packed Cross check failed. Compiler isn't up to standard.");
                            }
                        }

                        cfe.UserDefinedDOM = A;
                    }
                    catch (Exception e)
                    {
                        WriteLine(ConCol.Error, "Crosscheck of file [{0}] failed: {1}".Fmt(targetName, e.Message));
                        e.BreakException();
                        return(false);
                    }
                }
            }
            return(sb.Success);
        }