rue_compiler/compile/
document.rs1use rue_ast::{AstItem, AstSymbolItem};
2use rue_hir::ModuleDeclarations;
3
4use crate::{
5 Compiler, compile_module_symbols, compile_module_types, compile_symbol_item, compile_type_item,
6 declare_import_item, declare_module, declare_module_symbols, declare_module_types,
7 declare_symbol_item, declare_type_item,
8};
9
10pub fn declare_module_items(
11 ctx: &mut Compiler,
12 items: impl Iterator<Item = AstItem>,
13 declarations: &mut ModuleDeclarations,
14) {
15 for item in items {
16 match item {
17 AstItem::SymbolItem(AstSymbolItem::ModuleItem(item)) => {
18 declarations.modules.push(declare_module(ctx, &item));
19 }
20 AstItem::ImportItem(import) => {
21 declare_import_item(ctx, &import);
22 }
23 _ => {}
24 }
25 }
26}
27
28pub fn declare_type_items(
29 ctx: &mut Compiler,
30 items: impl Iterator<Item = AstItem>,
31 declarations: &mut ModuleDeclarations,
32) {
33 let mut module = 0;
34
35 for item in items {
36 match item {
37 AstItem::TypeItem(item) => declarations.types.push(declare_type_item(ctx, &item)),
38 AstItem::SymbolItem(item) => {
39 if let AstSymbolItem::ModuleItem(item) = item {
40 declare_module_types(ctx, &item, declarations.modules[module]);
41 module += 1;
42 }
43 }
44 AstItem::ImportItem(_) => {}
45 }
46 }
47}
48
49pub fn declare_symbol_items(
50 ctx: &mut Compiler,
51 items: impl Iterator<Item = AstItem>,
52 declarations: &mut ModuleDeclarations,
53) {
54 let mut module = 0;
55
56 for item in items {
57 match item {
58 AstItem::TypeItem(_) => {}
59 AstItem::SymbolItem(item) => {
60 if let AstSymbolItem::ModuleItem(item) = item {
61 declare_module_symbols(ctx, &item, declarations.modules[module]);
62 module += 1;
63 } else {
64 declarations.symbols.push(declare_symbol_item(ctx, &item));
65 }
66 }
67 AstItem::ImportItem(_) => {}
68 }
69 }
70}
71
72pub fn compile_type_items(
73 ctx: &mut Compiler,
74 items: impl Iterator<Item = AstItem>,
75 declarations: &ModuleDeclarations,
76) {
77 let mut index = 0;
78 let mut module = 0;
79
80 for item in items {
81 match item {
82 AstItem::TypeItem(item) => {
83 let (ty, scope) = declarations.types[index];
84 compile_type_item(ctx, &item, ty, scope);
85 index += 1;
86 }
87 AstItem::SymbolItem(item) => {
88 if let AstSymbolItem::ModuleItem(item) = item {
89 compile_module_types(ctx, &item, declarations.modules[module]);
90 module += 1;
91 }
92 }
93 AstItem::ImportItem(_) => {}
94 }
95 }
96}
97
98pub fn compile_symbol_items(
99 ctx: &mut Compiler,
100 items: impl Iterator<Item = AstItem>,
101 declarations: &ModuleDeclarations,
102) {
103 let mut index = 0;
104 let mut module = 0;
105
106 for item in items {
107 match item {
108 AstItem::TypeItem(_) => {}
109 AstItem::SymbolItem(item) => {
110 if let AstSymbolItem::ModuleItem(item) = item {
111 compile_module_symbols(ctx, &item, declarations.modules[module]);
112 module += 1;
113 } else {
114 let symbol = declarations.symbols[index];
115 compile_symbol_item(ctx, &item, symbol);
116 index += 1;
117 }
118 }
119 AstItem::ImportItem(_) => {}
120 }
121 }
122}