introduce namespace enum to distinguish module select from type constructor select in patterns.
Signed-off-by: KtorZ <matthias.benkort@gmail.com>
This commit is contained in:
		
							parent
							
								
									f786e80924
								
							
						
					
					
						commit
						c556ada7d5
					
				| 
						 | 
					@ -1535,8 +1535,8 @@ impl BinOp {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub type UntypedPattern = Pattern<(), ()>;
 | 
					pub type UntypedPattern = Pattern<(), (), Namespace>;
 | 
				
			||||||
pub type TypedPattern = Pattern<PatternConstructor, Rc<Type>>;
 | 
					pub type TypedPattern = Pattern<PatternConstructor, Rc<Type>, String>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl TypedPattern {
 | 
					impl TypedPattern {
 | 
				
			||||||
    pub fn var(name: &str) -> Self {
 | 
					    pub fn var(name: &str) -> Self {
 | 
				
			||||||
| 
						 | 
					@ -1654,7 +1654,13 @@ impl TypedPattern {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
 | 
					#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
 | 
				
			||||||
pub enum Pattern<Constructor, Type> {
 | 
					pub enum Namespace {
 | 
				
			||||||
 | 
					    Module(String),
 | 
				
			||||||
 | 
					    Type(String),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
 | 
				
			||||||
 | 
					pub enum Pattern<Constructor, Type, NamespaceKind> {
 | 
				
			||||||
    Int {
 | 
					    Int {
 | 
				
			||||||
        location: Span,
 | 
					        location: Span,
 | 
				
			||||||
        value: String,
 | 
					        value: String,
 | 
				
			||||||
| 
						 | 
					@ -1707,7 +1713,7 @@ pub enum Pattern<Constructor, Type> {
 | 
				
			||||||
        location: Span,
 | 
					        location: Span,
 | 
				
			||||||
        name: String,
 | 
					        name: String,
 | 
				
			||||||
        arguments: Vec<CallArg<Self>>,
 | 
					        arguments: Vec<CallArg<Self>>,
 | 
				
			||||||
        module: Option<String>,
 | 
					        module: Option<NamespaceKind>,
 | 
				
			||||||
        constructor: Constructor,
 | 
					        constructor: Constructor,
 | 
				
			||||||
        spread_location: Option<Span>,
 | 
					        spread_location: Option<Span>,
 | 
				
			||||||
        tipo: Type,
 | 
					        tipo: Type,
 | 
				
			||||||
| 
						 | 
					@ -1725,7 +1731,7 @@ pub enum Pattern<Constructor, Type> {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<A, B> Pattern<A, B> {
 | 
					impl<A, B, C> Pattern<A, B, C> {
 | 
				
			||||||
    pub fn location(&self) -> Span {
 | 
					    pub fn location(&self) -> Span {
 | 
				
			||||||
        match self {
 | 
					        match self {
 | 
				
			||||||
            Pattern::Assign { pattern, .. } => pattern.location(),
 | 
					            Pattern::Assign { pattern, .. } => pattern.location(),
 | 
				
			||||||
| 
						 | 
					@ -2201,22 +2207,23 @@ impl<T: Default> AssignmentKind<T> {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub type MultiPattern<PatternConstructor, Type> = Vec<Pattern<PatternConstructor, Type>>;
 | 
					pub type MultiPattern<PatternConstructor, Type, NamespaceKind> =
 | 
				
			||||||
 | 
					    Vec<Pattern<PatternConstructor, Type, NamespaceKind>>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub type UntypedMultiPattern = MultiPattern<(), ()>;
 | 
					pub type UntypedMultiPattern = MultiPattern<(), (), Namespace>;
 | 
				
			||||||
pub type TypedMultiPattern = MultiPattern<PatternConstructor, Rc<Type>>;
 | 
					pub type TypedMultiPattern = MultiPattern<PatternConstructor, Rc<Type>, String>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, PartialEq)]
 | 
					#[derive(Debug, Clone, PartialEq)]
 | 
				
			||||||
pub struct UntypedClause {
 | 
					pub struct UntypedClause {
 | 
				
			||||||
    pub location: Span,
 | 
					    pub location: Span,
 | 
				
			||||||
    pub patterns: Vec1<Pattern<(), ()>>,
 | 
					    pub patterns: Vec1<UntypedPattern>,
 | 
				
			||||||
    pub then: UntypedExpr,
 | 
					    pub then: UntypedExpr,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
 | 
					#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
 | 
				
			||||||
pub struct TypedClause {
 | 
					pub struct TypedClause {
 | 
				
			||||||
    pub location: Span,
 | 
					    pub location: Span,
 | 
				
			||||||
    pub pattern: Pattern<PatternConstructor, Rc<Type>>,
 | 
					    pub pattern: TypedPattern,
 | 
				
			||||||
    pub then: TypedExpr,
 | 
					    pub then: TypedExpr,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,16 +2,15 @@ pub(crate) use crate::{
 | 
				
			||||||
    ast::{
 | 
					    ast::{
 | 
				
			||||||
        self, Annotation, ArgBy, ArgName, AssignmentKind, AssignmentPattern, BinOp, Bls12_381Point,
 | 
					        self, Annotation, ArgBy, ArgName, AssignmentKind, AssignmentPattern, BinOp, Bls12_381Point,
 | 
				
			||||||
        ByteArrayFormatPreference, CallArg, Curve, DataType, DataTypeKey, DefinitionLocation,
 | 
					        ByteArrayFormatPreference, CallArg, Curve, DataType, DataTypeKey, DefinitionLocation,
 | 
				
			||||||
        Located, LogicalOpChainKind, ParsedCallArg, Pattern, RecordConstructorArg,
 | 
					        Located, LogicalOpChainKind, ParsedCallArg, RecordConstructorArg, RecordUpdateSpread, Span,
 | 
				
			||||||
        RecordUpdateSpread, Span, TraceKind, TypedArg, TypedAssignmentKind, TypedClause,
 | 
					        TraceKind, TypedArg, TypedAssignmentKind, TypedClause, TypedDataType, TypedIfBranch,
 | 
				
			||||||
        TypedDataType, TypedIfBranch, TypedPattern, TypedRecordUpdateArg, UnOp, UntypedArg,
 | 
					        TypedPattern, TypedRecordUpdateArg, UnOp, UntypedArg, UntypedAssignmentKind, UntypedClause,
 | 
				
			||||||
        UntypedAssignmentKind, UntypedClause, UntypedIfBranch, UntypedRecordUpdateArg,
 | 
					        UntypedIfBranch, UntypedRecordUpdateArg,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    parser::token::Base,
 | 
					    parser::token::Base,
 | 
				
			||||||
    tipo::{
 | 
					    tipo::{
 | 
				
			||||||
        check_replaceable_opaque_type, convert_opaque_type, lookup_data_type_by_tipo,
 | 
					        check_replaceable_opaque_type, convert_opaque_type, lookup_data_type_by_tipo,
 | 
				
			||||||
        ModuleValueConstructor, PatternConstructor, Type, TypeVar, ValueConstructor,
 | 
					        ModuleValueConstructor, Type, TypeVar, ValueConstructor, ValueConstructorVariant,
 | 
				
			||||||
        ValueConstructorVariant,
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use indexmap::IndexMap;
 | 
					use indexmap::IndexMap;
 | 
				
			||||||
| 
						 | 
					@ -109,7 +108,7 @@ pub enum TypedExpr {
 | 
				
			||||||
        location: Span,
 | 
					        location: Span,
 | 
				
			||||||
        tipo: Rc<Type>,
 | 
					        tipo: Rc<Type>,
 | 
				
			||||||
        value: Box<Self>,
 | 
					        value: Box<Self>,
 | 
				
			||||||
        pattern: Pattern<PatternConstructor, Rc<Type>>,
 | 
					        pattern: TypedPattern,
 | 
				
			||||||
        kind: TypedAssignmentKind,
 | 
					        kind: TypedAssignmentKind,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@ use crate::{
 | 
				
			||||||
    ast::{
 | 
					    ast::{
 | 
				
			||||||
        Annotation, ArgBy, ArgName, ArgVia, AssignmentKind, AssignmentPattern, BinOp,
 | 
					        Annotation, ArgBy, ArgName, ArgVia, AssignmentKind, AssignmentPattern, BinOp,
 | 
				
			||||||
        ByteArrayFormatPreference, CallArg, CurveType, DataType, Definition, Function,
 | 
					        ByteArrayFormatPreference, CallArg, CurveType, DataType, Definition, Function,
 | 
				
			||||||
        LogicalOpChainKind, ModuleConstant, OnTestFailure, Pattern, RecordConstructor,
 | 
					        LogicalOpChainKind, ModuleConstant, Namespace, OnTestFailure, Pattern, RecordConstructor,
 | 
				
			||||||
        RecordConstructorArg, RecordUpdateSpread, Span, TraceKind, TypeAlias, TypedArg,
 | 
					        RecordConstructorArg, RecordUpdateSpread, Span, TraceKind, TypeAlias, TypedArg,
 | 
				
			||||||
        TypedValidator, UnOp, UnqualifiedImport, UntypedArg, UntypedArgVia, UntypedAssignmentKind,
 | 
					        TypedValidator, UnOp, UnqualifiedImport, UntypedArg, UntypedArgVia, UntypedAssignmentKind,
 | 
				
			||||||
        UntypedClause, UntypedDefinition, UntypedFunction, UntypedIfBranch, UntypedModule,
 | 
					        UntypedClause, UntypedDefinition, UntypedFunction, UntypedIfBranch, UntypedModule,
 | 
				
			||||||
| 
						 | 
					@ -1202,7 +1202,7 @@ impl<'comments> Formatter<'comments> {
 | 
				
			||||||
        &mut self,
 | 
					        &mut self,
 | 
				
			||||||
        name: &'a str,
 | 
					        name: &'a str,
 | 
				
			||||||
        args: &'a [CallArg<UntypedPattern>],
 | 
					        args: &'a [CallArg<UntypedPattern>],
 | 
				
			||||||
        module: &'a Option<String>,
 | 
					        module: &'a Option<Namespace>,
 | 
				
			||||||
        spread_location: Option<Span>,
 | 
					        spread_location: Option<Span>,
 | 
				
			||||||
        is_record: bool,
 | 
					        is_record: bool,
 | 
				
			||||||
    ) -> Document<'a> {
 | 
					    ) -> Document<'a> {
 | 
				
			||||||
| 
						 | 
					@ -1217,7 +1217,9 @@ impl<'comments> Formatter<'comments> {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let name = match module {
 | 
					        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(),
 | 
					            None => name.to_doc(),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,8 +8,10 @@ Constructor {
 | 
				
			||||||
    name: "Foo",
 | 
					    name: "Foo",
 | 
				
			||||||
    arguments: [],
 | 
					    arguments: [],
 | 
				
			||||||
    module: Some(
 | 
					    module: Some(
 | 
				
			||||||
 | 
					        Module(
 | 
				
			||||||
            "module",
 | 
					            "module",
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
    constructor: (),
 | 
					    constructor: (),
 | 
				
			||||||
    spread_location: None,
 | 
					    spread_location: None,
 | 
				
			||||||
    tipo: (),
 | 
					    tipo: (),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,9 +8,9 @@ use super::{
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    ast::{
 | 
					    ast::{
 | 
				
			||||||
        self, Annotation, CallArg, DataType, Definition, Function, ModuleConstant, ModuleKind,
 | 
					        self, Annotation, CallArg, DataType, Definition, Function, ModuleConstant, ModuleKind,
 | 
				
			||||||
        RecordConstructor, RecordConstructorArg, Span, TypeAlias, TypedDefinition, TypedFunction,
 | 
					        Namespace, RecordConstructor, RecordConstructorArg, Span, TypeAlias, TypedDefinition,
 | 
				
			||||||
        TypedPattern, TypedValidator, UnqualifiedImport, UntypedArg, UntypedDefinition,
 | 
					        TypedFunction, TypedPattern, TypedValidator, UnqualifiedImport, UntypedArg,
 | 
				
			||||||
        UntypedFunction, Use, Validator, PIPE_VARIABLE,
 | 
					        UntypedDefinition, UntypedFunction, Use, Validator, PIPE_VARIABLE,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    tipo::{fields::FieldMap, TypeAliasAnnotation},
 | 
					    tipo::{fields::FieldMap, TypeAliasAnnotation},
 | 
				
			||||||
    IdGenerator,
 | 
					    IdGenerator,
 | 
				
			||||||
| 
						 | 
					@ -443,7 +443,7 @@ impl<'a> Environment<'a> {
 | 
				
			||||||
    #[allow(clippy::result_large_err)]
 | 
					    #[allow(clippy::result_large_err)]
 | 
				
			||||||
    pub fn get_value_constructor(
 | 
					    pub fn get_value_constructor(
 | 
				
			||||||
        &mut self,
 | 
					        &mut self,
 | 
				
			||||||
        module: Option<&String>,
 | 
					        module: Option<&Namespace>,
 | 
				
			||||||
        name: &str,
 | 
					        name: &str,
 | 
				
			||||||
        location: Span,
 | 
					        location: Span,
 | 
				
			||||||
    ) -> Result<&ValueConstructor, Error> {
 | 
					    ) -> Result<&ValueConstructor, Error> {
 | 
				
			||||||
| 
						 | 
					@ -457,7 +457,11 @@ impl<'a> Environment<'a> {
 | 
				
			||||||
                    constructors: self.local_constructor_names(),
 | 
					                    constructors: self.local_constructor_names(),
 | 
				
			||||||
                }),
 | 
					                }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Some(m) => {
 | 
					            Some(Namespace::Type(..)) => {
 | 
				
			||||||
 | 
					                todo!()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Some(Namespace::Module(m)) => {
 | 
				
			||||||
                let (_, module) =
 | 
					                let (_, module) =
 | 
				
			||||||
                    self.imported_modules
 | 
					                    self.imported_modules
 | 
				
			||||||
                        .get(m)
 | 
					                        .get(m)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
use super::Type;
 | 
					use super::Type;
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    ast::{Annotation, BinOp, CallArg, LogicalOpChainKind, Span, UntypedFunction, UntypedPattern},
 | 
					    ast::{
 | 
				
			||||||
 | 
					        Annotation, BinOp, CallArg, LogicalOpChainKind, Namespace, Span, UntypedFunction,
 | 
				
			||||||
 | 
					        UntypedPattern,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    error::ExtraData,
 | 
					    error::ExtraData,
 | 
				
			||||||
    expr::{self, AssignmentPattern, UntypedAssignmentKind, UntypedExpr},
 | 
					    expr::{self, AssignmentPattern, UntypedAssignmentKind, UntypedExpr},
 | 
				
			||||||
    format::Formatter,
 | 
					    format::Formatter,
 | 
				
			||||||
| 
						 | 
					@ -395,7 +398,7 @@ From there, you can define 'increment', a function that takes a single argument
 | 
				
			||||||
        expected: usize,
 | 
					        expected: usize,
 | 
				
			||||||
        given: Vec<CallArg<UntypedPattern>>,
 | 
					        given: Vec<CallArg<UntypedPattern>>,
 | 
				
			||||||
        name: String,
 | 
					        name: String,
 | 
				
			||||||
        module: Option<String>,
 | 
					        module: Option<Namespace>,
 | 
				
			||||||
        is_record: bool,
 | 
					        is_record: bool,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -718,7 +721,7 @@ Perhaps, try the following:
 | 
				
			||||||
        label: String,
 | 
					        label: String,
 | 
				
			||||||
        name: String,
 | 
					        name: String,
 | 
				
			||||||
        args: Vec<CallArg<UntypedPattern>>,
 | 
					        args: Vec<CallArg<UntypedPattern>>,
 | 
				
			||||||
        module: Option<String>,
 | 
					        module: Option<Namespace>,
 | 
				
			||||||
        spread_location: Option<Span>,
 | 
					        spread_location: Option<Span>,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1274,7 +1277,7 @@ fn suggest_pattern(
 | 
				
			||||||
    expected: usize,
 | 
					    expected: usize,
 | 
				
			||||||
    name: &str,
 | 
					    name: &str,
 | 
				
			||||||
    given: &[CallArg<UntypedPattern>],
 | 
					    given: &[CallArg<UntypedPattern>],
 | 
				
			||||||
    module: &Option<String>,
 | 
					    module: &Option<Namespace>,
 | 
				
			||||||
    is_record: bool,
 | 
					    is_record: bool,
 | 
				
			||||||
) -> Option<String> {
 | 
					) -> Option<String> {
 | 
				
			||||||
    if expected > given.len() {
 | 
					    if expected > given.len() {
 | 
				
			||||||
| 
						 | 
					@ -1309,7 +1312,7 @@ fn suggest_generic(name: &str, expected: usize) -> String {
 | 
				
			||||||
fn suggest_constructor_pattern(
 | 
					fn suggest_constructor_pattern(
 | 
				
			||||||
    name: &str,
 | 
					    name: &str,
 | 
				
			||||||
    args: &[CallArg<UntypedPattern>],
 | 
					    args: &[CallArg<UntypedPattern>],
 | 
				
			||||||
    module: &Option<String>,
 | 
					    module: &Option<Namespace>,
 | 
				
			||||||
    spread_location: Option<Span>,
 | 
					    spread_location: Option<Span>,
 | 
				
			||||||
) -> String {
 | 
					) -> String {
 | 
				
			||||||
    let fixed_args = args
 | 
					    let fixed_args = args
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,11 +11,11 @@ use super::{
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    ast::{
 | 
					    ast::{
 | 
				
			||||||
        self, Annotation, ArgName, AssignmentKind, AssignmentPattern, BinOp, Bls12_381Point,
 | 
					        self, Annotation, ArgName, AssignmentKind, AssignmentPattern, BinOp, Bls12_381Point,
 | 
				
			||||||
        ByteArrayFormatPreference, CallArg, Curve, Function, IfBranch, LogicalOpChainKind, Pattern,
 | 
					        ByteArrayFormatPreference, CallArg, Curve, Function, IfBranch, LogicalOpChainKind,
 | 
				
			||||||
        RecordUpdateSpread, Span, TraceKind, TraceLevel, Tracing, TypedArg, TypedCallArg,
 | 
					        Namespace, Pattern, RecordUpdateSpread, Span, TraceKind, TraceLevel, Tracing, TypedArg,
 | 
				
			||||||
        TypedClause, TypedIfBranch, TypedPattern, TypedRecordUpdateArg, TypedValidator, UnOp,
 | 
					        TypedCallArg, TypedClause, TypedIfBranch, TypedPattern, TypedRecordUpdateArg,
 | 
				
			||||||
        UntypedArg, UntypedAssignmentKind, UntypedClause, UntypedFunction, UntypedIfBranch,
 | 
					        TypedValidator, UnOp, UntypedArg, UntypedAssignmentKind, UntypedClause, UntypedFunction,
 | 
				
			||||||
        UntypedPattern, UntypedRecordUpdateArg,
 | 
					        UntypedIfBranch, UntypedPattern, UntypedRecordUpdateArg,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    builtins::{from_default_function, BUILTIN},
 | 
					    builtins::{from_default_function, BUILTIN},
 | 
				
			||||||
    expr::{FnStyle, TypedExpr, UntypedExpr},
 | 
					    expr::{FnStyle, TypedExpr, UntypedExpr},
 | 
				
			||||||
| 
						 | 
					@ -404,7 +404,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
 | 
				
			||||||
                module_alias,
 | 
					                module_alias,
 | 
				
			||||||
                label,
 | 
					                label,
 | 
				
			||||||
                ..
 | 
					                ..
 | 
				
			||||||
            } => (Some(module_alias), label),
 | 
					            } => (Some(Namespace::Module(module_alias.to_string())), label),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            TypedExpr::Var { name, .. } => (None, name),
 | 
					            TypedExpr::Var { name, .. } => (None, name),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -413,7 +413,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Ok(self
 | 
					        Ok(self
 | 
				
			||||||
            .environment
 | 
					            .environment
 | 
				
			||||||
            .get_value_constructor(module, name, location)?
 | 
					            .get_value_constructor(module.as_ref(), name, location)?
 | 
				
			||||||
            .field_map())
 | 
					            .field_map())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -792,12 +792,12 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
 | 
				
			||||||
        args: Vec<UntypedRecordUpdateArg>,
 | 
					        args: Vec<UntypedRecordUpdateArg>,
 | 
				
			||||||
        location: Span,
 | 
					        location: Span,
 | 
				
			||||||
    ) -> Result<TypedExpr, Error> {
 | 
					    ) -> Result<TypedExpr, Error> {
 | 
				
			||||||
        let (module, name): (Option<String>, String) = match self.infer(constructor.clone())? {
 | 
					        let (module, name): (Option<Namespace>, String) = match self.infer(constructor.clone())? {
 | 
				
			||||||
            TypedExpr::ModuleSelect {
 | 
					            TypedExpr::ModuleSelect {
 | 
				
			||||||
                module_alias,
 | 
					                module_alias,
 | 
				
			||||||
                label,
 | 
					                label,
 | 
				
			||||||
                ..
 | 
					                ..
 | 
				
			||||||
            } => (Some(module_alias), label),
 | 
					            } => (Some(Namespace::Module(module_alias)), label),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            TypedExpr::Var { name, .. } => (None, name),
 | 
					            TypedExpr::Var { name, .. } => (None, name),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ use super::{
 | 
				
			||||||
    hydrator::Hydrator,
 | 
					    hydrator::Hydrator,
 | 
				
			||||||
    PatternConstructor, Type, ValueConstructorVariant,
 | 
					    PatternConstructor, Type, ValueConstructorVariant,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use crate::ast::{CallArg, Pattern, Span, TypedPattern, UntypedPattern};
 | 
					use crate::ast::{CallArg, Namespace, Pattern, Span, TypedPattern, UntypedPattern};
 | 
				
			||||||
use itertools::Itertools;
 | 
					use itertools::Itertools;
 | 
				
			||||||
use std::{
 | 
					use std::{
 | 
				
			||||||
    collections::{HashMap, HashSet},
 | 
					    collections::{HashMap, HashSet},
 | 
				
			||||||
| 
						 | 
					@ -570,7 +570,12 @@ impl<'a, 'b> PatternTyper<'a, 'b> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            Ok(Pattern::Constructor {
 | 
					                            Ok(Pattern::Constructor {
 | 
				
			||||||
                                location,
 | 
					                                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,
 | 
					                                name,
 | 
				
			||||||
                                arguments: pattern_args,
 | 
					                                arguments: pattern_args,
 | 
				
			||||||
                                constructor,
 | 
					                                constructor,
 | 
				
			||||||
| 
						 | 
					@ -601,7 +606,12 @@ impl<'a, 'b> PatternTyper<'a, 'b> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            Ok(Pattern::Constructor {
 | 
					                            Ok(Pattern::Constructor {
 | 
				
			||||||
                                location,
 | 
					                                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,
 | 
					                                name,
 | 
				
			||||||
                                arguments: vec![],
 | 
					                                arguments: vec![],
 | 
				
			||||||
                                constructor,
 | 
					                                constructor,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue