From 48b6cd09c78b0f36bb929e541ba1d74a22e46760 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 16 Mar 2022 18:29:40 +0100 Subject: [PATCH] conditionally use a DelayedAlias --- compiler/can/src/annotation.rs | 50 ++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/compiler/can/src/annotation.rs b/compiler/can/src/annotation.rs index 421af364d7..e464cc92ec 100644 --- a/compiler/can/src/annotation.rs +++ b/compiler/can/src/annotation.rs @@ -339,22 +339,42 @@ fn can_annotation_help( return error; } - let (type_arguments, lambda_set_variables, actual) = - instantiate_and_freshen_alias_type( - var_store, - introduced_variables, - &alias.type_variables, - args, - &alias.lambda_set_variables, - alias.typ.clone(), - ); + // For now, aliases of function types cannot be delayed. + // This is a limitation of the current implementation, + // and this totally should be possible in the future. + let is_import = !symbol.is_builtin() && (env.home != symbol.module_id()); + if !is_import && alias.lambda_set_variables.is_empty() { + let mut type_var_to_arg = Vec::new(); - Type::Alias { - symbol, - type_arguments, - lambda_set_variables, - actual: Box::new(actual), - kind: alias.kind, + for (loc_var, arg_ann) in alias.type_variables.iter().zip(args) { + let name = loc_var.value.0.clone(); + + type_var_to_arg.push((name, arg_ann)); + } + + Type::DelayedAlias(AliasCommon { + symbol, + type_arguments: type_var_to_arg, + lambda_set_variables: alias.lambda_set_variables.clone(), + }) + } else { + let (type_arguments, lambda_set_variables, actual) = + instantiate_and_freshen_alias_type( + var_store, + introduced_variables, + &alias.type_variables, + args, + &alias.lambda_set_variables, + alias.typ.clone(), + ); + + Type::Alias { + symbol, + type_arguments, + lambda_set_variables, + actual: Box::new(actual), + kind: alias.kind, + } } } None => Type::Apply(symbol, args, region),