@@ -66,6 +66,9 @@ export function new_ast_rewriter_cc({
6666 ` [[nodiscard]] auto translationUnit() const -> TranslationUnit* { return rewrite.unit_; }`
6767 ) ;
6868 emit ( ) ;
69+ emit (
70+ ` [[nodiscard]] auto control() const -> Control* { return rewrite.control(); }`
71+ ) ;
6972 emit (
7073 ` [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); }`
7174 ) ;
@@ -106,11 +109,23 @@ export function new_ast_rewriter_cc({
106109 emit ( ` auto out = ©->${ m . name } ;` ) ;
107110
108111 emit ( ` for (auto node : ListView{ast->${ m . name } }) {` ) ;
109- emit ( ` auto value = ${ visitor } (node);` ) ;
112+
113+ switch ( m . type ) {
114+ case "InitDeclaratorAST" :
115+ emit (
116+ ` auto value = ${ visitor } (node, declSpecifierListCtx);`
117+ ) ;
118+ break ;
119+
120+ default :
121+ emit ( ` auto value = ${ visitor } (node);` ) ;
122+ break ;
123+ } // switch
124+
110125 if ( isBase ( m . type ) ) {
111- emit ( `*out = new (arena()) List( value);` ) ;
126+ emit ( `*out = make_list_node (arena(), value);` ) ;
112127 } else {
113- emit ( `*out = new (arena()) List( ast_cast<${ m . type } >(value));` ) ;
128+ emit ( `*out = make_list_node (arena(), ast_cast<${ m . type } >(value));` ) ;
114129 }
115130 emit ( ` out = &(*out)->next;` ) ;
116131
@@ -174,10 +189,20 @@ export function new_ast_rewriter_cc({
174189
175190 by_base . get ( "AST" ) ?. forEach ( ( { name, members } ) => {
176191 emit ( ) ;
177- emit ( `auto ${ opName } ::operator()(${ name } * ast) -> ${ name } * {` ) ;
192+ switch ( name ) {
193+ case "InitDeclaratorAST" :
194+ emit (
195+ `auto ${ opName } ::operator()(${ name } * ast, const DeclSpecs& declSpecs) -> ${ name } * {`
196+ ) ;
197+ break ;
198+ default :
199+ emit ( `auto ${ opName } ::operator()(${ name } * ast) -> ${ name } * {` ) ;
200+ break ;
201+ } // switch
202+
178203 emit ( ` if (!ast) return {};` ) ;
179204 emit ( ) ;
180- emit ( ` auto copy = new (arena()) ${ name } {} ;` ) ;
205+ emit ( ` auto copy = make_node< ${ name } > (arena());` ) ;
181206 emit ( ) ;
182207 emitRewriterBody ( members , "operator()" ) ;
183208 emit ( ) ;
@@ -194,7 +219,7 @@ export function new_ast_rewriter_cc({
194219 emit (
195220 `auto ${ opName } ::${ className } Visitor::operator()(${ name } * ast) -> ${ base } * {`
196221 ) ;
197- emit ( ` auto copy = new (arena()) ${ name } {} ;` ) ;
222+ emit ( ` auto copy = make_node< ${ name } > (arena());` ) ;
198223 emit ( ) ;
199224 ast . baseMembers . get ( base ) ?. forEach ( ( m ) => {
200225 emit ( ` copy->${ m . name } = ast->${ m . name } ;` ) ;
@@ -216,6 +241,7 @@ export function new_ast_rewriter_cc({
216241#include <cxx/translation_unit.h>
217242#include <cxx/type_checker.h>
218243#include <cxx/decl_specs.h>
244+ #include <cxx/decl.h>
219245
220246namespace cxx {
221247
0 commit comments