From 542e35e39789d45756c4483f07c831ebbb352ebe Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 7 Feb 2021 12:49:02 +0800 Subject: [PATCH] More information for mbe --- docs/dev/architecture.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/dev/architecture.md b/docs/dev/architecture.md index 1c892e13ab..c5e4acea31 100644 --- a/docs/dev/architecture.md +++ b/docs/dev/architecture.md @@ -258,8 +258,13 @@ They are independent from the rest of the code. `mbe` crate contains tools for transforming between syntax trees and token tree. And it also handles the actual parsing and expansion of declarative macro (a-la "Macros By Example" or mbe). -For proc macros, we pass the token trees by loading the corresponding dynamic library (which built by `cargo`). -That's why the client (`proc_macro_api`) and server (`proc_macro_srv`) model are used to run proc-macro in separate process in background. +For proc macros, the client-server model are used to run proc-macro. +We pass an argument `--proc-macro` to `rust-analyzer` binary to start a separate process (`proc_macro_srv`). +And the client (`proc_macro_api`) provides an interface to talk to that server separately. + +And then token trees are passed from client, and the server will load the corresponding dynamic library (which built by `cargo`). +And due to the fact the api for getting result from proc macro are always unstable in `rustc`, +we maintain our own copy (and paste) of that part of code to allow us to build the whole thing in stable rust. **Architecture Invariant:** Bad proc macros may panic or segfault accidentally. So we run it in another process and recover it from fatal error.