1

ご想像のとおり、私は roslyn について、特にコード アナライザーとして学んでいます。

構文の強調表示は完全に機能しています。ただし、次のコード アクションは、ノードを削除するときにサイレントに失敗します。

    private async Task<Document> RemoveNode(Document document, LocalDeclarationStatementSyntax typeDecl, CancellationToken cancellationToken)
    {
        IEnumerable<SyntaxNode> oldNode = typeDecl.DescendantNodes().OfType<VariableDeclarationSyntax>();

        SyntaxNode oldRoot = await document.GetSyntaxRootAsync(cancellationToken);

        SyntaxNode newRoot = oldRoot.RemoveNode(oldNode.Single(), SyntaxRemoveOptions.KeepNoTrivia); //Analyzer fails here

        return document.WithSyntaxRoot(newRoot);
    }

主題:

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            FruitMix fm = new FruitMix(); //This is the matched node
        }
    }
}

Roslyn の操作方法に関する「より大きな」全体像を見逃しているように感じます。そのため、ここでのヘルプは素晴らしいものですが、役立つリンクやリソースもいくつかあります。

このプロジェクトをここにアップロードしましたが、「最小限の」例ではありませんが、問題を簡単に再現できます。上記のコードはCodeFixProvider.cs.

ありがとう

4

1 に答える 1

2

スローされたすべての例外でブレークを有効にしてコードを実行するとArgumentNullExceptionRemoveNode()特にSyntaxFactory.LocalDeclarationStatement().

例外は紛らわしいです ( GitHub で既に報告されています) が、実際にはエラーです:VariableDeclarationSyntax親から削除しようとしています (その構文はLocalDeclarationStatement : ? VariableDeclarationLocalDeclarationStatementSyntaxのようなものになります)。withoutは有効ではないため、例外が発生します。const ;LocalDeclarationStatementSyntaxVariableDeclarationSyntax

最も簡単な修正は、単に親を削除することLocalDeclarationStatementSyntaxです:

SyntaxNode newRoot = oldRoot.RemoveNode(oldNode.Single().Parent, SyntaxRemoveOptions.KeepNoTrivia);
于 2016-04-08T15:44:54.253 に答える