Skip to content

Commit

Permalink
refactor(traverse)!: enter node before entering scope
Browse files Browse the repository at this point in the history
  • Loading branch information
overlookmotel committed Aug 6, 2024
1 parent f290191 commit 796d58d
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 54 deletions.
52 changes: 24 additions & 28 deletions crates/oxc_traverse/scripts/lib/walk.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ function generateWalkForStruct(type, types) {
`\`ast\` attr says to enter scope before field '${enterFieldName}' `
+ `in '${type.name}', but that field is not visited`
);
if (scopeEnterField === visitedFields[0]) scopeEnterField = undefined;
} else {
scopeEnterField = visitedFields[0];
}

// TODO: Maybe this isn't quite right. `scope_id` fields are `Cell<Option<ScopeId>>`,
Expand All @@ -93,18 +94,25 @@ function generateWalkForStruct(type, types) {
}

const fieldsCodes = visitedFields.map((field, index) => {
const fieldWalkName = `walk_${camelToSnake(field.innerTypeName)}`;
const fieldWalkName = `walk_${camelToSnake(field.innerTypeName)}`,
fieldCamelName = snakeToCamel(field.name);
const scopeCode = field === scopeEnterField ? enterScopeCode : '';

const retagCode = index === 0
? ''
: `ctx.retag_stack(AncestorType::${type.name}${snakeToCamel(field.name)});`;
const fieldCode = makeFieldCode(field);
let scopeCode = '';
if (field === scopeEnterField) {
scopeCode = enterScopeCode;
enterScopeCode = '';
let tagCode = '', retagCode = '';
if (index === 0) {
tagCode = `
ctx.push_stack(
Ancestor::${type.name}${fieldCamelName}(
ancestor::${type.name}Without${fieldCamelName}(node)
)
);
`;
} else {
retagCode = `ctx.retag_stack(AncestorType::${type.name}${fieldCamelName});`;
}

const fieldCode = makeFieldCode(field);

if (field.wrappers[0] === 'Option') {
let walkCode;
if (field.wrappers.length === 2 && field.wrappers[1] === 'Vec') {
Expand All @@ -127,6 +135,7 @@ function generateWalkForStruct(type, types) {

return `
${scopeCode}
${tagCode}
if let Some(field) = &mut *(${fieldCode}) {
${retagCode}
${walkCode}
Expand Down Expand Up @@ -159,15 +168,15 @@ function generateWalkForStruct(type, types) {

return `
${scopeCode}
${retagCode}
${tagCode || retagCode}
${walkVecCode}
`;
}

if (field.wrappers.length === 1 && field.wrappers[0] === 'Box') {
return `
${scopeCode}
${retagCode}
${tagCode || retagCode}
${fieldWalkName}(traverser, (&mut **(${fieldCode})) as *mut _, ctx);
`;
}
Expand All @@ -176,23 +185,12 @@ function generateWalkForStruct(type, types) {

return `
${scopeCode}
${retagCode}
${tagCode || retagCode}
${fieldWalkName}(traverser, ${fieldCode}, ctx);
`;
});

if (visitedFields.length > 0) {
const field = visitedFields[0],
fieldCamelName = snakeToCamel(field.name);
fieldsCodes.unshift(`
ctx.push_stack(
Ancestor::${type.name}${fieldCamelName}(
ancestor::${type.name}Without${fieldCamelName}(node)
)
);
`);
fieldsCodes.push('ctx.pop_stack();');
}
if (visitedFields.length > 0) fieldsCodes.push('ctx.pop_stack();');

const typeSnakeName = camelToSnake(type.name);
return `
Expand All @@ -201,12 +199,10 @@ function generateWalkForStruct(type, types) {
node: *mut ${type.rawName},
ctx: &mut TraverseCtx<'a>
) {
${enterScopeCode}
traverser.enter_${typeSnakeName}(&mut *node, ctx);
${fieldsCodes.join('\n')}
${enterScopeCode ? '' : exitScopeCode}
${exitScopeCode}
traverser.exit_${typeSnakeName}(&mut *node, ctx);
${enterScopeCode ? exitScopeCode : ''}
}
`.replace(/\n\s*\n+/g, '\n');
}
Expand Down
Loading

0 comments on commit 796d58d

Please sign in to comment.