Avatar
Swift のマクロは思想的にはテキスト書き換えに近いと思います。SwiftSyntaxでやりとりしているのはテキストそのままよりはマクロ実装者が便利だろうと考えているからだと思います。 テキストを介するおおきな理由の一つとして、コンパイラの swift-syntax と マクロプラグインの swift-syntax のバージョン差異の吸収というのがあります。たとえば Swift 5.10 で新しい文法が導入されたとして、5.10コンパイラから swift-syntax-509.x 向けに作られたプラグインを使う場合、 5.9 の swift-syntax は それを表現する手段を持ちません。が、テキストを介せばその 新しい文法も unexpectedBetweenXXXandYYY としてパースされるなど、何らかの形で_そのまま_マクロ実装に渡ります。マクロ実装は文法エラーのある Syntax Tree を受け取りますが、前後になにか足したりするだけでその内容を扱わないのであれば、expected* がまたそのままテキスト化されてコンパイラに返り、コンパイラは 5.10 の swift-syntax でそれをパースすることによって、新しい文法が適切に解釈されるという形です。 (edited)