示例#1
0
        private void EmitStart()
        {
            var assmName = CST.CSTWriter.WithAppend(Env.Global, CST.WriterStyle.Uniform, assmEnv.Assembly.Name.Append);

            var startId = new JST.Identifier("start");
            var exId    = new JST.Identifier("e");

            var globalRootId = new JST.Identifier(Env.Root);
            var startStmnt   = JST.Statement.DotCall
                                   (globalRootId.ToE(), Constants.RootStart, new JST.StringLiteral(assmName));

            if (!Env.DebugMode)
            {
                startStmnt = new JST.TryStatement
                                 (new JST.Statements(startStmnt),
                                 new JST.CatchClause
                                     (exId,
                                     new JST.Statements
                                         (JST.Statement.DotCall
                                             (new JST.Identifier(Env.Root).ToE(),
                                             Constants.RootWriteLine,
                                             new JST.BinaryExpression
                                                 (new JST.StringLiteral("UNCAUGHT EXCEPTION: "),
                                                 JST.BinaryOp.Plus,
                                                 JST.Expression.DotCall
                                                     (globalRootId.ToE(), Constants.RootExceptionDescription, exId.ToE()))))));
            }

            var scriptBody = new Seq <JST.Statement>();

            switch (Env.Target)
            {
            case Target.Browser:
            {
                var startFuncBody = new Seq <JST.Statement>();
#if !JSCRIPT_IS_CORRECT
                startFuncBody.Add(JST.Statement.Var(exId));
#endif
                startFuncBody.Add(startStmnt);
                var startFunc = new JST.FunctionDeclaration(startId, null, new JST.Statements(startFuncBody));

                var windowId           = new JST.Identifier("window");
                var addEventListenerId = new JST.Identifier("addEventListner");
                var attachEventId      = new JST.Identifier("attachEvent");
                var onloadId           = new JST.Identifier("onload");
                scriptBody.Add(startFunc);
                scriptBody.Add
                    (new JST.IfStatement
                        (JST.Expression.Dot(windowId.ToE(), addEventListenerId),
                        new JST.Statements
                            (JST.Statement.DotCall
                                (windowId.ToE(),
                                addEventListenerId,
                                new JST.StringLiteral("load"),
                                startId.ToE(),
                                new JST.BooleanLiteral(false))),
                        new JST.Statements
                            (new JST.IfStatement
                                (JST.Expression.Dot(windowId.ToE(), attachEventId),
                                new JST.Statements
                                    (JST.Statement.DotCall
                                        (windowId.ToE(),
                                        attachEventId,
                                        new JST.StringLiteral("onload"),
                                        startId.ToE())),
                                new JST.Statements
                                    (JST.Statement.DotAssignment(windowId.ToE(), onloadId, startId.ToE()))))));
                break;
            }

            case Target.CScript:
                scriptBody.Add(startStmnt);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var startProgram  = new JST.Program(new JST.Statements(scriptBody));
            var startFileName = Path.Combine(Env.OutputDirectory, Constants.StartFileName);
            startProgram.ToFile(startFileName, Env.PrettyPrint);
            Env.Log(new GeneratedJavaScriptFile("startup for assembly '" + assmName + "'", startFileName));
        }
示例#2
0
        private void EmitStart()
        {
            var assmName = CST.CSTWriter.WithAppend(Env.Global, CST.WriterStyle.Uniform, assmEnv.Assembly.Name.Append);

            var startId = new JST.Identifier("start");
            var exId = new JST.Identifier("e");

            var globalRootId = new JST.Identifier(Env.Root);
            var startStmnt = JST.Statement.DotCall
                (globalRootId.ToE(), Constants.RootStart, new JST.StringLiteral(assmName));
            if (!Env.DebugMode)
            {
                startStmnt = new JST.TryStatement
                    (new JST.Statements(startStmnt),
                     new JST.CatchClause
                         (exId,
                          new JST.Statements
                              (JST.Statement.DotCall
                                   (new JST.Identifier(Env.Root).ToE(),
                                    Constants.RootWriteLine,
                                    new JST.BinaryExpression
                                        (new JST.StringLiteral("UNCAUGHT EXCEPTION: "),
                                         JST.BinaryOp.Plus,
                                         JST.Expression.DotCall
                                             (globalRootId.ToE(), Constants.RootExceptionDescription, exId.ToE()))))));
            }

            var scriptBody = new Seq<JST.Statement>();
            switch (Env.Target)
            {
            case Target.Browser:
                {
                    var startFuncBody = new Seq<JST.Statement>();
#if !JSCRIPT_IS_CORRECT
                    startFuncBody.Add(JST.Statement.Var(exId));
#endif
                    startFuncBody.Add(startStmnt);
                    var startFunc = new JST.FunctionDeclaration(startId, null, new JST.Statements(startFuncBody));

                    var windowId = new JST.Identifier("window");
                    var addEventListenerId = new JST.Identifier("addEventListner");
                    var attachEventId = new JST.Identifier("attachEvent");
                    var onloadId = new JST.Identifier("onload");
                    scriptBody.Add(startFunc);
                    scriptBody.Add
                        (new JST.IfStatement
                             (JST.Expression.Dot(windowId.ToE(), addEventListenerId),
                              new JST.Statements
                                  (JST.Statement.DotCall
                                       (windowId.ToE(),
                                        addEventListenerId,
                                        new JST.StringLiteral("load"),
                                        startId.ToE(),
                                        new JST.BooleanLiteral(false))),
                              new JST.Statements
                                  (new JST.IfStatement
                                       (JST.Expression.Dot(windowId.ToE(), attachEventId),
                                        new JST.Statements
                                            (JST.Statement.DotCall
                                                 (windowId.ToE(),
                                                  attachEventId,
                                                  new JST.StringLiteral("onload"),
                                                  startId.ToE())),
                                        new JST.Statements
                                            (JST.Statement.DotAssignment(windowId.ToE(), onloadId, startId.ToE()))))));
                    break;
                }
            case Target.CScript:
                scriptBody.Add(startStmnt);
                break;
            default:
                throw new ArgumentOutOfRangeException();
            }

            var startProgram = new JST.Program(new JST.Statements(scriptBody));
            var startFileName = Path.Combine(Env.OutputDirectory, Constants.StartFileName);
            startProgram.ToFile(startFileName, Env.PrettyPrint);
            Env.Log(new GeneratedJavaScriptFile("startup for assembly '" + assmName + "'", startFileName));
        }