diff --git a/compiler/load/src/file.rs b/compiler/load/src/file.rs index ddc3cb3dc7..594344faf6 100644 --- a/compiler/load/src/file.rs +++ b/compiler/load/src/file.rs @@ -20,7 +20,9 @@ use roc_mono::ir::{ }; use roc_mono::layout::{Layout, LayoutCache}; use roc_parse::ast::{self, Attempting, StrLiteral, TypeAnnotation}; -use roc_parse::header::{ExposesEntry, ImportsEntry, PlatformHeader, TypedIdent}; +use roc_parse::header::{ + ExposesEntry, ImportsEntry, PackageEntry, PackageOrPath, PlatformHeader, TypedIdent, +}; use roc_parse::module::module_defs; use roc_parse::parser::{self, Fail, Parser}; use roc_region::all::{Located, Region}; @@ -542,6 +544,7 @@ struct ModuleHeader<'a> { exposed_ident_ids: IdentIds, deps_by_name: MutMap, imported_modules: MutSet, + imported_package_modules: MutSet, exposes: Vec, exposed_imports: MutMap, src: &'a [u8], @@ -2036,27 +2039,57 @@ fn parse_header<'a>( module_timing, ); - // check whether we can find a Pkg-Config.roc file - let mut pkg_config_roc = pkg_config_dir.clone(); - pkg_config_roc.push("platform"); - pkg_config_roc.push(PKG_CONFIG_FILE_NAME); - pkg_config_roc.set_extension(ROC_FILE_EXTENSION); + let opt_base_package = header.packages.iter().find(|loc_package_entry| { + let Located { value, .. } = loc_package_entry; - if pkg_config_roc.as_path().exists() { - let load_pkg_config_msg = load_pkg_config( - arena, - &pkg_config_dir, - module_ids, - ident_ids_by_module, - mode, - )?; + match value { + PackageEntry::Entry { shorthand, .. } => shorthand == &"base", + _ => false, + } + }); - Ok(( - module_id, - Msg::Many(vec![app_module_header_msg, load_pkg_config_msg]), - )) - } else { - Ok((module_id, app_module_header_msg)) + match opt_base_package { + Some(Located { + value: + PackageEntry::Entry { + package_or_path: + Located { + value: package_or_path, + .. + }, + .. + }, + .. + }) => { + match package_or_path { + PackageOrPath::Path(StrLiteral::PlainLine(package)) => { + // check whether we can find a Pkg-Config.roc file + let mut pkg_config_roc = pkg_config_dir.clone(); + pkg_config_roc.push(package); + pkg_config_roc.push(PKG_CONFIG_FILE_NAME); + pkg_config_roc.set_extension(ROC_FILE_EXTENSION); + + if pkg_config_roc.as_path().exists() { + let load_pkg_config_msg = load_pkg_config( + arena, + &pkg_config_dir, + module_ids, + ident_ids_by_module, + mode, + )?; + + Ok(( + module_id, + Msg::Many(vec![app_module_header_msg, load_pkg_config_msg]), + )) + } else { + Ok((module_id, app_module_header_msg)) + } + } + _ => panic!("TODO not yet implement none path platform imports"), + } + } + _ => panic!("could not find base"), } } Ok((ast::Module::Platform { header }, _parse_state)) => fabricate_effects_module( @@ -2291,6 +2324,7 @@ fn send_header<'a>( exposed_ident_ids: ident_ids, module_name: loc_name.value, imported_modules, + imported_package_modules, deps_by_name, exposes: exposed, src: parse_state.bytes,