conditionally use a DelayedAlias

This commit is contained in:
Folkert 2022-03-16 18:29:40 +01:00
parent f24bfeea99
commit 48b6cd09c7
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C

View file

@ -339,22 +339,42 @@ fn can_annotation_help(
return error; return error;
} }
let (type_arguments, lambda_set_variables, actual) = // For now, aliases of function types cannot be delayed.
instantiate_and_freshen_alias_type( // This is a limitation of the current implementation,
var_store, // and this totally should be possible in the future.
introduced_variables, let is_import = !symbol.is_builtin() && (env.home != symbol.module_id());
&alias.type_variables, if !is_import && alias.lambda_set_variables.is_empty() {
args, let mut type_var_to_arg = Vec::new();
&alias.lambda_set_variables,
alias.typ.clone(),
);
Type::Alias { for (loc_var, arg_ann) in alias.type_variables.iter().zip(args) {
symbol, let name = loc_var.value.0.clone();
type_arguments,
lambda_set_variables, type_var_to_arg.push((name, arg_ann));
actual: Box::new(actual), }
kind: alias.kind,
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), None => Type::Apply(symbol, args, region),