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(); } }