У нашего API ещё далеко не всё гладко. Вот например код для изменения узла в дереве:
[TestMethod]
public void UpdateNode()
{
string text = "class C { void M() { } }";
var tree = SyntaxTree.ParseCompilationUnit(text);
var root = (CompilationUnitSyntax)tree.Root;
MethodDeclarationSyntax method = root
.DescendentNodes()
.OfType<MethodDeclarationSyntax>()
.First();
var newMethod = method.Update(
method.Attributes,
method.Modifiers,
method.ReturnType,
method.ExplicitInterfaceSpecifierOpt,
Syntax.Identifier("NewMethodName"),
method.TypeParameterListOpt,
method.ParameterList,
method.ConstraintClauses,
method.BodyOpt,
method.SemicolonTokenOpt);
root = root.ReplaceNode(method, newMethod);
tree = SyntaxTree.Create(tree.FileName, root, tree.Options);
Assert.AreEqual("class C { void NewMethodName() { } }", tree.Text.GetText());
}
Очень уж громоздко. Вот думаем, как изменить Update() чтобы не передавать все параметры. Если сделать optional, тогда как присвоить свойству null? Т.е. непонятно, если передавать null, это очистка или "оставь как было"?
Вот такие интересные проблемы возникают с immutable деревьями.