Skip to content

Commit b6f6e4b

Browse files
committed
feat: added HIR -> MIR hint registration at lowering
1 parent a654914 commit b6f6e4b

2 files changed

Lines changed: 15 additions & 4 deletions

File tree

compiler/astoir_mir_lowering/src/lib.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::{collections::HashMap, hash::Hash};
2+
13
use astoir_hir::{ctx::HIRContext, nodes::{HIRNode, HIRNodeKind}};
24
use astoir_mir::ctx::MIRContext;
35
use compiler_typing::{SizedType, raw::RawType, structs::LoweredStructTypeContainer, tree::Type};
@@ -55,7 +57,7 @@ pub fn lower_hir(ctx: HIRContext) -> DiagnosticResult<MIRContext> {
5557
pub fn lower_hir_generic(ctx: &MIRLoweringContext, t: &Type, generic: &RawType) -> DiagnosticResult<Type> {
5658
match generic {
5759
RawType::Struct(a, b) => {
58-
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: false, lowered_enum_child: None, lowered_enum_parent: None };
60+
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: false, lowered_enum_child: None, lowered_enum_parent: None, hir_mir_indexes: HashMap::new() };
5961

6062
for field in &b.fields.vals {
6163
lowered_container.fields.vals.push(lower_hir_type(ctx, field.clone().resolve(t))?);
@@ -65,7 +67,7 @@ pub fn lower_hir_generic(ctx: &MIRLoweringContext, t: &Type, generic: &RawType)
6567
},
6668

6769
RawType::EnumEntry(container) => {
68-
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: true, is_lowered_enum_parent: false, lowered_enum_child: Some(container.clone()), lowered_enum_parent: None };
70+
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: true, is_lowered_enum_parent: false, lowered_enum_child: Some(container.clone()), lowered_enum_parent: None, hir_mir_indexes: HashMap::new() };
6971

7072
let parent = match &ctx.hir_ctx.type_storage.types.vals[container.parent] {
7173
RawType::Enum(container) => container.clone(),
@@ -74,15 +76,20 @@ pub fn lower_hir_generic(ctx: &MIRLoweringContext, t: &Type, generic: &RawType)
7476

7577
lowered_container.fields.vals.push(Type::GenericLowered(parent.get_hint_type())); // Enum entry hint
7678

79+
let mut ind = 0;
7780
for field in &container.fields.vals {
81+
lowered_container.append_hir_index_conv(ind, lowered_container.fields.vals.len()); // Allow for LRU to work correctly
82+
7883
lowered_container.fields.vals.push(lower_hir_type(ctx, field.clone().resolve(t))?);
84+
85+
ind += 1;
7986
}
8087

8188
return Ok(Type::GenericLowered(RawType::LoweredStruct(false, lowered_container)));
8289
},
8390

8491
RawType::Enum(container) => {
85-
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: true, lowered_enum_parent: Some(container.clone()), lowered_enum_child: None };
92+
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: true, lowered_enum_parent: Some(container.clone()), lowered_enum_child: None, hir_mir_indexes: HashMap::new() };
8693

8794
let mut entry_size = 0;
8895

compiler/compiler_typing/src/structs.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ impl LoweredStructTypeContainer {
3434

3535
return ind;
3636
}
37-
37+
38+
pub fn append_hir_index_conv(&mut self, hir: usize, mir: usize) {
39+
self.hir_mir_indexes.insert(hir, mir);
40+
}
41+
3842
}
3943

4044
impl SizedType for RawStructTypeContainer {

0 commit comments

Comments
 (0)