/// <summary> /// Gets the child block statement from the given statement. If the statement itself is a block statement, /// it will be returned instead. /// </summary> /// <param name="statement">The statement.</param> /// <returns>Returns the block statement or null if there is none.</returns> private static BlockStatement GetChildBlockStatement(Statement statement) { Param.AssertNotNull(statement, "statement"); if (statement.StatementType == StatementType.Block) { return (BlockStatement)statement; } return statement.FindFirstChild<BlockStatement>(); }
/// <summary> /// Checks the curly brackets under the given statement. /// </summary> /// <param name="statement">The statement being visited.</param> /// <param name="parentExpression">The parent expression, if any.</param> /// <param name="parentStatement">The parent statement, if any.</param> /// <param name="parentElement">The parent element, if any.</param> /// <returns>Returns true to continue, or false to stop the walker.</returns> private bool VisitStatement( Statement statement, Expression parentExpression, Statement parentStatement, Element parentElement) { Param.AssertNotNull(statement, "statement"); Param.Ignore(parentExpression); Param.Ignore(parentStatement); Param.AssertNotNull(parentElement, "parentElement"); switch (statement.StatementType) { case StatementType.Block: // A block statement can be the right-hand statement in a lambda expression. In this case, we allow // the block to be written all on a single line if the whole parent statement is on a single line. bool allowAllOnOneLine = false; LambdaExpression lambdaParent = statement.Parent as LambdaExpression; if (lambdaParent != null && lambdaParent.Location.StartPoint.LineNumber == lambdaParent.Location.EndPoint.LineNumber) { allowAllOnOneLine = true; } // Curly bracket block statements may not be all on one line. this.CheckBracketPlacement( statement, parentElement, statement, statement.FindFirstChild<OpenCurlyBracketToken>(), allowAllOnOneLine); break; case StatementType.Switch: // Switch statements may not be all on one line. this.CheckBracketPlacement( statement, parentElement, statement, statement.FindFirstChild<OpenCurlyBracketToken>(), false); break; case StatementType.If: // If-statements should always be followed by a curly bracket block. this.CheckMissingBlock(parentElement, statement, ((IfStatement)statement).Body, statement.FriendlyTypeText, false); break; case StatementType.Else: // Else-statements should always be followed by a curly bracket block. this.CheckMissingBlock(parentElement, statement, ((ElseStatement)statement).Body, statement.FriendlyTypeText, false); break; case StatementType.While: // While-statements should always be followed by a curly bracket block. this.CheckMissingBlock(parentElement, statement, ((WhileStatement)statement).Body, statement.FriendlyTypeText, false); break; case StatementType.For: // For-statements should always be followed by a curly bracket block. this.CheckMissingBlock(parentElement, statement, ((ForStatement)statement).Body, statement.FriendlyTypeText, false); break; case StatementType.Foreach: // Foreach-statements should always be followed by a curly bracket block. this.CheckMissingBlock(parentElement, statement, ((ForeachStatement)statement).Body, statement.FriendlyTypeText, false); break; case StatementType.DoWhile: // Do-while-statements should always be followed by a curly bracket block. this.CheckMissingBlock(parentElement, statement, ((DoWhileStatement)statement).Body, statement.FriendlyTypeText, false); break; case StatementType.Using: // Using-statements should always be followed by a curly bracket block. this.CheckMissingBlock(parentElement, statement, ((UsingStatement)statement).Body, statement.FriendlyTypeText, true); break; default: break; } return true; }