private static Task <Document> RefactorAsync(
            Document document,
            EnumDeclarationSyntax enumDeclaration,
            TextSpan span,
            CancellationToken cancellationToken)
        {
            SyntaxTrivia trivia = enumDeclaration.FindTrivia(span.Start);

            SyntaxToken token = trivia.Token;

            EnumMemberDeclarationSyntax enumMemberDeclaration = token
                                                                .GetPreviousToken()
                                                                .Parent
                                                                .FirstAncestorOrSelf <EnumMemberDeclarationSyntax>();

            int enumMemberIndex = enumDeclaration.Members.IndexOf(enumMemberDeclaration);

            SyntaxTriviaList trailingTrivia = token.TrailingTrivia;

            SyntaxToken newToken = token.WithTrailingTrivia(trailingTrivia.Skip(trailingTrivia.IndexOf(trivia) + 1));

            EnumDeclarationSyntax newEnumDeclaration = enumDeclaration.ReplaceToken(token, newToken);

            var settings = new DocumentationCommentGeneratorSettings(ImmutableArray.Create(_leadingSlashesRegex.Replace(trivia.ToString(), "")));

            EnumMemberDeclarationSyntax newEnumMemberDeclaration = newEnumDeclaration.Members[enumMemberIndex].WithNewSingleLineDocumentationComment(settings);

            newEnumDeclaration = newEnumDeclaration.WithMembers(newEnumDeclaration.Members.ReplaceAt(enumMemberIndex, newEnumMemberDeclaration));

            return(document.ReplaceNodeAsync(enumDeclaration, newEnumDeclaration, cancellationToken));
        }
Beispiel #2
0
        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            Diagnostic enumDiag = context.Diagnostics.First();

            context.RegisterCodeFix(CodeAction.Create(title, async token =>
            {
                // файл, в кот произошла диагностика
                Document doc = context.Document;

                // корневой элемент синтаксического дерева
                var root = await doc.GetSyntaxRootAsync(token);

                //узел, кот описывает объявление интерфейса
                EnumDeclarationSyntax node = root.FindNode(enumDiag.Location.SourceSpan) as EnumDeclarationSyntax;

                // получаем имя интерфейса
                string enumName = node.Identifier.Text;
                char first      = enumName[0];
                enumName        = enumName.Remove(0, 1).Insert(0, char.ToUpper(first).ToString());

                // синтаксич дерево неизменяемо
                // создаем новый узел через замену, т.к. нет конструктора
                EnumDeclarationSyntax newNode = node.ReplaceToken(node.Identifier, SyntaxFactory.Identifier(enumName));
                //SyntaxFactory - создает новый идентификатор

                var newDoc = doc.WithSyntaxRoot(root.ReplaceNode(node, newNode));
                return(newDoc);
            }), enumDiag);
        }
Beispiel #3
0
        private static EnumDeclarationSyntax AddLineFeedsToCommas(EnumDeclarationSyntax enumDeclarationSyntax)
        {
            var none = new SyntaxToken();
            var trailingTriviaList = SyntaxTriviaList.Create(SyntaxFactory.ElasticCarriageReturnLineFeed);

            Func <EnumDeclarationSyntax, SyntaxToken> next = enumSyntax => enumSyntax.ChildNodesAndTokens()
                                                             .Where(nodeOrToken => nodeOrToken.IsToken)
                                                             .Select(nodeOrToken => nodeOrToken.AsToken())
                                                             .FirstOrDefault(
                token =>
                token.Value.Equals(",") &&
                (!token.HasTrailingTrivia || !token.TrailingTrivia.Any(SyntaxKind.EndOfLineTrivia)));

            SyntaxToken current;

            while ((current = next(enumDeclarationSyntax)) != none)
            {
                enumDeclarationSyntax = enumDeclarationSyntax.ReplaceToken(current,
                                                                           SyntaxFactory.Identifier(SyntaxTriviaList.Empty, ",", trailingTriviaList)
                                                                           );
            }

            return(enumDeclarationSyntax);
        }
        private static EnumDeclarationSyntax AddLineFeedsToCommas(EnumDeclarationSyntax enumDeclarationSyntax)
        {
            var none = new SyntaxToken();
            var trailingTriviaList = SyntaxTriviaList.Create(SyntaxFactory.ElasticCarriageReturnLineFeed);

            Func<EnumDeclarationSyntax, SyntaxToken> next = enumSyntax => enumSyntax.ChildNodesAndTokens()
                .Where(nodeOrToken => nodeOrToken.IsToken)
                .Select(nodeOrToken => nodeOrToken.AsToken())
                .FirstOrDefault(
                    token =>
                        token.Value.Equals(",") &&
                        (!token.HasTrailingTrivia || !token.TrailingTrivia.Any(SyntaxKind.EndOfLineTrivia)));

            SyntaxToken current;
            while ((current = next(enumDeclarationSyntax)) != none)
            {
                enumDeclarationSyntax = enumDeclarationSyntax.ReplaceToken(current,
                    SyntaxFactory.Identifier(SyntaxTriviaList.Empty, ",", trailingTriviaList)
                    );
            }

            return enumDeclarationSyntax;
        }