Example #1
0
        public static void RegisterRefactoring(RefactoringContext context, LocalFunctionStatementSyntax localFunctionStatement)
        {
            FileLinePositionSpan fileSpan = GetFileLinePositionSpan(localFunctionStatement, context.CancellationToken);

            context.RegisterRefactoring(
                $"Comment out {localFunctionStatement.GetTitle()}",
                cancellationToken => RefactorAsync(context.Document, fileSpan.StartLine(), fileSpan.EndLine(), cancellationToken));
        }
Example #2
0
        public static void RegisterRefactoring(RefactoringContext context, StatementSyntax statement)
        {
            FileLinePositionSpan fileSpan = statement.SyntaxTree.GetLineSpan(statement.Span, context.CancellationToken);

            context.RegisterRefactoring(
                "Comment out statement",
                ct => RefactorAsync(context.Document, fileSpan.StartLine(), fileSpan.EndLine(), ct));
        }
Example #3
0
        public static void RegisterRefactoring(RefactoringContext context, MemberDeclarationSyntax member)
        {
            FileLinePositionSpan fileSpan = GetFileLinePositionSpan(member, context.CancellationToken);

            context.RegisterRefactoring(
                $"Comment out {member.GetTitle()}",
                cancellationToken => RefactorAsync(context.Document, fileSpan.StartLine(), fileSpan.EndLine(), cancellationToken));
        }
        public static void ComputeRefactoring(RefactoringContext context, MemberDeclarationSyntax member)
        {
            MemberDeclarationListInfo info = SyntaxInfo.MemberDeclarationListInfo(member.Parent);

            if (!info.Success)
            {
                return;
            }

            SyntaxList <MemberDeclarationSyntax> members = info.Members;

            if (members.Count <= 1)
            {
                return;
            }

            int index = IndexOfMemberToSwap(member, members, context.Span);

            if (index == -1)
            {
                return;
            }

            SyntaxTree tree = member.SyntaxTree;

            FileLinePositionSpan fileLinePositionSpan = tree.GetLineSpan(context.Span, context.CancellationToken);

            int startLine = fileLinePositionSpan.StartLine();
            int endLine   = fileLinePositionSpan.EndLine();

            if (startLine <= tree.GetEndLine(members[index].TrimmedSpan(), context.CancellationToken))
            {
                return;
            }

            if (endLine >= tree.GetStartLine(members[index + 1].TrimmedSpan(), context.CancellationToken))
            {
                return;
            }

            if (context.IsRefactoringEnabled(RefactoringIdentifiers.RemoveMemberDeclarations))
            {
                context.RegisterRefactoring(
                    "Remove members above",
                    ct => ReplaceMembersAsync(context.Document, info, members.Skip(index + 1), ct));

                context.RegisterRefactoring(
                    "Remove members below",
                    ct => ReplaceMembersAsync(context.Document, info, members.Take(index + 1), ct));
            }

            if (context.IsRefactoringEnabled(RefactoringIdentifiers.SwapMemberDeclarations))
            {
                context.RegisterRefactoring(
                    "Swap members",
                    ct => SwapMembersAsync(context.Document, info, index, ct));
            }
        }
        public static void RegisterRefactoring(RefactoringContext context, LocalFunctionStatementSyntax localFunctionStatement)
        {
            FileLinePositionSpan fileSpan = GetFileLinePositionSpan(localFunctionStatement, context.CancellationToken);

            context.RegisterRefactoring(
                $"Comment out {CSharpFacts.GetTitle(localFunctionStatement)}",
                ct => RefactorAsync(context.Document, fileSpan.StartLine(), fileSpan.EndLine(), ct),
                RefactoringDescriptors.CommentOutMemberDeclaration);
        }
        public static bool IsSingleLine(
            this SyntaxNode node,
            bool includeExteriorTrivia = true,
            bool trim = true)
        {
            if (node == null)
            {
                throw new ArgumentNullException(nameof(node));
            }

            TextSpan span = TextSpan.FromBounds(
                GetStartIndex(node, includeExteriorTrivia, trim),
                GetEndIndex(node, includeExteriorTrivia, trim));

            FileLinePositionSpan positionSpan = node.SyntaxTree.GetLineSpan(span);

            return(positionSpan.StartLine() == positionSpan.EndLine());
        }
 public static bool IsMultiLine(this FileLinePositionSpan fileLinePositionSpan)
 {
     return(fileLinePositionSpan.StartLine() != fileLinePositionSpan.EndLine());
 }
Example #8
0
 internal static int GetLineCount(this FileLinePositionSpan fileLinePositionSpan)
 {
     return(fileLinePositionSpan.EndLine() - fileLinePositionSpan.StartLine() + 1);
 }
Example #9
0
 public static bool IsSingleLine(this FileLinePositionSpan fileLinePositionSpan)
 {
     return(fileLinePositionSpan.StartLine() == fileLinePositionSpan.EndLine());
 }
Example #10
0
        private static void AnalyzeAddExpression(SyntaxNodeAnalysisContext context)
        {
            SyntaxNode node = context.Node;

            if (node.ContainsDiagnostics)
            {
                return;
            }

            if (node.SpanContainsDirectives())
            {
                return;
            }

            if (node.IsParentKind(SyntaxKind.AddExpression))
            {
                return;
            }

            var addExpression = (BinaryExpressionSyntax)node;

            ExpressionSyntax firstExpression = null;
            ExpressionSyntax lastExpression  = null;
            var isLiteral  = false;
            var isVerbatim = false;
            int startLine  = -1;

            foreach (ExpressionSyntax expression in addExpression.AsChain().Reverse())
            {
                context.CancellationToken.ThrowIfCancellationRequested();

                switch (expression.Kind())
                {
                case SyntaxKind.StringLiteralExpression:
                {
                    StringLiteralExpressionInfo stringLiteral = SyntaxInfo.StringLiteralExpressionInfo(expression);

                    bool isVerbatim2 = stringLiteral.IsVerbatim;

                    if (firstExpression == null)
                    {
                        firstExpression = expression;
                        isLiteral       = true;
                        isVerbatim      = isVerbatim2;

                        if (isVerbatim)
                        {
                            startLine = expression.SyntaxTree.GetLineSpan(expression.GetSpan()).StartLine();
                        }
                    }
                    else if (!isLiteral ||
                             isVerbatim != isVerbatim2 ||
                             (!isVerbatim && !CheckHexadecimalEscapeSequence(stringLiteral)))
                    {
                        if (lastExpression != null)
                        {
                            Analyze(context, firstExpression, lastExpression, isVerbatim);
                        }

                        firstExpression = null;
                        lastExpression  = null;
                    }
                    else
                    {
                        lastExpression = expression;

                        if (isVerbatim)
                        {
                            FileLinePositionSpan lineSpan = expression.SyntaxTree.GetLineSpan(expression.GetSpan());

                            if (startLine != lineSpan.EndLine())
                            {
                                firstExpression = null;
                                lastExpression  = null;
                            }
                            else
                            {
                                startLine = lineSpan.StartLine();
                            }
                        }
                    }

                    break;
                }

                case SyntaxKind.InterpolatedStringExpression:
                {
                    var interpolatedString = ((InterpolatedStringExpressionSyntax)expression);

                    bool isVerbatim2 = interpolatedString.IsVerbatim();

                    if (firstExpression == null)
                    {
                        firstExpression = expression;
                        isLiteral       = false;
                        isVerbatim      = isVerbatim2;

                        if (isVerbatim)
                        {
                            startLine = expression.SyntaxTree.GetLineSpan(expression.GetSpan()).StartLine();
                        }
                    }
                    else if (isLiteral ||
                             isVerbatim != isVerbatim2 ||
                             (!isVerbatim && !CheckHexadecimalEscapeSequence(interpolatedString)))
                    {
                        if (lastExpression != null)
                        {
                            Analyze(context, firstExpression, lastExpression, isVerbatim);
                        }

                        firstExpression = null;
                        lastExpression  = null;
                    }
                    else
                    {
                        lastExpression = expression;

                        if (isVerbatim)
                        {
                            FileLinePositionSpan lineSpan = expression.SyntaxTree.GetLineSpan(expression.GetSpan());

                            if (startLine != lineSpan.EndLine())
                            {
                                firstExpression = null;
                                lastExpression  = null;
                            }
                            else
                            {
                                startLine = lineSpan.StartLine();
                            }
                        }
                    }

                    break;
                }

                default:
                {
                    if (lastExpression != null)
                    {
                        Analyze(context, firstExpression, lastExpression, isVerbatim);
                    }

                    firstExpression = null;
                    lastExpression  = null;
                    break;
                }
                }
            }

            if (lastExpression != null)
            {
                Analyze(context, firstExpression, lastExpression, isVerbatim);
            }
        }
        public static void ComputeRefactoring(RefactoringContext context, MemberDeclarationSyntax member)
        {
            var parent = member.Parent as MemberDeclarationSyntax;

            if (parent != null)
            {
                SyntaxList <MemberDeclarationSyntax> members = parent.GetMembers();

                if (members.Count > 1)
                {
                    int index = IndexOfMemberToSwap(member, members, context.Span);

                    if (index != -1)
                    {
                        FileLinePositionSpan fileSpan = member.SyntaxTree.GetLineSpan(context.Span, context.CancellationToken);
                        if (fileSpan.StartLine() > members[index].SyntaxTree.GetLineSpan(members[index].TrimmedSpan(), context.CancellationToken).EndLine() &&
                            fileSpan.EndLine() < members[index + 1].SyntaxTree.GetLineSpan(members[index + 1].TrimmedSpan(), context.CancellationToken).StartLine())
                        {
                            if (context.IsRefactoringEnabled(RefactoringIdentifiers.RemoveMemberDeclarations))
                            {
                                context.RegisterRefactoring(
                                    "Remove members above",
                                    cancellationToken =>
                                {
                                    return(ReplaceMembersAsync(
                                               context.Document,
                                               parent,
                                               members,
                                               List(members.Skip(index + 1)),
                                               cancellationToken));
                                });

                                context.RegisterRefactoring(
                                    "Remove members below",
                                    cancellationToken =>
                                {
                                    return(ReplaceMembersAsync(
                                               context.Document,
                                               parent,
                                               members,
                                               List(members.Take(index + 1)),
                                               cancellationToken));
                                });
                            }

                            if (context.IsRefactoringEnabled(RefactoringIdentifiers.SwapMemberDeclarations))
                            {
                                context.RegisterRefactoring(
                                    "Swap members",
                                    cancellationToken =>
                                {
                                    return(RefactorAsync(
                                               context.Document,
                                               parent,
                                               members,
                                               index,
                                               cancellationToken));
                                });
                            }
                        }
                    }
                }
            }
        }
        public static void ComputeRefactoring(RefactoringContext context, MemberDeclarationSyntax member)
        {
            SyntaxNode parent = member.Parent;

            if (parent?.IsKind(
                SyntaxKind.NamespaceDeclaration,
                SyntaxKind.ClassDeclaration,
                SyntaxKind.StructDeclaration,
                SyntaxKind.InterfaceDeclaration) == true)
            {
                var parentMember = (MemberDeclarationSyntax)parent;

                SyntaxList<MemberDeclarationSyntax> members = parentMember.GetMembers();

                if (members.Count > 1)
                {
                    int index = IndexOfMemberToSwap(member, members, context.Span);

                    if (index != -1)
                    {
                        SyntaxTree tree = member.SyntaxTree;

                        FileLinePositionSpan fileLinePositionSpan = tree.GetLineSpan(context.Span, context.CancellationToken);

                        int startLine = fileLinePositionSpan.StartLine();
                        int endLine = fileLinePositionSpan.EndLine();

                        if (startLine > tree.GetEndLine(members[index].TrimmedSpan(), context.CancellationToken)
                            && endLine < tree.GetStartLine(members[index + 1].TrimmedSpan(), context.CancellationToken))
                        {
                            if (context.IsRefactoringEnabled(RefactoringIdentifiers.RemoveMemberDeclarations))
                            {
                                context.RegisterRefactoring(
                                    "Remove members above",
                                    cancellationToken =>
                                    {
                                        return ReplaceMembersAsync(
                                            context.Document,
                                            parentMember,
                                            List(members.Skip(index + 1)),
                                            cancellationToken);
                                    });

                                context.RegisterRefactoring(
                                    "Remove members below",
                                    cancellationToken =>
                                    {
                                        return ReplaceMembersAsync(
                                            context.Document,
                                            parentMember,
                                            List(members.Take(index + 1)),
                                            cancellationToken);
                                    });
                            }

                            if (context.IsRefactoringEnabled(RefactoringIdentifiers.SwapMemberDeclarations))
                            {
                                context.RegisterRefactoring(
                                    "Swap members",
                                    cancellationToken =>
                                    {
                                        return RefactorAsync(
                                            context.Document,
                                            parentMember,
                                            members,
                                            index,
                                            cancellationToken);
                                    });
                            }
                        }
                    }
                }
            }
        }