2012-08-25 13 views
10

Cách tốt nhất để tìm kiếm đệ quy một phần tử trong scala 2.10 ASTs là gì?Tìm kiếm bên trong scala 2.10 ASTs

Cây có thể là kết quả của power.trees(code) hoặc mirror.mkToolBox().parseExpr(code) Chỉnh sửa. Trong 2,10.0-RC1 parseExpr đã được đổi tên thành parse. Trường hợp sử dụng cụ thể mà tôi có là trích xuất mã của một phương thức từ một mã lớp/đối tượng đã cho theo tên phương thức, nhưng tôi cho rằng câu hỏi sẽ phù hợp hơn cho người khác nếu được xây dựng theo cách tổng quát hơn .

Trả lời

5

Có thể bạn nên xem https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606, đặc biệt là ở lớp Traverser, Transformer và phương pháp thay thế (Tree.substituteSymbols, Tree.substituteTypes hoặc Tree.substituteThis). Nếu bạn muốn trích xuất một phương thức từ một cây, bạn có thể sử dụng Traverser và ghi đè phương thức traverse. Trong phương thức di chuyển, bạn kiểm tra xem nút có khớp với phương thức bạn muốn hay không. Nếu vậy, bạn đã hoàn tất. Nếu không, bạn gọi số super.traverse.

+1

Mã được liên kết khá lỗi thời so với thân cây. Dưới đây là các liên kết chính xác: 1) các lớp AST của cây: https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala, 2) máy biến áp và trình duyệt: https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

Rất tiếc, cảm ơn ... –

+1

Đây là ví dụ về máy biến áp: https://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala (mã chắc chắn sẽ sử dụng một dọn dẹp, nhưng nó quá tốt đẹp của một ví dụ để bỏ qua nó). Lưu ý các phần 'super.transform' và' copyAttrs'. –