Roslyn'de bir sözdizimi ağacındaki düğümleri değiştirmeye çalışıyorum ve bu sadece çalışmakla ilgili ama 'un bir sorun olması gerektiğini hisseden bir sıkıntıyla.SyntaxNode.ReplaceNode, SyntaxTree seçeneklerini neden değiştiriyor?
Sözdizimi ağacı bir komut dosyasından oluşturulur ve sonucun senaryona dayalı bir sözdizimi ağacı olmasını istiyorum - ama bir sebepten dolayı, ağaçtaki bir düğümü değiştirmek, değiştirilen seçeneklerle yeni bir sözdizimi ağacı oluşturur: Kind
Script
yerine Regular
olur. Bu, SyntaxTree.WithRootAndOptions
ile düzeltilebilir, ancak buna ihtiyaç duyarsam yanlış bir şey yapıyorum gibi geliyor.
Örnek program:
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
}
}
(. Çıktı yorumların olan)
bu geçici çözüm aslında doğru mu, yoksa ağacında düğümü yerine gereken bazı farklı yol var?
Dil sürümü de değişir. Bir C# 5 sözdizim ağacının olup olmadığını açıkça belirtmelisiniz. Ayrıca .WithRootAndOptions() işlevini kullandım ve bununla ilgili hiçbir sorun yaşamadım. – Tamas
Benim bağırsak bunun bir hata olduğunu söylüyor ... –
@JasonMalinowski: Bunu söyleyen kişi olduğunuza sevindim - Kesinlikle istemedim :) (Ama evet, bana da öyle geliyor. –