/// <summary> /// Normalizes the <paramref name="methodDeclaration" />. /// </summary> protected override SyntaxNode Normalize(MethodDeclarationSyntax methodDeclaration) { var returnCount = methodDeclaration.Descendants<ReturnStatementSyntax>().Count(); // If there is no return statement within the method's body, there's nothing to do if (returnCount == 0) return methodDeclaration; // If there is only one return and it is the last method body's last statement, there's nothing to do if (returnCount == 1 && methodDeclaration.Body.Statements[methodDeclaration.Body.Statements.Count - 1] is ReturnStatementSyntax) return methodDeclaration; // Otherwise, we have to normalize the method var nameScope = methodDeclaration.GetNameScope(SemanticModel, includeLocals: true); var symbol = methodDeclaration.GetMethodSymbol(SemanticModel); _returnsValue = !symbol.ReturnsVoid; _hasReturnedVariable = SyntaxFactory.IdentifierName(nameScope.MakeUnique("hasReturned")); _returnValueVariable = _returnsValue ? SyntaxFactory.IdentifierName(nameScope.MakeUnique("returnValue")) : null; var rewriter = new Rewriter(Syntax, _hasReturnedVariable); methodDeclaration = (MethodDeclarationSyntax)rewriter.Visit(methodDeclaration); methodDeclaration = (MethodDeclarationSyntax)base.Normalize(methodDeclaration); // Generate the declarations for the local variables var hasReturnedLocal = Syntax.LocalDeclarationStatement(Syntax.TypeExpression<bool>(SemanticModel), _hasReturnedVariable.Identifier.ValueText, Syntax.FalseLiteralExpression()); var statements = methodDeclaration.Body.Statements.Insert(0, (StatementSyntax)hasReturnedLocal); if (_returnsValue) { var returnValueLocal = Syntax.LocalDeclarationStatement(symbol.ReturnType, _returnValueVariable.Identifier.ValueText); statements = statements.Insert(0, (StatementSyntax)returnValueLocal); // If the method returns a value, add the final return statement, which by now is the only one within the entire method body statements = statements.Add((StatementSyntax)Syntax.ReturnStatement(_returnValueVariable)); } return methodDeclaration.WithBody(SyntaxFactory.Block(statements)).NormalizeWhitespace(); }