먼저 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을 얻은다음 컴파일을 마저 수행함