2016-11-27 9 views
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()。非常に間違っているように見えますが、スペースが必要で、構文エラーが発生するはずです。何が起こっている?

答えて

2

問題を解決するためにこれを追加します。

SyntaxFactory.UsingDirective(
    SyntaxFactory.ParseName("MyNamespace.SubNamespace")).NormalizeWhitespace(); 
+0

おかげで男を!だから、この空白は単に視覚的なトリビアなので、実際には何も変わらない(解析と意味解析の両方に有害ではない)か、それとも何らかのデメージをしているのだろうか? – Andry

+1

Roslynの構文木は抽象的ではありませんが、具体的には、ソースコードのすべてが3つに含まれています(したがって、空白、コメント、xmlドキュメント、すべて)。これは、3つを元の3つに戻すことを可能にすることです。あなたのケースでは、生成された3つは実際には有効ではなく、適切な空白が必要です(ただし、有効なILを生成することを期待しています)。これはNormalizeWhitespaceを行います。また、WithAdditionalAnnotations(Formatter.Annotation)をCodeFixに追加すると、結果のノードに適切な空白の書式設定が必要であることを示すことができます。 – Ties

+0

ここで見つけたように: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

関連する問題