make builtin applies importable

This commit is contained in:
Folkert 2020-03-07 01:21:45 +01:00
parent 9c5df1d5a5
commit 63c5af2882
3 changed files with 35 additions and 19 deletions

View file

@ -1,4 +1,4 @@
use roc_collections::all::{default_hasher, MutMap}; use roc_collections::all::{default_hasher, MutMap, MutSet};
use roc_module::ident::TagName; use roc_module::ident::TagName;
use roc_module::symbol::Symbol; use roc_module::symbol::Symbol;
use roc_region::all::{Located, Region}; use roc_region::all::{Located, Region};
@ -16,6 +16,7 @@ pub struct StdLib {
pub mode: Mode, pub mode: Mode,
pub types: MutMap<Symbol, (SolvedType, Region)>, pub types: MutMap<Symbol, (SolvedType, Region)>,
pub aliases: MutMap<Symbol, BuiltinAlias>, pub aliases: MutMap<Symbol, BuiltinAlias>,
pub applies: MutSet<Symbol>,
} }
pub fn standard_stdlib() -> StdLib { pub fn standard_stdlib() -> StdLib {
@ -23,6 +24,14 @@ pub fn standard_stdlib() -> StdLib {
mode: Mode::Standard, mode: Mode::Standard,
types: types(), types: types(),
aliases: aliases(), aliases: aliases(),
applies: vec![
Symbol::LIST_LIST,
Symbol::SET_SET,
Symbol::MAP_MAP,
Symbol::STR_STR,
]
.into_iter()
.collect(),
} }
} }

View file

@ -105,6 +105,15 @@ pub fn uniq_stdlib() -> StdLib {
mode: Mode::Uniqueness, mode: Mode::Uniqueness,
types, types,
aliases, aliases,
applies: vec![
Symbol::ATTR_ATTR,
Symbol::LIST_LIST,
Symbol::SET_SET,
Symbol::MAP_MAP,
Symbol::STR_STR,
]
.into_iter()
.collect(),
} }
} }

View file

@ -17,7 +17,7 @@ use roc_parse::module::module_defs;
use roc_parse::parser::{Fail, Parser, State}; use roc_parse::parser::{Fail, Parser, State};
use roc_region::all::{Located, Region}; use roc_region::all::{Located, Region};
use roc_solve::solve::{self, ExposedModuleTypes, SubsByModule}; use roc_solve::solve::{self, ExposedModuleTypes, SubsByModule};
use roc_types::solved_types::{BuiltinAlias, Solved, SolvedType}; use roc_types::solved_types::{Solved, SolvedType};
use roc_types::subs::{Subs, VarStore, Variable}; use roc_types::subs::{Subs, VarStore, Variable};
use roc_types::types::{self, Alias}; use roc_types::types::{self, Alias};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
@ -779,24 +779,22 @@ fn solve_module(
solved_type, solved_type,
}); });
} }
// This wasn't a builtin value; maybe it was a builtin alias. None => {
None => match stdlib.aliases.get(&symbol) { if stdlib.applies.contains(&symbol) {
Some(BuiltinAlias { region, typ, .. }) => { // do nothing
let loc_symbol = Located { } else {
value: symbol, // This wasn't a builtin value or Apply; maybe it was a builtin alias.
region: *region, match stdlib.aliases.get(&symbol) {
}; Some(_) => {
// do nothing
imported_symbols.push(Import { }
loc_symbol, None => panic!(
solved_type: typ, "Could not find {:?} in builtin types {:?} or aliases {:?}",
}); symbol, stdlib.types, stdlib.aliases
),
}
} }
None => panic!( }
"Could not find {:?} in builtin types {:?} or aliases {:?}",
symbol, stdlib.types, stdlib.aliases
),
},
} }
} else if module_id != home { } else if module_id != home {
// We already have constraints for our own symbols. // We already have constraints for our own symbols.