1struct AstLowering<'low, 'hir: 'low> {
2 sess: &'low hir::Session<'hir>,
3}
4
5mod item;
6mod expr;
7mod stmt;
8mod ty;
9
10use ast::{Block, Symbol};
11use hir::Ident;
12use span::Spanned;
13
14pub fn lower(sess: &hir::Session<'_>, prog: &ast::Module) {
15 let mut lowering = AstLowering::new(sess);
16 let p = lowering.lower_module(prog);
17 sess.set_root(p);
18}
19
20fn ident(spanned: &Spanned<Symbol>) -> Ident {
21 Ident {
22 sym: spanned.val,
23 span: spanned.span,
24 }
25}
26
27impl<'low, 'hir: 'low> AstLowering<'low, 'hir> {
28 fn new(sess: &'low hir::Session<'hir>) -> Self { Self { sess } }
29
30 fn lower_module(&mut self, m: &ast::Module) -> &'hir hir::Module<'hir> {
31 let m = self.lower_module_owned(m);
32 self.sess.alloc(m)
33 }
34
35 fn lower_module_owned(&mut self, m: &ast::Module) -> hir::Module<'hir> {
36 use ast::ModuleBody;
37
38 let items = match &m.body {
39 ModuleBody::Inline(Block { val: items, .. }) |
40 ModuleBody::Extern { items, .. } |
41 ModuleBody::Slf(items, _) => self.lower_items(items),
42 };
43 let id = match &m.body {
44 ModuleBody::Inline(_) => None,
45 ModuleBody::Extern { id, .. }
46 | ModuleBody::Slf(_, id) => Some(id),
47 };
48 let name = self.lower_pathdef(ident(&m.name));
49 hir::Module::new(name, items, m.span, id.copied())
50 }
51}