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:
@@ -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()),
|
||||
|
||||
Reference in New Issue
Block a user