feat(ast): add species base to template declarations
Added optional species_base field to Template struct enabling
template-species inheritance syntax: `template Name: Species { ... }`.
Updated LALRPOP grammar and all Template construction sites.
This commit is contained in:
@@ -583,6 +583,7 @@ mod tests {
|
||||
|
||||
let template = ast::Template {
|
||||
name: "Person".to_string(),
|
||||
species_base: None,
|
||||
fields: vec![Field {
|
||||
name: "type".to_string(), // Changed from "species"
|
||||
value: Value::Text("human".to_string()),
|
||||
@@ -637,6 +638,7 @@ mod tests {
|
||||
|
||||
let physical = ast::Template {
|
||||
name: "Physical".to_string(),
|
||||
species_base: None,
|
||||
fields: vec![Field {
|
||||
name: "height".to_string(),
|
||||
value: Value::Number(0),
|
||||
@@ -651,6 +653,7 @@ mod tests {
|
||||
|
||||
let mental = ast::Template {
|
||||
name: "Mental".to_string(),
|
||||
species_base: None,
|
||||
fields: vec![Field {
|
||||
name: "iq".to_string(),
|
||||
value: Value::Number(0),
|
||||
@@ -710,6 +713,7 @@ mod tests {
|
||||
|
||||
let base = ast::Template {
|
||||
name: "Human".to_string(),
|
||||
species_base: None,
|
||||
fields: vec![Field {
|
||||
name: "type".to_string(), // Changed from "species"
|
||||
value: Value::Text("human".to_string()),
|
||||
@@ -724,6 +728,7 @@ mod tests {
|
||||
|
||||
let derived = ast::Template {
|
||||
name: "Person".to_string(),
|
||||
species_base: None,
|
||||
fields: vec![Field {
|
||||
name: "age".to_string(),
|
||||
value: Value::Number(0),
|
||||
@@ -791,6 +796,7 @@ mod tests {
|
||||
|
||||
let template = ast::Template {
|
||||
name: "Person".to_string(),
|
||||
species_base: None,
|
||||
fields: vec![Field {
|
||||
name: "age".to_string(),
|
||||
value: Value::Range(Box::new(Value::Number(18)), Box::new(Value::Number(65))),
|
||||
|
||||
@@ -446,6 +446,7 @@ proptest! {
|
||||
})),
|
||||
valid_ident().prop_map(|name| Declaration::Template(Template {
|
||||
name,
|
||||
species_base: None,
|
||||
fields: vec![],
|
||||
strict: false,
|
||||
includes: vec![],
|
||||
|
||||
@@ -574,6 +574,7 @@ mod tests {
|
||||
) -> Template {
|
||||
Template {
|
||||
name: name.to_string(),
|
||||
species_base: None,
|
||||
fields,
|
||||
includes: includes.iter().map(|s| s.to_string()).collect(),
|
||||
strict,
|
||||
|
||||
@@ -331,6 +331,7 @@ mod tests {
|
||||
}),
|
||||
Declaration::Template(Template {
|
||||
name: "Person".to_string(),
|
||||
species_base: None,
|
||||
fields: vec![],
|
||||
strict: false,
|
||||
includes: vec![],
|
||||
|
||||
@@ -68,6 +68,7 @@ fn valid_template_decl() -> impl Strategy<Value = (String, Declaration)> {
|
||||
valid_ident().prop_map(|name| {
|
||||
let decl = Declaration::Template(Template {
|
||||
name: name.clone(),
|
||||
species_base: None,
|
||||
fields: vec![],
|
||||
strict: false,
|
||||
includes: vec![],
|
||||
|
||||
Reference in New Issue
Block a user