С# Roslyn API, чтение файла .cs, обновление класса, запись в файл .cs

У меня есть этот рабочий код, который будет загружать файл .cs в класс Roslyn SyntaxTree, создать новый PropertyDeclarationSyntax, вставить его в класс и перезаписать файл .cs. Я делаю это как опыт обучения, а также некоторые потенциальные будущие идеи. Я обнаружил, что на самом деле нет никакой полной документации API Roslyn, и я не уверен, что я делаю это эффективно. Моя главная проблема заключается в том, где я называю "root.ToFullString()" - пока он работает, это правильный способ сделать это?

using System.IO;
using System.Linq;
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;

class RoslynWrite
{
    public RoslynWrite()
    {
        const string csFile = "MyClass.cs";

        // Parse .cs file using Roslyn SyntaxTree
        var syntaxTree = SyntaxTree.ParseFile(csFile);
        var root = syntaxTree.GetRoot();
        // Get the first class from the syntax tree
        var myClass = root.DescendantNodes().OfType<ClassDeclarationSyntax>().First();

        // Create a new property : 'public bool MyProperty { get; set; }'
        var myProperty = Syntax.PropertyDeclaration(Syntax.ParseTypeName("bool"), "MyProperty")
                            .WithModifiers(Syntax.Token(SyntaxKind.PublicKeyword))
                            .WithAccessorList(
                            Syntax.AccessorList(Syntax.List(
                                Syntax.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
                                    .WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)),
                                Syntax.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
                                    .WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)))));

        // Add the new property to the class
        var updatedClass = myClass.AddMembers(myProperty);
        // Update the SyntaxTree and normalize whitespace 
        var updatedRoot = root.ReplaceNode(myClass, updatedClass).NormalizeWhitespace();

        // Is this the way to write the syntax tree? ToFullString?
        File.WriteAllText(csFile, updatedRoot.ToFullString());
    }
}

Ответ 1

Отвечено на форум CSR Roslyn в этом сообщении:

Этот подход в целом хорош, хотя, если вы беспокоитесь о назначении строки для текста всего файла, скорее всего, вы должны использовать IText.Write(TextWriter) вместо ToFullString().

Имейте в виду, что он может генерировать деревья, которые не будут проходить через парсер. Например, если вы создали что-то, что нарушает правила приоритета, API-интерфейсы построения SyntaxTree не поймут это.