ast_lowering/
lib.rs

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}