feat(resolver): implement cross-file template resolution

Enable characters to inherit from templates defined in different files
across the project structure.

- Add file_index field to NameEntry to track declaration source files
- Update NameTable::from_files() to set file indices when merging tables
- Change conversion pipeline to pass &[ast::File] instead of flat arrays
- Update merge functions to use two-level indexing:
  all_files[entry.file_index].declarations[entry.decl_index]
- Update all affected tests to use new signatures
This commit is contained in:
2026-02-08 15:45:30 +00:00
parent 9c20dd4092
commit 4c89c80748
9 changed files with 136 additions and 62 deletions

View File

@@ -89,9 +89,9 @@ fn valid_unique_fields() -> impl Strategy<Value = Vec<Field>> {
fn valid_character() -> impl Strategy<Value = Character> {
(valid_ident(), valid_unique_fields()).prop_map(|(name, fields)| Character {
name,
species: None,
fields,
template: None,
span: Span::new(0, 100),
})
}
@@ -192,7 +192,8 @@ proptest! {
val2 in valid_value()
) {
let character = Character {
name,
name: name.clone(),
species: None,
fields: vec![
Field {
name: field_name.clone(),
@@ -239,6 +240,7 @@ proptest! {
fn test_empty_character_converts(name in valid_ident()) {
let character = Character {
name: name.clone(),
species: None,
fields: vec![],
template: None,
@@ -268,7 +270,7 @@ proptest! {
#[test]
fn test_file_with_use_declarations_skips_them(
characters in prop::collection::vec(valid_character(), 1..5),
char_count in 1usize..5,
use_count in 0usize..5
) {
let mut declarations = vec![];
@@ -282,9 +284,16 @@ proptest! {
}));
}
// Add characters
let char_count = characters.len();
declarations.extend(characters.into_iter().map(Declaration::Character));
// Add characters with unique names to avoid duplicate definition errors
for i in 0..char_count {
declarations.push(Declaration::Character(Character {
name: format!("Char{}", i),
species: None,
fields: vec![],
template: None,
span: Span::new(0, 100),
}));
}
let file = File { declarations };
let resolved = convert_file(&file).unwrap();
@@ -308,6 +317,7 @@ mod edge_cases {
) {
let character = Character {
name: "Test".to_string(),
species: None,
fields: vec![
Field {
name: "int_field".to_string(),
@@ -351,6 +361,7 @@ mod edge_cases {
) {
let character = Character {
name: name.clone(),
species: None,
fields: vec![Field {
name: field_name.clone(),
value: Value::String(string_val.clone()),