2014-04-05 13 views
7

Tôi bắt đầu từ đâu?Sử dụng mã nguồn mở "roslyn" để đọc tệp mã và tạo các tệp mã mới

trong giải pháp hiện tại của tôi, tôi có các mô hình như thế này:

public class MyAwesomeModel 
{ 
.... 
} 

Tôi muốn để có những dự án mã roslyn để phân tích các file nguồn và đi qua cây cú pháp để tạo ra file mã mới. Lấy các tệp nguồn đó và thêm chúng vào tệp dự án C# để nhập lại vào giải pháp của tôi trong phòng thu trực quan.

Tôi bắt đầu từ đâu. Nhân bản roslyn và chỉ viết một ứng dụng giao diện điều khiển tham chiếu tất cả các roslyn và bắt đầu đào vào roslyn để tìm hiểu cách thức, hoặc là có bất kỳ blog, documentatino cho thấy một cái gì đó như thế này.

+0

Ý anh là gì tạo file mã mới? Tạo dựa trên cái gì? –

+0

các tệp mã gốc có chứa các mô hình của tôi –

+0

"Roslyn" là một trình biên dịch động. Vì vậy, câu hỏi của bạn tạo ra "mã mới" không có ý nghĩa. Bây giờ nếu bạn đang hỏi về việc tạo ra một "nhị phân mới", đó sẽ là một câu hỏi khác. –

Trả lời

3

Có phần dễ thực hiện.

Tạo một ứng dụng giao diện điều khiển và tài liệu tham khảo:

<package id="Microsoft.CodeAnalysis.CSharp" version="0.6.4033103-beta" targetFramework="net45" /> 

và đây là chương trình truy cập tất cả các thuộc tính trong một văn bản nguồn:

class ModelCollector : CSharpSyntaxWalker 
    { 
     public readonly Dictionary<string, List<string>> models = new Dictionary<string, List<string>>(); 
     public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) 
     { 
      var classnode = node.Parent as ClassDeclarationSyntax; 
      if (!models.ContainsKey(classnode.Identifier.ValueText)) 
       models.Add(classnode.Identifier.ValueText, new List<string>()); 

      models[classnode.Identifier.ValueText].Add(node.Identifier.ValueText); 
     } 

    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 

      var code = 
@"    using System; 
       using System.Collections.Generic; 
       using System.Linq; 
       using System.Text; 

       namespace HelloWorld 
       { 
        public class MyAwesomeModel 
        { 
         public string MyProperty {get;set;} 
         public int MyProperty1 {get;set;} 
        } 

       }"; 

      var tree = CSharpSyntaxTree.ParseText(code); 

      var root = (CompilationUnitSyntax)tree.GetRoot(); 
      var modelCollector = new ModelCollector(); 
      modelCollector.Visit(root); 
      Console.WriteLine(JsonConvert.SerializeObject(modelCollector.models)); 


     } 
    } 
+1

Để thực hiện điều này, bạn cần phải cài đặt các gói sau bằng NuGet: "Microsoft.CodeAnalysis.Workspaces" và "Json.NET". – Contango

+0

Mã này vẫn đang hoạt động với RC1 được phát hành vào tháng 2 năm 2015 – Maslow

Các vấn đề liên quan