먼저 Procedural macro는 다음 3가지 매크로를 말함
- Procedural macros, which come in three kinds:
- Custom #[derive] macros
- Attribute-like macros
- Function-like macros
매크로용 crate의 [lib]에 proc-macro = true를 주면 쓸수있는데
일단 각 매크로마다 함수를 하나씩 만듬 시그니쳐는 간단함
derive나 function-like면 (TokenStream) -> TokenStream고 attribute면 (TokenStream, TokenStream) -> TokenStream임
한마디로 토큰을 받아서 토큰을 뱉음 파싱이 되지않은 상태라 각각의 TokenStream이 SQL인지 JS인지 Rust인지 뭔지는 모름
proc-macro 라이브러리에선 이 코드생성 함수들을 모아서 동적 라이브러리로 만들고
컴파일러에서 적절하게 이 함수들을 호출한뒤에 마지막 TokenStream을 파싱해서 Rust AST을 얻은다음 컴파일을 마저 수행함
근데 매크로에게 전달할 attribute가 multiline string 으로 전달할 순 없는건가
multiline도 걍 리터럴 토큰 하나로 취급될걸?
TokenStream에서 Literal.to_string()을 하면 문자열 내용도 알 수 있는 건가?
ㅇㅇ 토큰내용은 다 볼수있지