2013-08-18 12 views
11

Mam działający kod, który załaduje plik .cs do klasy Syntaktypy Roslyn, utworzy nowy PropertyDeclarationSyntax, wstawi go do klasa i ponownie zapisz plik .cs. Robię to jako doświadczenie edukacyjne, a także niektóre potencjalne przyszłe pomysły. Zauważyłem, że naprawdę nie ma pełnej dokumentacji API Roslyn gdziekolwiek i nie jestem pewien, czy robię to sprawnie. Moją główną troską jest to, że nazywam "root.ToFullString()" - podczas gdy działa, czy jest to właściwy sposób?C# Roslyn API, Czytanie pliku .cs, aktualizowanie klasy, pisanie z powrotem do pliku .cs

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

Dlaczego dokładnie niepokoi cię 'ToFullString()'? – svick

+0

Nie mogę znaleźć żadnej dokumentacji dla klasy i nie jestem pewien, czy jest to najlepszy sposób wyodrębnienia reprezentacji łańcuchowej drzewa składni i ponownego wyprowadzenia pliku CS. Obawiam się, że mogą istnieć artefakty i inne tego typu rzeczy nieodpowiednie do generowania kodu. – ShaunO

Odpowiedz

3

Odpowiedział na forum Roslyn CTP in this post:

To podejście jest ogólnie w porządku, ale jeśli martwisz się o przydzielenie ciąg dla tekstu całego pliku, powinieneś użyć itext. Napisz (TextWriter) zamiast ToFullString().

Należy pamiętać, że możliwe jest generowanie drzew, które nie będą przechodzić przez parser. Na przykład, jeśli wygenerowałeś coś, co narusza reguły pierwszeństwa, API konstrukcyjne SyntaxTree tego nie wykryje.

+0

Dzięki za odpowiedź; Doszedłem do wniosku, że musi istnieć więcej forów poświęconych API! – ShaunO

Powiązane problemy