Trong Trình biên dịch Scala Plugin, tôi đang cố gắng tạo một lớp mới thực hiện một đặc điểm đã có từ trước. Cho đến nay mã của tôi trông giống như sau:Làm thế nào để thêm một Class mới trong một Plugin Scala Compiler?
def trait2Impl(original: ClassDef, newName: String): ClassDef = {
val impl = original.impl
// Seems OK to have same self, but does not make sense to me ...
val self = impl.self
// TODO: implement methods ...
val body = impl.body
// We implement original
val parents = original :: impl.parents
val newImpl = treeCopy.Template(impl, parents, self, body)
val name = newTypeName(newName)
// We are a syntheic class, not a user-defined trait
val mods = (original.mods | SYNTHETIC) &~ TRAIT
val tp = original.tparams
val result = treeCopy.ClassDef(original, mods, name, tp, newImpl)
// Same Package?
val owner = original.symbol.owner
// New symbol. What's a Position good for?
val symbol = new TypeSymbol(owner, NoPosition, name)
result.setSymbol(symbol)
symbol.setFlag(SYNTHETIC)
symbol.setFlag(ABSTRACT)
symbol.resetFlag(INTERFACE)
symbol.resetFlag(TRAIT)
owner.info.decls.enter(symbol)
result
}
Nhưng dường như mã này không được thêm vào gói. Tôi nghi ngờ đó là bởi vì thực sự các gói đã "đi ngang" trước khi các đặc điểm gây ra các thế hệ, và/hoặc vì "ghi đè def chuyển đổi (cây: Cây): Cây" phương pháp của TypingTransformer chỉ có thể trả lại một Tree, cho mọi cây mà nó nhận được, vì vậy nó không thể thực sự tạo ra một cây mới, mà chỉ thay đổi một cây.
Vì vậy, làm cách nào để bạn thêm một Lớp mới vào gói hiện có? Có lẽ nó sẽ làm việc nếu tôi chuyển đổi gói khi "transform (Tree)" nhận được nó, nhưng tôi điểm đó tôi không biết nội dung của gói, vì vậy tôi không thể tạo ra Class mới sớm (hoặc có thể tôi?) . Hoặc có thể nó liên quan đến tham số "Position" của Symbol?
Cho đến nay tôi đã tìm thấy một số ví dụ về nơi Cây được sửa đổi, nhưng không có nơi nào một Lớp hoàn toàn mới được tạo trong một Plugin Trình biên dịch.
bạn đã giải quyết vấn đề? Tôi đang có một cái tương tự, vì vậy tôi đã tự hỏi ... Tôi nghĩ rằng bạn cần phải phù hợp với cha mẹ của đặc điểm của bạn trong phương pháp chuyển đổi, thật không may. Đó là, tìm ra cho PackageDef và mẫu, và tìm thấy tất cả các sự xuất hiện của đặc điểm của bạn trong cơ thể của họ. Sau đó, bạn có thể trả về một PackageDef đã được chuyển đổi và Mẫu –
Có, tôi nhận được sự giúp đỡ từ một danh sách gửi thư của Scala. Nhưng tôi chưa có, vì tôi chỉ có thể tạo lớp trong * cùng một gói *. Tôi sẽ cố gắng đăng câu trả lời cho câu hỏi của riêng mình khi tôi sắp xếp mọi thứ. –
Vui lòng trả lời câu hỏi của bạn NGAY BÂY GIỜ! Bởi vì tôi có cùng một [câu hỏi] (https://github.com/iron9light/autoguice) – iron9light