Nếu tôi có một vĩ mô mà tranforms
mã như:Tại sao vũ trụ phản xạ thời gian chạy và vũ trụ macro tạo ra hai cây khác nhau cho scala.None?
(src: a.b.c.TestEntity) =>
{
z.y.TestTable(None)
}
Để phù hợp với Không một phần của AST mà tôi có thể sử dụng một vắt như:
object NoneExtractor {
def unapply(t: Tree): Boolean = t match {
case Select(Ident(scala), none) if scala.encoded == "scala" && none.encoded == "None" => true
case _ => false
}
}
Khi showRaw
của Không phần của AST trông giống như:
Select(Ident(scala), None)
Tuy nhiên, nếu tôi muốn viết kiểm tra đơn vị của NoneExtractor
Tôi không muốn biên dịch và xây dựng lại các macro và lưu trữ thử nghiệm trong dự án macro đang biên dịch. Tôi muốn kiểm tra đơn vị vắt trong dự án của vĩ mô mà cho thấy sự phản ánh thời gian chạy là cách để đi với:
val t = reify {
(src: a.b.c.TestEntity) =>
{
z.y.TestTable(None)
}
}.tree
Tuy nhiên, cây là hoàn toàn khác nhau và trong các showRaw
đó cây None trông giống như:
Ident(scala.None)
Đây là tin xấu để viết các kiểm tra tiêu cực và kiểm tra xử lý lỗi của macro của tôi. Bạn không thể viết kiểm tra tiêu cực cho một macro bằng cách sử dụng macro từ một dự án khác vì mã sẽ không biên dịch (và bạn không thể gỡ lỗi thử nghiệm âm tính của mình với các lỗi biên dịch).
Tại sao các biểu diễn của một cái gì đó là cơ bản như Không có gì khác biệt giữa phản ánh thời gian biên dịch và phản ánh thời gian chạy? Có cách nào để tạo ra các đoạn cây có thể kiểm thử trong dự án macro có cùng AST như được trao cho macro trong khi phản ánh thời gian biên dịch không?
Chọn ra một giá trị cụ thể dựa trên đại diện cây của nó luôn luôn là một chút khó khăn, ngay cả khi bạn đang hoàn toàn trong đất vĩ mô. Bạn có thể làm điều gì đó như 't.tpe =: = typeOf [None.type]' thay thế không? –
Tôi thực sự cần phải làm cấu trúc phù hợp với AST với các câu lệnh lồng nhau. Tôi mới đến chức năng vì vậy tôi đã bắt đầu với if/then/else/gọi mã phong cách bắt buộc. Đó là khoảng năm lần mã bây giờ mà tôi đang tái cấu trúc để phù hợp với chức năng/trường hợp/trận đấu/trường hợp/.... api vũ trụ vĩ mô có một số lượng lớn các bộ giải nén được xây dựng trong. Vì vậy, sự hiểu biết của tôi rằng vắt và kết hợp lồng nhau là cách kinh điển để làm điều này. Câu hỏi của tôi là làm thế nào để kiểm tra cách kinh điển hơn là một câu hỏi về cách thực hiện một cách tiếp cận hoàn toàn khác. – simbo1905