私はRoslynの構文木の中のノードを置き換えようとしています。それはちょうどうまくいっていますが、気になる邪魔になります。はではありません。SyntaxNode.ReplaceNodeがSyntaxTreeオプションを変更するのはなぜですか?
構文ツリーはスクリプトから生成され、その結果もスクリプトベースの構文ツリーにしたいが、何らかの理由でツリー内のノードを置き換えると、変更されたオプションを持つ新しい構文ツリーが作成される:Kind
Script
の代わりにRegular
になります。それはSyntaxTree.WithRootAndOptions
で修正可能ですが、私はそれを呼び出す必要がある場合、私は何か間違っているように感じています。
サンプルプログラム:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
Script script = CSharpScript.Create("Console.WriteLine(\"Before\")",
ScriptOptions.Default.AddImports("System"));
var compilation = script.GetCompilation();
var tree = compilation.SyntaxTrees.Single();
var after = SyntaxFactory.LiteralExpression(
SyntaxKind.StringLiteralExpression,
SyntaxFactory.Literal("After"));
var root = tree.GetRoot();
var before = root.DescendantNodes().OfType<LiteralExpressionSyntax>().Single();
var newRoot = root.ReplaceNode(before, after);
var fixedTree = newRoot.SyntaxTree.WithRootAndOptions(newRoot, tree.Options);
Console.WriteLine(newRoot); // Console.WriteLine("After")
Console.WriteLine(tree.Options.Kind); // Script
Console.WriteLine(newRoot.SyntaxTree.Options.Kind); // Regular
Console.WriteLine(fixedTree.Options.Kind); // Script
}
}
(。出力はコメントである)
は、この問題を回避するには、実際には正しいですか、私は、ツリーでノードを交換する必要があり、いくつかの異なる方法がありますか?
言語バージョンも変更されます。 C#5構文ツリーを使用するかどうかを明示的に指定する必要があります。私は '.WithRootAndOptions()'も使いましたが、それには問題はありませんでした。 – Tamas
私の腸はこれがバグだと言っています... –
@JasonMalinowski:私はあなたがそれを言ってくれてうれしいです - 私は確かにしたくありません:)(しかし、はい、それは私にもそれのように感じます。 ) –