private Statement ProcessTryCatchFinallyStatement(TryNode node)
        {
            Debug.Assert(node.CatchClauses.Count < 2);
            Debug.Assert((node.CatchClauses.Count == 1) || (node.FinallyClause != null));

            TryCatchFinallyStatement statement = new TryCatchFinallyStatement();

            Statement body = BuildStatement((StatementNode)node.Body);
            statement.AddBody(body);

            if (node.CatchClauses.Count == 1) {
                CatchNode catchNode = (CatchNode)node.CatchClauses[0];

                VariableSymbol exceptionVariableSymbol = null;
                if (catchNode.Name != null) {
                    TypeSymbol exceptionVariableType =
                        _symbolSet.ResolveType(catchNode.Type, _symbolTable, _memberContext);
                    Debug.Assert(exceptionVariableType != null);

                    exceptionVariableSymbol =
                        new VariableSymbol(catchNode.Name.Name, _memberContext, exceptionVariableType);
                }
                else {
                    TypeSymbol exceptionVariableType =
                        _symbolSet.ResolveIntrinsicType(IntrinsicType.Exception);
                    Debug.Assert(exceptionVariableType != null);

                    exceptionVariableSymbol =
                        new VariableSymbol(_symbolTable.CreateSymbolName("e"), _memberContext, exceptionVariableType);
                }

                _symbolTable.PushScope();
                _symbolTable.AddSymbol(exceptionVariableSymbol);

                Statement catchStatement = BuildStatement((StatementNode)catchNode.Body);
                statement.AddCatch(exceptionVariableSymbol, catchStatement);

                _symbolTable.PopScope();
            }

            if (node.FinallyClause != null) {
                Statement finallyStatement = BuildStatement((StatementNode)node.FinallyClause);
                statement.AddFinally(finallyStatement);
            }

            return statement;
        }
        private static void GenerateTryCatchFinallyStatement(ScriptGenerator generator, MemberSymbol symbol, TryCatchFinallyStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.WriteTrimmed("try ");
            writer.Write("{");
            writer.WriteNewLine();
            writer.Indent++;
            GenerateStatement(generator, symbol, statement.Body);
            writer.Indent--;
            writer.Write("}");
            writer.WriteNewLine();
            if (statement.Catch != null) {
                writer.WriteTrimmed("catch ");
                writer.Write("(");
                writer.Write(statement.ExceptionVariable.GeneratedName);
                writer.WriteTrimmed(") ");
                writer.Write("{");
                writer.WriteNewLine();
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.Catch);
                writer.Indent--;
                writer.Write("}");
                writer.WriteNewLine();
            }
            if (statement.Finally != null) {
                writer.WriteTrimmed("finally ");
                writer.Write("{");
                writer.WriteNewLine();
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.Finally);
                writer.Indent--;
                writer.Write("}");
                writer.WriteNewLine();
            }
        }