Пример #1
0
        public static void RemoveModifiers(
            CodeFixContext context,
            Diagnostic diagnostic,
            SyntaxNode node,
            SyntaxTokenList modifiers,
            Func <SyntaxToken, bool> predicate,
            string additionalKey = null)
        {
            List <int> indexes = null;

            for (int i = 0; i < modifiers.Count; i++)
            {
                if (predicate(modifiers[i]))
                {
                    (indexes ??= new List <int>()).Add(i);
                }
            }

            if (indexes != null)
            {
                if (indexes.Count == 1)
                {
                    RemoveModifier(context, diagnostic, node, modifiers[indexes[0]], additionalKey: additionalKey);
                }
                else
                {
                    CodeAction codeAction = CodeAction.Create(
                        "Remove modifiers",
                        cancellationToken =>
                    {
                        SyntaxNode newNode = node;

                        for (int i = indexes.Count - 1; i >= 0; i--)
                        {
                            newNode = ModifierList.RemoveAt(newNode, indexes[i]);
                        }

                        return(context.Document.ReplaceNodeAsync(node, newNode, cancellationToken));
                    },
                        GetEquivalenceKey(diagnostic, additionalKey));

                    context.RegisterCodeFix(codeAction, diagnostic);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Creates a new <see cref="ModifierListInfo"/> with accessibility modifiers updated.
        /// </summary>
        /// <param name="newAccessibility"></param>
        /// <param name="comparer"></param>
        /// <returns></returns>
        public ModifierListInfo WithExplicitAccessibility(Accessibility newAccessibility, IComparer <SyntaxKind> comparer = null)
        {
            ThrowInvalidOperationIfNotInitialized();

            Accessibility accessibility = ExplicitAccessibility;

            if (accessibility == newAccessibility)
            {
                return(this);
            }

            comparer = comparer ?? ModifierKindComparer.Default;

            SyntaxNode declaration = Parent;

            if (accessibility.IsSingleTokenAccessibility() &&
                newAccessibility.IsSingleTokenAccessibility())
            {
                int insertIndex = ModifierList.GetInsertIndex(Modifiers, GetTokenKind(), comparer);

                int tokenIndex = GetFirstTokenIndex();

                if (tokenIndex == insertIndex ||
                    tokenIndex == insertIndex - 1)
                {
                    SyntaxToken token = Modifiers[tokenIndex];

                    SyntaxToken newToken = SyntaxFactory.Token(GetTokenKind()).WithTriviaFrom(token);

                    SyntaxTokenList newModifiers = Modifiers.Replace(token, newToken);

                    return(WithModifiers(newModifiers));
                }
            }

            if (accessibility != Accessibility.NotApplicable)
            {
                (int tokenIndex, int secondTokenIndex) = GetTokenIndexes();

                declaration = ModifierList.RemoveAt(declaration, Math.Max(tokenIndex, secondTokenIndex));

                if (secondTokenIndex != -1)
                {
                    declaration = ModifierList.RemoveAt(declaration, Math.Min(tokenIndex, secondTokenIndex));
                }
            }

            if (newAccessibility != Accessibility.NotApplicable)
            {
                declaration = ModifierList.Insert(declaration, newAccessibility, comparer);
            }

            return(SyntaxInfo.ModifierListInfo(declaration));

            SyntaxKind GetTokenKind()
            {
                switch (newAccessibility)
                {
                case Accessibility.Private:
                    return(SyntaxKind.PrivateKeyword);

                case Accessibility.Protected:
                    return(SyntaxKind.ProtectedKeyword);

                case Accessibility.Internal:
                    return(SyntaxKind.InternalKeyword);

                case Accessibility.Public:
                    return(SyntaxKind.PublicKeyword);

                case Accessibility.NotApplicable:
                    return(SyntaxKind.None);

                default:
                    throw new ArgumentException("", nameof(newAccessibility));
                }
            }
        }