normalising BlockTrailingExpr where it returns into Block with a Ret expr
This commit is contained in:
parent
e002a6ddc9
commit
f6b956deee
|
@ -2591,6 +2591,35 @@ pub mod ast_gen {
|
|||
}
|
||||
}
|
||||
|
||||
/// folds more AST-patterns into structures that are easier to build the IR with
|
||||
pub fn fold_more_patterns(&mut self) {
|
||||
use visitor::AstExt;
|
||||
self.ast.visitor_mut().visit_post(|ast, _, i, tag, data| {
|
||||
match tag {
|
||||
// normalise functions with block-with-trailing-expr into block
|
||||
Tag::FunctionDecl => {
|
||||
let (_, block) = data.as_two_indices();
|
||||
|
||||
let (block_tag, block_data) =
|
||||
ast.get_node_tag_and_data(block);
|
||||
if block_tag == Tag::BlockTrailingExpr {
|
||||
let (_, end) = block_data.as_extra_range();
|
||||
let end = end - 1;
|
||||
let expr = Index::new(ast.extra[end]);
|
||||
let loc = ast.get_loc(expr);
|
||||
let ret = ast.push_ret(Some(expr), loc);
|
||||
// modify last element in place to be a return instruction
|
||||
ast.extra[end] = *ret.as_u32();
|
||||
ast.tags[block.index()] = Tag::Block;
|
||||
eprintln!("folding ({block}): {block_tag:?} into Tag::Block");
|
||||
eprintln!("expr: {expr:?}");
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub fn intern_types(&mut self) {
|
||||
self.ast.visitor_mut().visit_post(|ast, _, i, tag, data| {
|
||||
match tag {
|
||||
|
@ -4397,6 +4426,7 @@ pub mod ast_gen {
|
|||
self.create_comptime_folding_graph(intern::AMD64_POINTER_BITS);
|
||||
eprintln!("interning types:");
|
||||
self.intern_types();
|
||||
self.fold_more_patterns();
|
||||
}
|
||||
|
||||
fn push_scope(&mut self, ast: Index, name: intern::Index) {
|
||||
|
|
Loading…
Reference in a new issue