From 58d782fa781477970df4e196d7354cb29571d50d Mon Sep 17 00:00:00 2001 From: KtorZ <5680256+KtorZ@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:55:45 +0100 Subject: [PATCH] Scope type-aliases per module in blueprint. Similarly to how we're already doing it for non-alias types. Fix #1074. Signed-off-by: KtorZ <5680256+KtorZ@users.noreply.github.com> --- crates/aiken-lang/src/ast/well_known.rs | 3 +++ crates/aiken-lang/src/tipo.rs | 1 + crates/aiken-lang/src/tipo/environment.rs | 1 + crates/aiken-lang/src/tipo/pretty.rs | 4 ++++ .../aiken-project/src/blueprint/definitions.rs | 18 ++++++++++++------ 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/crates/aiken-lang/src/ast/well_known.rs b/crates/aiken-lang/src/ast/well_known.rs index c0990d2d..d7338e37 100644 --- a/crates/aiken-lang/src/ast/well_known.rs +++ b/crates/aiken-lang/src/ast/well_known.rs @@ -193,6 +193,7 @@ impl Type { ret: Type::option(Type::tuple(vec![Type::prng(), a])), alias: Some( TypeAliasAnnotation { + module: None, alias: FUZZER.to_string(), parameters: vec!["a".to_string()], annotation: Annotation::Fn { @@ -234,6 +235,7 @@ impl Type { ret: Type::fuzzer(a), alias: Some( TypeAliasAnnotation { + module: None, alias: SAMPLER.to_string(), parameters: vec!["a".to_string()], annotation: Annotation::Fn { @@ -276,6 +278,7 @@ impl Type { args: vec![Type::pair(k, v)], alias: Some( TypeAliasAnnotation { + module: None, alias: PAIRS.to_string(), parameters: vec!["k".to_string(), "v".to_string()], annotation: Annotation::Constructor { diff --git a/crates/aiken-lang/src/tipo.rs b/crates/aiken-lang/src/tipo.rs index f8b1e6f7..5b09da53 100644 --- a/crates/aiken-lang/src/tipo.rs +++ b/crates/aiken-lang/src/tipo.rs @@ -26,6 +26,7 @@ pub use environment::collapse_links; #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct TypeAliasAnnotation { + pub module: Option, pub alias: String, pub parameters: Vec, pub annotation: Annotation, diff --git a/crates/aiken-lang/src/tipo/environment.rs b/crates/aiken-lang/src/tipo/environment.rs index 67e23d73..8abec2f6 100644 --- a/crates/aiken-lang/src/tipo/environment.rs +++ b/crates/aiken-lang/src/tipo/environment.rs @@ -1160,6 +1160,7 @@ impl<'a> Environment<'a> { .set_alias(Some( TypeAliasAnnotation { alias: name.to_string(), + module: Some(module.to_string()), parameters: args.to_vec(), annotation: resolved_type.clone(), } diff --git a/crates/aiken-lang/src/tipo/pretty.rs b/crates/aiken-lang/src/tipo/pretty.rs index 017ecea2..7a6f9b19 100644 --- a/crates/aiken-lang/src/tipo/pretty.rs +++ b/crates/aiken-lang/src/tipo/pretty.rs @@ -51,6 +51,7 @@ impl Printer { alias, parameters, annotation, + module: _, }) = typ.alias().as_deref() { if let Some(resolved_parameters) = resolve_alias(parameters, annotation, typ) { @@ -551,6 +552,7 @@ mod tests { alias: None, }), alias: Some(Rc::new(TypeAliasAnnotation { + module: None, alias: "Fuzzer".to_string(), parameters: vec!["a".to_string(),], annotation: Annotation::Fn { @@ -621,6 +623,7 @@ mod tests { alias: None, }), alias: Some(Rc::new(TypeAliasAnnotation { + module: None, alias: "Fuzzer".to_string(), parameters: vec!["a".to_string(),], annotation: Annotation::Fn { @@ -675,6 +678,7 @@ mod tests { alias: None, }), alias: Some(Rc::new(TypeAliasAnnotation { + module: None, alias: "Identity".to_string(), parameters: vec!["t".to_string()], annotation: Annotation::Var { diff --git a/crates/aiken-project/src/blueprint/definitions.rs b/crates/aiken-project/src/blueprint/definitions.rs index 360a11dd..6a59046e 100644 --- a/crates/aiken-project/src/blueprint/definitions.rs +++ b/crates/aiken-project/src/blueprint/definitions.rs @@ -349,12 +349,14 @@ impl Reference { alias, parameters, annotation, + module, }) = type_info.alias().as_deref() { if let Some(resolved_parameters) = resolve_alias(parameters, annotation, type_info) { return Self::from_type_alias( type_info, - alias.to_string(), + alias, + module.as_deref(), resolved_parameters, type_parameters, ); @@ -429,14 +431,20 @@ impl Reference { fn from_type_alias( type_info: &Type, - alias: String, + alias: &str, + module: Option<&str>, parameters: Vec>, type_parameters: &HashMap>, ) -> Self { + let prefix = match module { + Some(module) => format!("{module}/{alias}"), + None => alias.to_string(), + }; + if !parameters.is_empty() { Reference { inner: format!( - "{alias}${}", + "{prefix}${}", parameters .iter() .map(|param| { @@ -456,9 +464,7 @@ impl Reference { ), } } else { - Reference { - inner: alias.clone(), - } + Reference { inner: prefix } } } }