mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
Fix Ast2 constraining of opaques
This commit is contained in:
parent
55706ae5c4
commit
0d24e279f1
5 changed files with 30 additions and 8 deletions
|
@ -1857,7 +1857,7 @@ fn num_floatingpoint(pool: &mut Pool, range: TypeId) -> Type2 {
|
|||
|
||||
let alias_content = range_type.shallow_clone();
|
||||
|
||||
Type2::Alias(
|
||||
Type2::Opaque(
|
||||
Symbol::NUM_FLOATINGPOINT,
|
||||
PoolVec::new(vec![(PoolStr::new("range", pool), range)].into_iter(), pool),
|
||||
pool.add(alias_content),
|
||||
|
@ -1905,7 +1905,7 @@ fn _num_integer(pool: &mut Pool, range: TypeId) -> Type2 {
|
|||
|
||||
let alias_content = range_type.shallow_clone();
|
||||
|
||||
Type2::Alias(
|
||||
Type2::Opaque(
|
||||
Symbol::NUM_INTEGER,
|
||||
PoolVec::new(vec![(PoolStr::new("range", pool), range)].into_iter(), pool),
|
||||
pool.add(alias_content),
|
||||
|
@ -1918,7 +1918,7 @@ fn num_num(pool: &mut Pool, type_id: TypeId) -> Type2 {
|
|||
|
||||
let alias_content = range_type.shallow_clone();
|
||||
|
||||
Type2::Alias(
|
||||
Type2::Opaque(
|
||||
Symbol::NUM_NUM,
|
||||
PoolVec::new(
|
||||
vec![(PoolStr::new("range", pool), type_id)].into_iter(),
|
||||
|
|
|
@ -24,6 +24,7 @@ pub enum Type2 {
|
|||
Variable(Variable), // 4B
|
||||
|
||||
Alias(Symbol, PoolVec<(PoolStr, TypeId)>, TypeId), // 24B = 8B + 8B + 4B + pad
|
||||
Opaque(Symbol, PoolVec<(PoolStr, TypeId)>, TypeId), // 24B = 8B + 8B + 4B + pad
|
||||
AsAlias(Symbol, PoolVec<(PoolStr, TypeId)>, TypeId), // 24B = 8B + 8B + 4B + pad
|
||||
|
||||
// 24B
|
||||
|
@ -74,6 +75,9 @@ impl ShallowClone for Type2 {
|
|||
Self::Alias(symbol, args, alias_type_id) => {
|
||||
Self::Alias(*symbol, args.shallow_clone(), alias_type_id.clone())
|
||||
}
|
||||
Self::Opaque(symbol, args, alias_type_id) => {
|
||||
Self::Opaque(*symbol, args.shallow_clone(), alias_type_id.clone())
|
||||
}
|
||||
Self::Record(fields, ext_id) => Self::Record(fields.shallow_clone(), ext_id.clone()),
|
||||
Self::Function(args, closure_type_id, ret_type_id) => Self::Function(
|
||||
args.shallow_clone(),
|
||||
|
@ -101,7 +105,7 @@ impl Type2 {
|
|||
Variable(v) => {
|
||||
result.insert(*v);
|
||||
}
|
||||
Alias(_, _, actual) | AsAlias(_, _, actual) => {
|
||||
Alias(_, _, actual) | AsAlias(_, _, actual) | Opaque(_, _, actual) => {
|
||||
stack.push(pool.get(*actual));
|
||||
}
|
||||
HostExposedAlias {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
use bumpalo::Bump;
|
||||
use roc_can::expected::{Expected, PExpected};
|
||||
use roc_collections::all::{BumpMap, BumpMapDefault, MutMap};
|
||||
use roc_error_macros::internal_error;
|
||||
use roc_module::ident::TagName;
|
||||
use roc_module::symbol::Symbol;
|
||||
use roc_region::all::{Loc, Region};
|
||||
|
@ -868,7 +869,7 @@ fn type_to_variable<'a>(
|
|||
register(subs, rank, pools, content)
|
||||
}
|
||||
|
||||
Alias(symbol, args, alias_type_id) => {
|
||||
Alias(symbol, args, alias_type_id) | Opaque(symbol, args, alias_type_id) => {
|
||||
// TODO cache in uniqueness inference gives problems! all Int's get the same uniqueness var!
|
||||
// Cache aliases without type arguments. Commonly used aliases like `Int` would otherwise get O(n)
|
||||
// different variables (once for each occurrence). The recursion restriction is required
|
||||
|
@ -910,8 +911,12 @@ fn type_to_variable<'a>(
|
|||
|
||||
let alias_var = type_to_variable(arena, mempool, subs, rank, pools, cached, alias_type);
|
||||
|
||||
// TODO(opaques): take opaques into account
|
||||
let content = Content::Alias(*symbol, arg_vars, alias_var, AliasKind::Structural);
|
||||
let kind = match typ {
|
||||
Alias(..) => AliasKind::Structural,
|
||||
Opaque(..) => AliasKind::Opaque,
|
||||
_ => internal_error!(),
|
||||
};
|
||||
let content = Content::Alias(*symbol, arg_vars, alias_var, kind);
|
||||
|
||||
let result = register(subs, rank, pools, content);
|
||||
|
||||
|
|
|
@ -6168,4 +6168,17 @@ mod solve_expr {
|
|||
"a -> Task a *",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn list_with_num_and_str() {
|
||||
infer_eq_without_problem(
|
||||
indoc!(
|
||||
r#"
|
||||
val = [ 1, "abc" ]
|
||||
val
|
||||
"#
|
||||
),
|
||||
"",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3169,7 +3169,7 @@ pub mod test_ed_update {
|
|||
|
||||
assert_type_tooltips_clean(
|
||||
ovec!["val = [ [ 0, 1, \"2\" ], [ 3, 4, 5 ┃] ]"],
|
||||
ovec!["List (Num *)", "List (List <type mismatch>)"],
|
||||
ovec!["List (Num *)", "List <type mismatch>"],
|
||||
)?;
|
||||
|
||||
Ok(())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue