diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index 7d45ab8c..6283737a 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -1535,8 +1535,8 @@ impl BinOp { } } -pub type UntypedPattern = Pattern<(), ()>; -pub type TypedPattern = Pattern>; +pub type UntypedPattern = Pattern<(), (), Namespace>; +pub type TypedPattern = Pattern, String>; impl TypedPattern { pub fn var(name: &str) -> Self { @@ -1654,7 +1654,13 @@ impl TypedPattern { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -pub enum Pattern { +pub enum Namespace { + Module(String), + Type(String), +} + +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] +pub enum Pattern { Int { location: Span, value: String, @@ -1707,7 +1713,7 @@ pub enum Pattern { location: Span, name: String, arguments: Vec>, - module: Option, + module: Option, constructor: Constructor, spread_location: Option, tipo: Type, @@ -1725,7 +1731,7 @@ pub enum Pattern { }, } -impl Pattern { +impl Pattern { pub fn location(&self) -> Span { match self { Pattern::Assign { pattern, .. } => pattern.location(), @@ -2201,22 +2207,23 @@ impl AssignmentKind { } } -pub type MultiPattern = Vec>; +pub type MultiPattern = + Vec>; -pub type UntypedMultiPattern = MultiPattern<(), ()>; -pub type TypedMultiPattern = MultiPattern>; +pub type UntypedMultiPattern = MultiPattern<(), (), Namespace>; +pub type TypedMultiPattern = MultiPattern, String>; #[derive(Debug, Clone, PartialEq)] pub struct UntypedClause { pub location: Span, - pub patterns: Vec1>, + pub patterns: Vec1, pub then: UntypedExpr, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct TypedClause { pub location: Span, - pub pattern: Pattern>, + pub pattern: TypedPattern, pub then: TypedExpr, } diff --git a/crates/aiken-lang/src/expr.rs b/crates/aiken-lang/src/expr.rs index 055f39e6..5e4bb154 100644 --- a/crates/aiken-lang/src/expr.rs +++ b/crates/aiken-lang/src/expr.rs @@ -2,16 +2,15 @@ pub(crate) use crate::{ ast::{ self, Annotation, ArgBy, ArgName, AssignmentKind, AssignmentPattern, BinOp, Bls12_381Point, ByteArrayFormatPreference, CallArg, Curve, DataType, DataTypeKey, DefinitionLocation, - Located, LogicalOpChainKind, ParsedCallArg, Pattern, RecordConstructorArg, - RecordUpdateSpread, Span, TraceKind, TypedArg, TypedAssignmentKind, TypedClause, - TypedDataType, TypedIfBranch, TypedPattern, TypedRecordUpdateArg, UnOp, UntypedArg, - UntypedAssignmentKind, UntypedClause, UntypedIfBranch, UntypedRecordUpdateArg, + Located, LogicalOpChainKind, ParsedCallArg, RecordConstructorArg, RecordUpdateSpread, Span, + TraceKind, TypedArg, TypedAssignmentKind, TypedClause, TypedDataType, TypedIfBranch, + TypedPattern, TypedRecordUpdateArg, UnOp, UntypedArg, UntypedAssignmentKind, UntypedClause, + UntypedIfBranch, UntypedRecordUpdateArg, }, parser::token::Base, tipo::{ check_replaceable_opaque_type, convert_opaque_type, lookup_data_type_by_tipo, - ModuleValueConstructor, PatternConstructor, Type, TypeVar, ValueConstructor, - ValueConstructorVariant, + ModuleValueConstructor, Type, TypeVar, ValueConstructor, ValueConstructorVariant, }, }; use indexmap::IndexMap; @@ -109,7 +108,7 @@ pub enum TypedExpr { location: Span, tipo: Rc, value: Box, - pattern: Pattern>, + pattern: TypedPattern, kind: TypedAssignmentKind, }, diff --git a/crates/aiken-lang/src/format.rs b/crates/aiken-lang/src/format.rs index ddee569d..64d7c876 100644 --- a/crates/aiken-lang/src/format.rs +++ b/crates/aiken-lang/src/format.rs @@ -2,7 +2,7 @@ use crate::{ ast::{ Annotation, ArgBy, ArgName, ArgVia, AssignmentKind, AssignmentPattern, BinOp, ByteArrayFormatPreference, CallArg, CurveType, DataType, Definition, Function, - LogicalOpChainKind, ModuleConstant, OnTestFailure, Pattern, RecordConstructor, + LogicalOpChainKind, ModuleConstant, Namespace, OnTestFailure, Pattern, RecordConstructor, RecordConstructorArg, RecordUpdateSpread, Span, TraceKind, TypeAlias, TypedArg, TypedValidator, UnOp, UnqualifiedImport, UntypedArg, UntypedArgVia, UntypedAssignmentKind, UntypedClause, UntypedDefinition, UntypedFunction, UntypedIfBranch, UntypedModule, @@ -1202,7 +1202,7 @@ impl<'comments> Formatter<'comments> { &mut self, name: &'a str, args: &'a [CallArg], - module: &'a Option, + module: &'a Option, spread_location: Option, is_record: bool, ) -> Document<'a> { @@ -1217,7 +1217,9 @@ impl<'comments> Formatter<'comments> { } let name = match module { - Some(m) => m.to_doc().append(".").append(name), + Some(Namespace::Module(m)) | Some(Namespace::Type(m)) => { + m.to_doc().append(".").append(name) + } None => name.to_doc(), }; diff --git a/crates/aiken-lang/src/parser/pattern/snapshots/constructor_module_select.snap b/crates/aiken-lang/src/parser/pattern/snapshots/constructor_module_select.snap index 010bdda3..82a7a1a8 100644 --- a/crates/aiken-lang/src/parser/pattern/snapshots/constructor_module_select.snap +++ b/crates/aiken-lang/src/parser/pattern/snapshots/constructor_module_select.snap @@ -8,7 +8,9 @@ Constructor { name: "Foo", arguments: [], module: Some( - "module", + Module( + "module", + ), ), constructor: (), spread_location: None, diff --git a/crates/aiken-lang/src/tipo/environment.rs b/crates/aiken-lang/src/tipo/environment.rs index 8abec2f6..5c75f3d1 100644 --- a/crates/aiken-lang/src/tipo/environment.rs +++ b/crates/aiken-lang/src/tipo/environment.rs @@ -8,9 +8,9 @@ use super::{ use crate::{ ast::{ self, Annotation, CallArg, DataType, Definition, Function, ModuleConstant, ModuleKind, - RecordConstructor, RecordConstructorArg, Span, TypeAlias, TypedDefinition, TypedFunction, - TypedPattern, TypedValidator, UnqualifiedImport, UntypedArg, UntypedDefinition, - UntypedFunction, Use, Validator, PIPE_VARIABLE, + Namespace, RecordConstructor, RecordConstructorArg, Span, TypeAlias, TypedDefinition, + TypedFunction, TypedPattern, TypedValidator, UnqualifiedImport, UntypedArg, + UntypedDefinition, UntypedFunction, Use, Validator, PIPE_VARIABLE, }, tipo::{fields::FieldMap, TypeAliasAnnotation}, IdGenerator, @@ -443,7 +443,7 @@ impl<'a> Environment<'a> { #[allow(clippy::result_large_err)] pub fn get_value_constructor( &mut self, - module: Option<&String>, + module: Option<&Namespace>, name: &str, location: Span, ) -> Result<&ValueConstructor, Error> { @@ -457,7 +457,11 @@ impl<'a> Environment<'a> { constructors: self.local_constructor_names(), }), - Some(m) => { + Some(Namespace::Type(..)) => { + todo!() + } + + Some(Namespace::Module(m)) => { let (_, module) = self.imported_modules .get(m) diff --git a/crates/aiken-lang/src/tipo/error.rs b/crates/aiken-lang/src/tipo/error.rs index 21c22220..769b05df 100644 --- a/crates/aiken-lang/src/tipo/error.rs +++ b/crates/aiken-lang/src/tipo/error.rs @@ -1,6 +1,9 @@ use super::Type; use crate::{ - ast::{Annotation, BinOp, CallArg, LogicalOpChainKind, Span, UntypedFunction, UntypedPattern}, + ast::{ + Annotation, BinOp, CallArg, LogicalOpChainKind, Namespace, Span, UntypedFunction, + UntypedPattern, + }, error::ExtraData, expr::{self, AssignmentPattern, UntypedAssignmentKind, UntypedExpr}, format::Formatter, @@ -395,7 +398,7 @@ From there, you can define 'increment', a function that takes a single argument expected: usize, given: Vec>, name: String, - module: Option, + module: Option, is_record: bool, }, @@ -718,7 +721,7 @@ Perhaps, try the following: label: String, name: String, args: Vec>, - module: Option, + module: Option, spread_location: Option, }, @@ -1274,7 +1277,7 @@ fn suggest_pattern( expected: usize, name: &str, given: &[CallArg], - module: &Option, + module: &Option, is_record: bool, ) -> Option { if expected > given.len() { @@ -1309,7 +1312,7 @@ fn suggest_generic(name: &str, expected: usize) -> String { fn suggest_constructor_pattern( name: &str, args: &[CallArg], - module: &Option, + module: &Option, spread_location: Option, ) -> String { let fixed_args = args diff --git a/crates/aiken-lang/src/tipo/expr.rs b/crates/aiken-lang/src/tipo/expr.rs index 4c9d959e..e572fa85 100644 --- a/crates/aiken-lang/src/tipo/expr.rs +++ b/crates/aiken-lang/src/tipo/expr.rs @@ -11,11 +11,11 @@ use super::{ use crate::{ ast::{ self, Annotation, ArgName, AssignmentKind, AssignmentPattern, BinOp, Bls12_381Point, - ByteArrayFormatPreference, CallArg, Curve, Function, IfBranch, LogicalOpChainKind, Pattern, - RecordUpdateSpread, Span, TraceKind, TraceLevel, Tracing, TypedArg, TypedCallArg, - TypedClause, TypedIfBranch, TypedPattern, TypedRecordUpdateArg, TypedValidator, UnOp, - UntypedArg, UntypedAssignmentKind, UntypedClause, UntypedFunction, UntypedIfBranch, - UntypedPattern, UntypedRecordUpdateArg, + ByteArrayFormatPreference, CallArg, Curve, Function, IfBranch, LogicalOpChainKind, + Namespace, Pattern, RecordUpdateSpread, Span, TraceKind, TraceLevel, Tracing, TypedArg, + TypedCallArg, TypedClause, TypedIfBranch, TypedPattern, TypedRecordUpdateArg, + TypedValidator, UnOp, UntypedArg, UntypedAssignmentKind, UntypedClause, UntypedFunction, + UntypedIfBranch, UntypedPattern, UntypedRecordUpdateArg, }, builtins::{from_default_function, BUILTIN}, expr::{FnStyle, TypedExpr, UntypedExpr}, @@ -404,7 +404,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> { module_alias, label, .. - } => (Some(module_alias), label), + } => (Some(Namespace::Module(module_alias.to_string())), label), TypedExpr::Var { name, .. } => (None, name), @@ -413,7 +413,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> { Ok(self .environment - .get_value_constructor(module, name, location)? + .get_value_constructor(module.as_ref(), name, location)? .field_map()) } @@ -792,12 +792,12 @@ impl<'a, 'b> ExprTyper<'a, 'b> { args: Vec, location: Span, ) -> Result { - let (module, name): (Option, String) = match self.infer(constructor.clone())? { + let (module, name): (Option, String) = match self.infer(constructor.clone())? { TypedExpr::ModuleSelect { module_alias, label, .. - } => (Some(module_alias), label), + } => (Some(Namespace::Module(module_alias)), label), TypedExpr::Var { name, .. } => (None, name), diff --git a/crates/aiken-lang/src/tipo/pattern.rs b/crates/aiken-lang/src/tipo/pattern.rs index 99ad74ef..d3a23afc 100644 --- a/crates/aiken-lang/src/tipo/pattern.rs +++ b/crates/aiken-lang/src/tipo/pattern.rs @@ -6,7 +6,7 @@ use super::{ hydrator::Hydrator, PatternConstructor, Type, ValueConstructorVariant, }; -use crate::ast::{CallArg, Pattern, Span, TypedPattern, UntypedPattern}; +use crate::ast::{CallArg, Namespace, Pattern, Span, TypedPattern, UntypedPattern}; use itertools::Itertools; use std::{ collections::{HashMap, HashSet}, @@ -570,7 +570,12 @@ impl<'a, 'b> PatternTyper<'a, 'b> { Ok(Pattern::Constructor { location, - module, + // NOTE: + // Type namespaces are completely erased during type-check. + module: match module { + None | Some(Namespace::Type(_)) => None, + Some(Namespace::Module(m)) => Some(m), + }, name, arguments: pattern_args, constructor, @@ -601,7 +606,12 @@ impl<'a, 'b> PatternTyper<'a, 'b> { Ok(Pattern::Constructor { location, - module, + // NOTE: + // Type namespaces are completely erased during type-check. + module: match module { + None | Some(Namespace::Type(_)) => None, + Some(Namespace::Module(m)) => Some(m), + }, name, arguments: vec![], constructor,