Skip to content

Commit 2f7b27d

Browse files
committed
Pass decl specs when rewriting init declarators
Signed-off-by: GitHub <[email protected]>
1 parent a27621b commit 2f7b27d

File tree

4 files changed

+385
-325
lines changed

4 files changed

+385
-325
lines changed

packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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 = &copy->${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
220246
namespace cxx {
221247

packages/cxx-gen-ast/src/new_ast_rewriter_h.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,16 @@ export function new_ast_rewriter_h({
5252
emit();
5353
emit(` // run on the misc nodes`);
5454
by_base.get("AST")?.forEach(({ name }) => {
55-
emit(` [[nodiscard]] auto operator()(${name}* ast) -> ${name}*;`);
55+
switch (name) {
56+
case "InitDeclaratorAST":
57+
emit(
58+
` [[nodiscard]] auto operator()(${name}* ast, const DeclSpecs& declSpecs) -> ${name}*;`
59+
);
60+
break;
61+
default:
62+
emit(` [[nodiscard]] auto operator()(${name}* ast) -> ${name}*;`);
63+
break;
64+
} // switch
5665
});
5766

5867
emit();

0 commit comments

Comments
 (0)