2011-10-24 39 views
8

Trong nhiệm vụ của tôi để tạo mã mới trong trình biên dịch trình biên dịch Scala, bây giờ tôi đã tạo các lớp làm việc. Bước hợp lý tiếp theo là đặt các lớp đó vào một gói mới, không tồn tại. Trong Java, một gói về cơ bản là một tên thư mục, nhưng trong Scala một gói có vẻ phức tạp hơn nhiều. Cho đến nay tôi đã không tìm thấy/công nhận một ví dụ mà một plugin trình biên dịch tạo ra một gói mới.Tạo gói * mới * trong Trình biên dịch Scala Plugin

Ở cấp độ hiện tại của tôi về sự hiểu biết, tôi sẽ nghĩ rằng tôi sẽ cần phải tạo ra một biểu tượng đầu tiên gói với:

parentPackage.newPackage(...) 
// ... 

và hơn sau tạo ra một cây cho gói với PackageDef. Nhưng PackageDef không lấy biểu tượng làm thông số, như mong đợi và tìm kiếm:

Scala newPackage PackageDef 

không trả lại gì hữu ích. Vì vậy, có vẻ như tôi không cần phải làm hai bước với nhau. Có thể một được thực hiện bởi trình biên dịch của tôi, nhưng tôi không biết cái nào. Cho đến nay, những gì tôi đã trông như thế này:

val newPkg = parentPackage.newPackage(NoPosition, newTermName(name)) 
newPkg.moduleClass.setInfo(new PackageClassInfoType(new Scope, 
    newPkg.moduleClass)) 
newPkg.setInfo(newPkg.moduleClass.tpe) 
parentPackage.info.decls.enter(newPkg) 
// ... 
val newPkgTree = PackageDef(Ident(newPkg.name), List(ClassDef(...))) 
+0

bạn đã gặp khó khăn ở đâu? Nó có vẻ tốt cho đến nay. Bạn có thể muốn thêm cây vào một đơn vị biên dịch hiện có, nếu không sẽ không có mã nào được tạo cho cây của bạn. –

+0

Thành thật mà nói, tôi không thể nhớ. Tôi cũng đã hỏi về danh sách gửi thư của Scala, và cũng không nhận được một câu trả lời cụ thể nào cả, vì vậy tôi đã từ bỏ việc viết plugin. Tôi đã viết nhiều hơn và nhiều hơn nữa mã, và nó tiếp tục nhận được uglier, nhưng không có gì làm việc. –

+0

Liên kết Danh sách Gửi thư: http://groups.google.com/group/scala-language/browse_thread/thread/963923c78201f5e6 Những gì tôi cần là ví dụ đơn giản nhất trong đó có một biến đổi() hoặc transformStats() và từ đó tạo một lớp hoàn toàn không liên quan trong một gói hoàn toàn không liên quan. Phải có cách thêm cây ở cấp gói gốc thay vì chỉ bên trong gói hiện tại. –

Trả lời

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