Simplify how builtin types are added to a module

This commit is contained in:
Ayaz Hafiz 2022-09-21 12:17:53 -05:00
parent 2028dd5b0c
commit c521668d4c
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
2 changed files with 24 additions and 172 deletions

View file

@ -80,58 +80,6 @@ const MODULE_SEPARATOR: char = '.';
const EXPANDED_STACK_SIZE: usize = 8 * 1024 * 1024;
/// TODO: how can we populate these at compile/runtime from the standard library?
/// Consider updating the macro in symbol to do this?
const PRELUDE_TYPES: [(&str, Symbol); 33] = [
("Num", Symbol::NUM_NUM),
("Int", Symbol::NUM_INT),
("Frac", Symbol::NUM_FRAC),
("Integer", Symbol::NUM_INTEGER),
("FloatingPoint", Symbol::NUM_FLOATINGPOINT),
("Binary32", Symbol::NUM_BINARY32),
("Binary64", Symbol::NUM_BINARY64),
("Signed128", Symbol::NUM_SIGNED128),
("Signed64", Symbol::NUM_SIGNED64),
("Signed32", Symbol::NUM_SIGNED32),
("Signed16", Symbol::NUM_SIGNED16),
("Signed8", Symbol::NUM_SIGNED8),
("Unsigned128", Symbol::NUM_UNSIGNED128),
("Unsigned64", Symbol::NUM_UNSIGNED64),
("Unsigned32", Symbol::NUM_UNSIGNED32),
("Unsigned16", Symbol::NUM_UNSIGNED16),
("Unsigned8", Symbol::NUM_UNSIGNED8),
("Natural", Symbol::NUM_NATURAL),
("Decimal", Symbol::NUM_DECIMAL),
("Nat", Symbol::NUM_NAT),
("I8", Symbol::NUM_I8),
("I16", Symbol::NUM_I16),
("I32", Symbol::NUM_I32),
("I64", Symbol::NUM_I64),
("I128", Symbol::NUM_I128),
("U8", Symbol::NUM_U8),
("U16", Symbol::NUM_U16),
("U32", Symbol::NUM_U32),
("U64", Symbol::NUM_U64),
("U128", Symbol::NUM_U128),
("F32", Symbol::NUM_F32),
("F64", Symbol::NUM_F64),
("Dec", Symbol::NUM_DEC),
];
const MODULE_ENCODE_TYPES: &[(&str, Symbol)] = &[
("Encoder", Symbol::ENCODE_ENCODER),
("Encoding", Symbol::ENCODE_ENCODING),
("EncoderFormatting", Symbol::ENCODE_ENCODERFORMATTING),
];
const MODULE_DECODE_TYPES: &[(&str, Symbol)] = &[
("DecodeError", Symbol::DECODE_DECODE_ERROR),
("DecodeResult", Symbol::DECODE_DECODE_RESULT),
("Decoder", Symbol::DECODE_DECODER_OPAQUE),
("Decoding", Symbol::DECODE_DECODING),
("DecoderFormatting", Symbol::DECODE_DECODERFORMATTING),
];
macro_rules! log {
($($arg:tt)*) => (dbg_do!(ROC_PRINT_LOAD_LOG, println!($($arg)*)))
}
@ -2057,6 +2005,19 @@ fn report_unused_imported_modules<'a>(
}
}
fn extend_header_with_builtin(header: &mut ModuleHeader, module: ModuleId) {
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(module));
header.imported_modules.insert(module, Region::zero());
let types = Symbol::builtin_types_in_scope(module)
.into_iter()
.map(|(name, info)| (Ident::from(*name), *info));
header.exposed_imports.extend(types);
}
fn update<'a>(
mut state: State<'a>,
msg: Msg<'a>,
@ -2158,134 +2119,25 @@ fn update<'a>(
let mut header = header;
if ![ModuleId::RESULT, ModuleId::BOOL].contains(&header.module_id) {
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::RESULT));
header
.imported_modules
.insert(ModuleId::RESULT, Region::zero());
header.exposed_imports.insert(
Ident::from("Result"),
(Symbol::RESULT_RESULT, Region::zero()),
);
extend_header_with_builtin(&mut header, ModuleId::RESULT);
}
if ![ModuleId::NUM, ModuleId::BOOL, ModuleId::RESULT].contains(&header.module_id) {
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::NUM));
header
.imported_modules
.insert(ModuleId::NUM, Region::zero());
for (type_name, symbol) in PRELUDE_TYPES {
header
.exposed_imports
.insert(Ident::from(type_name), (symbol, Region::zero()));
}
extend_header_with_builtin(&mut header, ModuleId::NUM);
}
if header.module_id != ModuleId::BOOL {
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::BOOL));
header
.imported_modules
.insert(ModuleId::BOOL, Region::zero());
header
.exposed_imports
.insert(Ident::from("Bool"), (Symbol::BOOL_BOOL, Region::zero()));
}
if header.module_id == ModuleId::NUM {
header
.exposed_imports
.insert(Ident::from("List"), (Symbol::LIST_LIST, Region::zero()));
extend_header_with_builtin(&mut header, ModuleId::BOOL);
}
if !header.module_id.is_builtin() {
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::BOX));
header
.imported_modules
.insert(ModuleId::BOX, Region::zero());
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::STR));
header
.imported_modules
.insert(ModuleId::STR, Region::zero());
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::DICT));
header
.imported_modules
.insert(ModuleId::DICT, Region::zero());
header
.exposed_imports
.insert(Ident::from("Dict"), (Symbol::DICT_DICT, Region::zero()));
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::SET));
header
.imported_modules
.insert(ModuleId::SET, Region::zero());
header
.exposed_imports
.insert(Ident::from("Set"), (Symbol::SET_SET, Region::zero()));
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::LIST));
header
.imported_modules
.insert(ModuleId::LIST, Region::zero());
// ENCODE
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::ENCODE));
header
.imported_modules
.insert(ModuleId::ENCODE, Region::zero());
for (type_name, symbol) in MODULE_ENCODE_TYPES {
header
.exposed_imports
.insert(Ident::from(*type_name), (*symbol, Region::zero()));
}
// DECODE
header
.package_qualified_imported_modules
.insert(PackageQualified::Unqualified(ModuleId::DECODE));
header
.imported_modules
.insert(ModuleId::DECODE, Region::zero());
for (type_name, symbol) in MODULE_DECODE_TYPES {
header
.exposed_imports
.insert(Ident::from(*type_name), (*symbol, Region::zero()));
}
extend_header_with_builtin(&mut header, ModuleId::BOX);
extend_header_with_builtin(&mut header, ModuleId::STR);
extend_header_with_builtin(&mut header, ModuleId::DICT);
extend_header_with_builtin(&mut header, ModuleId::SET);
extend_header_with_builtin(&mut header, ModuleId::LIST);
extend_header_with_builtin(&mut header, ModuleId::ENCODE);
extend_header_with_builtin(&mut header, ModuleId::DECODE);
}
state

View file

@ -1169,7 +1169,7 @@ define_builtins! {
85 NUM_INT_CAST: "intCast"
86 NUM_IS_MULTIPLE_OF: "isMultipleOf"
87 NUM_DECIMAL: "Decimal" exposed_type=true
88 NUM_DEC: "Dec" // the Num.Dectype alias
88 NUM_DEC: "Dec" exposed_type=true // the Num.Dectype alias
89 NUM_BYTES_TO_U16: "bytesToU16"
90 NUM_BYTES_TO_U32: "bytesToU32"
91 NUM_CAST_TO_NAT: "#castToNat"