private static async Task <Document> ConvertWhileStatementToForStatementAsync(
            Document document,
            WhileStatementSyntax whileStatement,
            CancellationToken cancellationToken)
        {
            SyntaxNode oldRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);

            ForStatementSyntax newNode = ForStatement(
                Token(SyntaxKind.ForKeyword)
                .WithTriviaFrom(whileStatement.WhileKeyword),
                Token(
                    whileStatement.OpenParenToken.LeadingTrivia,
                    SyntaxKind.OpenParenToken,
                    default(SyntaxTriviaList)),
                null,
                default(SeparatedSyntaxList <ExpressionSyntax>),
                Token(SyntaxKind.SemicolonToken),
                null,
                Token(SyntaxKind.SemicolonToken),
                default(SeparatedSyntaxList <ExpressionSyntax>),
                Token(
                    default(SyntaxTriviaList),
                    SyntaxKind.CloseParenToken,
                    whileStatement.CloseParenToken.TrailingTrivia),
                whileStatement.Statement);

            newNode = newNode
                      .WithTriviaFrom(whileStatement)
                      .WithFormatterAnnotation();

            SyntaxNode newRoot = oldRoot.ReplaceNode(whileStatement, newNode);

            return(document.WithSyntaxRoot(newRoot));
        }
Beispiel #2
0
        public static Task <Document> RefactorAsync(
            Document document,
            WhileStatementSyntax whileStatement,
            CancellationToken cancellationToken)
        {
            ForStatementSyntax newNode = ForStatement(
                Token(SyntaxKind.ForKeyword).WithTriviaFrom(whileStatement.WhileKeyword),
                Token(
                    whileStatement.OpenParenToken.LeadingTrivia,
                    SyntaxKind.OpenParenToken,
                    default(SyntaxTriviaList)),
                default(VariableDeclarationSyntax),
                default(SeparatedSyntaxList <ExpressionSyntax>),
                SemicolonToken(),
                default(ExpressionSyntax),
                SemicolonToken(),
                default(SeparatedSyntaxList <ExpressionSyntax>),
                Token(
                    default(SyntaxTriviaList),
                    SyntaxKind.CloseParenToken,
                    whileStatement.CloseParenToken.TrailingTrivia),
                whileStatement.Statement);

            newNode = newNode
                      .WithTriviaFrom(whileStatement)
                      .WithFormatterAnnotation();

            return(document.ReplaceNodeAsync(whileStatement, newNode, cancellationToken));
        }
Beispiel #3
0
        public static async Task <Document> RefactorAsync(
            Document document,
            ForEachStatementSyntax forEachStatement,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (document == null)
            {
                throw new ArgumentNullException(nameof(document));
            }

            if (forEachStatement == null)
            {
                throw new ArgumentNullException(nameof(forEachStatement));
            }

            SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);

            SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

            IEnumerable <ReferencedSymbol> referencedSymbols = await SymbolFinder.FindReferencesAsync(
                semanticModel.GetDeclaredSymbol(forEachStatement),
                document.Project.Solution,
                cancellationToken).ConfigureAwait(false);

            string identifier = Identifier.EnsureUniqueLocalName(Identifier.DefaultForVariableName, forEachStatement.Statement.SpanStart, semanticModel, cancellationToken);

            ForStatementSyntax forStatement = ForStatement(
                declaration: VariableDeclaration(
                    IntType(),
                    identifier,
                    EqualsValueClause(NumericLiteralExpression(0))),
                initializers: default(SeparatedSyntaxList <ExpressionSyntax>),
                condition: LessThanExpression(
                    IdentifierName(identifier),
                    SimpleMemberAccessExpression(
                        IdentifierName(forEachStatement.Expression.ToString()),
                        IdentifierName(GetCountOrLengthPropertyName(forEachStatement.Expression, semanticModel, cancellationToken)))),
                incrementors: SingletonSeparatedList <ExpressionSyntax>(
                    PostIncrementExpression(
                        IdentifierName(identifier))),
                statement: forEachStatement.Statement.ReplaceNodes(
                    GetIdentifiers(root, referencedSymbols),
                    (f, g) =>
            {
                return(ElementAccessExpression(
                           IdentifierName(forEachStatement.Expression.ToString()),
                           BracketedArgumentList(
                               SingletonSeparatedList(Argument(IdentifierName(identifier))))
                           ).WithTriviaFrom(f));
            }));

            forStatement = forStatement
                           .WithTriviaFrom(forEachStatement)
                           .WithFormatterAnnotation();

            root = root.ReplaceNode(forEachStatement, forStatement);

            return(document.WithSyntaxRoot(root));
        }
Beispiel #4
0
        public static async Task <Document> RefactorAsync(
            Document document,
            ForEachStatementSyntax forEachStatement,
            CancellationToken cancellationToken)
        {
            SyntaxNode oldRoot = await document.GetSyntaxRootAsync(cancellationToken);

            ForStatementSyntax forStatement = await GetForStatementAsync(
                document,
                forEachStatement,
                cancellationToken);

            forStatement = forStatement
                           .WithTriviaFrom(forEachStatement)
                           .WithAdditionalAnnotations(Formatter.Annotation);

            SyntaxNode newRoot = oldRoot.ReplaceNode(forEachStatement, forStatement);

            return(document.WithSyntaxRoot(newRoot));
        }
Beispiel #5
0
        public static Task <Document> RefactorAsync(
            Document document,
            ForEachStatementSyntax forEachStatement,
            SemanticModel semanticModel,
            bool reverseLoop = false,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            string name = NameGenerator.Default.EnsureUniqueLocalName(
                DefaultNames.ForVariable,
                semanticModel,
                forEachStatement.Statement.SpanStart,
                cancellationToken: cancellationToken);

            SyntaxToken identifier = Identifier(name);

            if (name != DefaultNames.ForVariable)
            {
                identifier = identifier.WithRenameAnnotation();
            }

            ExpressionSyntax forEachExpression = forEachStatement.Expression;

            MemberAccessExpressionSyntax countOrLengthMemberAccess = SimpleMemberAccessExpression(
                forEachExpression.WithoutTrivia(),
                IdentifierName(CSharpUtility.GetCountOrLengthPropertyName(forEachExpression, semanticModel, cancellationToken)));

            VariableDeclarationSyntax    declaration = null;
            BinaryExpressionSyntax       condition   = null;
            PostfixUnaryExpressionSyntax incrementor = null;

            if (reverseLoop)
            {
                declaration = VariableDeclaration(
                    IntType(),
                    identifier,
                    EqualsValueClause(
                        SubtractExpression(
                            countOrLengthMemberAccess,
                            NumericLiteralExpression(1))));

                condition = GreaterThanOrEqualExpression(IdentifierName(name), NumericLiteralExpression(0));

                incrementor = PostDecrementExpression(IdentifierName(name));
            }
            else
            {
                declaration = VariableDeclaration(
                    IntType(),
                    identifier,
                    EqualsValueClause(NumericLiteralExpression(0)));

                condition = LessThanExpression(
                    IdentifierName(name),
                    countOrLengthMemberAccess);

                incrementor = PostIncrementExpression(IdentifierName(name));
            }

            StatementSyntax statement = forEachStatement.Statement.ReplaceNodes(
                GetVariableReferences(forEachStatement, semanticModel, cancellationToken),
                (node, _) =>
            {
                return(ElementAccessExpression(
                           forEachExpression.WithoutTrivia(),
                           BracketedArgumentList(SingletonSeparatedList(Argument(IdentifierName(name))))
                           ).WithTriviaFrom(node));
            });

            ForStatementSyntax forStatement = ForStatement(
                declaration: declaration,
                initializers: default(SeparatedSyntaxList <ExpressionSyntax>),
                condition: condition,
                incrementors: SingletonSeparatedList <ExpressionSyntax>(incrementor),
                statement: statement);

            forStatement = forStatement
                           .WithTriviaFrom(forEachStatement)
                           .WithFormatterAnnotation();

            return(document.ReplaceNodeAsync(forEachStatement, forStatement, cancellationToken));
        }
        public static async Task <Document> RefactorAsync(
            Document document,
            ForEachStatementSyntax forEachStatement,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (document == null)
            {
                throw new ArgumentNullException(nameof(document));
            }

            if (forEachStatement == null)
            {
                throw new ArgumentNullException(nameof(forEachStatement));
            }

            SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);

            SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

            IEnumerable <ReferencedSymbol> referencedSymbols = await SymbolFinder.FindReferencesAsync(
                semanticModel.GetDeclaredSymbol(forEachStatement),
                document.Project.Solution,
                cancellationToken).ConfigureAwait(false);

            ForStatementSyntax forStatement = ForStatement(
                declaration: VariableDeclaration(
                    PredefinedType(Token(SyntaxKind.IntKeyword)),
                    SingletonSeparatedList(
                        VariableDeclarator(CounterIdentifierName)
                        .WithInitializer(
                            EqualsValueClause(
                                LiteralExpression(
                                    SyntaxKind.NumericLiteralExpression,
                                    Literal(0)))))),
                initializers: SeparatedList <ExpressionSyntax>(),
                condition: BinaryExpression(
                    SyntaxKind.LessThanExpression,
                    IdentifierName(CounterIdentifierName),
                    MemberAccessExpression(
                        SyntaxKind.SimpleMemberAccessExpression,
                        IdentifierName(forEachStatement.Expression.ToString()),
                        IdentifierName(GetCountOrLengthPropertyName(forEachStatement.Expression, semanticModel)))),
                incrementors: SingletonSeparatedList <ExpressionSyntax>(
                    PostfixUnaryExpression(
                        SyntaxKind.PostIncrementExpression,
                        IdentifierName(CounterIdentifierName))),
                statement: forEachStatement.Statement.ReplaceNodes(
                    GetIdentifiers(root, referencedSymbols),
                    (f, g) =>
            {
                return(ElementAccessExpression(
                           IdentifierName(forEachStatement.Expression.ToString()),
                           BracketedArgumentList(
                               SingletonSeparatedList(Argument(IdentifierName(CounterIdentifierName))))
                           ).WithTriviaFrom(f));
            }));

            forStatement = forStatement
                           .WithTriviaFrom(forEachStatement)
                           .WithFormatterAnnotation();

            root = root.ReplaceNode(forEachStatement, forStatement);

            return(document.WithSyntaxRoot(root));
        }