1
Roslynを使用して、別のツリーからツリーを生成しています。そこで、AST変換を扱っています。私はノードを生成するためにSyntaxFactory
を使用しています。私はこのようになっているはずのau using
ディレクティブを作成したい特定の場合には Roslynの工場からUsingDirectiveを作成するときに正しくない構文が生成される
using MyNamespace.SubNamespace;
をだから私は実行します。
var usingDirective = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("MyNamespace.SubNamespace"));
var newNode = mynode.AddUsings(new[] { usingDirective });
をしかし、私は、生成され、最終的なツリーnewNode
を検査した場合(単純にnewNode.ToString()
を呼び出して生成された文字列ソースコード)、私は私の指示が次のように追加されていることがわかります:
usingMyNamespace.SubNamespace;
私はちょうど同じことを見ることができます:usingDirective.ToString()
。非常に間違っているように見えますが、スペースが必要で、構文エラーが発生するはずです。何が起こっている?
おかげで男を!だから、この空白は単に視覚的なトリビアなので、実際には何も変わらない(解析と意味解析の両方に有害ではない)か、それとも何らかのデメージをしているのだろうか? – Andry
Roslynの構文木は抽象的ではありませんが、具体的には、ソースコードのすべてが3つに含まれています(したがって、空白、コメント、xmlドキュメント、すべて)。これは、3つを元の3つに戻すことを可能にすることです。あなたのケースでは、生成された3つは実際には有効ではなく、適切な空白が必要です(ただし、有効なILを生成することを期待しています)。これはNormalizeWhitespaceを行います。また、WithAdditionalAnnotations(Formatter.Annotation)をCodeFixに追加すると、結果のノードに適切な空白の書式設定が必要であることを示すことができます。 – Ties
ここで見つけたように:http://stackoverflow.com/questions/40578806/what-is-the-canonical-way-to-convert-a-methoddeclarationsyntax-to-a-constructord;)Roslynのwikiでは、ノード、トーク、トリビアについて詳しく知ることができます(このトピック):https://github.com/dotnet/rosln/wiki/Roslyn%20Overview#syntax-trivia – Ties