mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 16:44:33 +00:00
rewrite and fix builtin alias instantiation
This commit is contained in:
parent
f868410a91
commit
c5fb4f2e47
1 changed files with 88 additions and 48 deletions
|
@ -188,44 +188,6 @@ impl Aliases {
|
||||||
register(subs, rank, pools, content)
|
register(subs, rank, pools, content)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn instantiate_num_int(
|
|
||||||
subs: &mut Subs,
|
|
||||||
rank: Rank,
|
|
||||||
pools: &mut Pools,
|
|
||||||
integer_range_slice: SubsSlice<Variable>,
|
|
||||||
) -> Variable {
|
|
||||||
let integer_var = Self::instantiate_num_at_alias(
|
|
||||||
subs,
|
|
||||||
rank,
|
|
||||||
pools,
|
|
||||||
Subs::NUM_AT_INTEGER,
|
|
||||||
integer_range_slice,
|
|
||||||
);
|
|
||||||
|
|
||||||
let num_range_slice = SubsSlice::extend_new(&mut subs.variables, [integer_var]);
|
|
||||||
|
|
||||||
Self::instantiate_num_at_alias(subs, rank, pools, Subs::NUM_AT_NUM, num_range_slice)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn instantiate_num_float(
|
|
||||||
subs: &mut Subs,
|
|
||||||
rank: Rank,
|
|
||||||
pools: &mut Pools,
|
|
||||||
float_range_slice: SubsSlice<Variable>,
|
|
||||||
) -> Variable {
|
|
||||||
let float_var = Self::instantiate_num_at_alias(
|
|
||||||
subs,
|
|
||||||
rank,
|
|
||||||
pools,
|
|
||||||
Subs::NUM_AT_FLOATINGPOINT,
|
|
||||||
float_range_slice,
|
|
||||||
);
|
|
||||||
|
|
||||||
let num_range_slice = SubsSlice::extend_new(&mut subs.variables, [float_var]);
|
|
||||||
|
|
||||||
Self::instantiate_num_at_alias(subs, rank, pools, Subs::NUM_AT_NUM, num_range_slice)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn instantiate_builtin_aliases(
|
fn instantiate_builtin_aliases(
|
||||||
&mut self,
|
&mut self,
|
||||||
subs: &mut Subs,
|
subs: &mut Subs,
|
||||||
|
@ -241,48 +203,125 @@ impl Aliases {
|
||||||
Some(var)
|
Some(var)
|
||||||
}
|
}
|
||||||
Symbol::NUM_NUM => {
|
Symbol::NUM_NUM => {
|
||||||
let range_slice = SubsSlice::new(alias_variables.variables_start, 1);
|
|
||||||
let var = Self::instantiate_num_at_alias(
|
let var = Self::instantiate_num_at_alias(
|
||||||
subs,
|
subs,
|
||||||
rank,
|
rank,
|
||||||
pools,
|
pools,
|
||||||
Subs::NUM_AT_NUM,
|
Subs::NUM_AT_NUM,
|
||||||
range_slice,
|
SubsSlice::new(alias_variables.variables_start, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
Some(var)
|
Some(var)
|
||||||
}
|
}
|
||||||
Symbol::NUM_FLOATINGPOINT => {
|
Symbol::NUM_FLOATINGPOINT => {
|
||||||
let range_slice = SubsSlice::new(alias_variables.variables_start, 1);
|
|
||||||
let var = Self::instantiate_num_at_alias(
|
let var = Self::instantiate_num_at_alias(
|
||||||
subs,
|
subs,
|
||||||
rank,
|
rank,
|
||||||
pools,
|
pools,
|
||||||
Subs::NUM_AT_FLOATINGPOINT,
|
Subs::NUM_AT_FLOATINGPOINT,
|
||||||
range_slice,
|
SubsSlice::new(alias_variables.variables_start, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
Some(var)
|
Some(var)
|
||||||
}
|
}
|
||||||
Symbol::NUM_INTEGER => {
|
Symbol::NUM_INTEGER => {
|
||||||
let range_slice = SubsSlice::new(alias_variables.variables_start, 1);
|
|
||||||
let var = Self::instantiate_num_at_alias(
|
let var = Self::instantiate_num_at_alias(
|
||||||
subs,
|
subs,
|
||||||
rank,
|
rank,
|
||||||
pools,
|
pools,
|
||||||
Subs::NUM_AT_INTEGER,
|
Subs::NUM_AT_INTEGER,
|
||||||
range_slice,
|
SubsSlice::new(alias_variables.variables_start, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
Some(var)
|
Some(var)
|
||||||
}
|
}
|
||||||
Symbol::NUM_INT => {
|
Symbol::NUM_INT => {
|
||||||
let range_slice = SubsSlice::new(alias_variables.variables_start, 1);
|
// [ @Integer range ]
|
||||||
Some(Self::instantiate_num_int(subs, rank, pools, range_slice))
|
let integer_content_var = Self::instantiate_builtin_aliases(
|
||||||
|
self,
|
||||||
|
subs,
|
||||||
|
rank,
|
||||||
|
pools,
|
||||||
|
Symbol::NUM_INTEGER,
|
||||||
|
alias_variables,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Integer range (alias variable is the same as `Int range`)
|
||||||
|
let integer_alias_variables = alias_variables;
|
||||||
|
let integer_content = Content::Alias(
|
||||||
|
Symbol::NUM_INTEGER,
|
||||||
|
integer_alias_variables,
|
||||||
|
integer_content_var,
|
||||||
|
AliasKind::Structural,
|
||||||
|
);
|
||||||
|
let integer_alias_var = register(subs, rank, pools, integer_content);
|
||||||
|
|
||||||
|
// [ @Num (Integer range) ]
|
||||||
|
let num_alias_variables =
|
||||||
|
AliasVariables::insert_into_subs(subs, [integer_alias_var], []);
|
||||||
|
let num_content_var = Self::instantiate_builtin_aliases(
|
||||||
|
self,
|
||||||
|
subs,
|
||||||
|
rank,
|
||||||
|
pools,
|
||||||
|
Symbol::NUM_NUM,
|
||||||
|
num_alias_variables,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let num_content = Content::Alias(
|
||||||
|
Symbol::NUM_NUM,
|
||||||
|
num_alias_variables,
|
||||||
|
num_content_var,
|
||||||
|
AliasKind::Structural,
|
||||||
|
);
|
||||||
|
|
||||||
|
Some(register(subs, rank, pools, num_content))
|
||||||
}
|
}
|
||||||
Symbol::NUM_FLOAT => {
|
Symbol::NUM_FLOAT => {
|
||||||
let range_slice = SubsSlice::new(alias_variables.variables_start, 1);
|
// [ @FloatingPoint range ]
|
||||||
Some(Self::instantiate_num_float(subs, rank, pools, range_slice))
|
let fpoint_content_var = Self::instantiate_builtin_aliases(
|
||||||
|
self,
|
||||||
|
subs,
|
||||||
|
rank,
|
||||||
|
pools,
|
||||||
|
Symbol::NUM_FLOATINGPOINT,
|
||||||
|
alias_variables,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// FloatingPoint range (alias variable is the same as `Float range`)
|
||||||
|
let fpoint_alias_variables = alias_variables;
|
||||||
|
let fpoint_content = Content::Alias(
|
||||||
|
Symbol::NUM_FLOATINGPOINT,
|
||||||
|
fpoint_alias_variables,
|
||||||
|
fpoint_content_var,
|
||||||
|
AliasKind::Structural,
|
||||||
|
);
|
||||||
|
let fpoint_alias_var = register(subs, rank, pools, fpoint_content);
|
||||||
|
|
||||||
|
// [ @Num (FloatingPoint range) ]
|
||||||
|
let num_alias_variables =
|
||||||
|
AliasVariables::insert_into_subs(subs, [fpoint_alias_var], []);
|
||||||
|
let num_content_var = Self::instantiate_builtin_aliases(
|
||||||
|
self,
|
||||||
|
subs,
|
||||||
|
rank,
|
||||||
|
pools,
|
||||||
|
Symbol::NUM_NUM,
|
||||||
|
num_alias_variables,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let num_content = Content::Alias(
|
||||||
|
Symbol::NUM_NUM,
|
||||||
|
num_alias_variables,
|
||||||
|
num_content_var,
|
||||||
|
AliasKind::Structural,
|
||||||
|
);
|
||||||
|
|
||||||
|
Some(register(subs, rank, pools, num_content))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
@ -297,6 +336,7 @@ impl Aliases {
|
||||||
symbol: Symbol,
|
symbol: Symbol,
|
||||||
alias_variables: AliasVariables,
|
alias_variables: AliasVariables,
|
||||||
) -> Result<Variable, ()> {
|
) -> Result<Variable, ()> {
|
||||||
|
// hardcoded instantiations for builtin aliases
|
||||||
if let Some(var) =
|
if let Some(var) =
|
||||||
Self::instantiate_builtin_aliases(self, subs, rank, pools, symbol, alias_variables)
|
Self::instantiate_builtin_aliases(self, subs, rank, pools, symbol, alias_variables)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue