Пример #1
0
        /// <summary>
        /// Looks for a finally-statement, and if it is found, parses and returns it.
        /// </summary>
        /// <param name="tryStatement">
        /// The parent try statement.
        /// </param>
        /// <param name="parentReference">
        /// The parent code unit.
        /// </param>
        /// <param name="unsafeCode">
        /// Indicates whether the code being parsed resides in an unsafe code block.
        /// </param>
        /// <returns>
        /// Returns the statement.
        /// </returns>
        private FinallyStatement GetAttachedFinallyStatement(TryStatement tryStatement, Reference<ICodePart> parentReference, bool unsafeCode)
        {
            Param.AssertNotNull(tryStatement, "tryStatement");
            Param.AssertNotNull(parentReference, "parentReference");
            Param.Ignore(unsafeCode);

            FinallyStatement finallyStatement = null;

            // Look for a finally keyword.
            Symbol symbol = this.GetNextSymbol(parentReference);
            if (symbol.SymbolType == SymbolType.Finally)
            {
                Reference<ICodePart> statementReference = new Reference<ICodePart>();

                // Move up to the finally keyword and add it.
                CsToken firstToken = this.GetToken(CsTokenType.Finally, SymbolType.Finally, statementReference);
                Node<CsToken> firstTokenNode = this.tokens.InsertLast(firstToken);

                // Get the embedded statement. This must be a block statement.
                BlockStatement childStatement = this.GetNextStatement(statementReference, unsafeCode) as BlockStatement;
                if (childStatement == null)
                {
                    throw new SyntaxException(this.document.SourceCode, firstToken.LineNumber);
                }

                // Create the token list for the statement.
                CsTokenList partialTokens = new CsTokenList(this.tokens, firstTokenNode, this.tokens.Last);

                // Create and return the finally statement.
                finallyStatement = new FinallyStatement(partialTokens, tryStatement, childStatement);
                ((IWriteableCodeUnit)finallyStatement).SetParent(tryStatement);
                statementReference.Target = finallyStatement;
            }

            return finallyStatement;
        }
        /// <summary>
        /// The save.
        /// </summary>
        /// <param name="finallyStatement">
        /// The finally statement.
        /// </param>
        private void Save(FinallyStatement finallyStatement)
        {
            this.cppWriter.Write("finally");

            this.Save((Statement)finallyStatement.EmbeddedStatement);
        }