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); } } }
/// <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)); } } }