@@ -725,7 +725,10 @@ impl<'gc> Compiler<'gc> {
725725 }
726726
727727 /// Check if an import source refers to the current module (self-import)
728- fn is_self_import(&self, source: &str) -> bool {
728+ fn is_self_import(&self, source: &str, import_type: Option<&str>) -> bool {
729+ if import_type.is_some() {
730+ return false;
731+ }
729732 if let Some(ref fname) = self.script_filename {
730733 let import_base = source.strip_prefix("./").unwrap_or(source);
731734 let self_base = std::path::Path::new(fname).file_name().and_then(|n| n.to_str()).unwrap_or("");
@@ -736,11 +739,10 @@ impl<'gc> Compiler<'gc> {
736739 }
737740
738741 /// Resolve an import specifier to a loaded module path, if available.
739- fn resolve_import_path(&self, source: &str) -> Option<String> {
742+ fn resolve_import_path(&self, source: &str, import_type: Option<&str> ) -> Option<String> {
740743 if let Some(ref fname) = self.script_filename {
741744 let base_path = std::path::Path::new(fname);
742- let resolved = crate::core::resolve_module_path(source, base_path);
743- let resolved_str = resolved.to_string_lossy().to_string();
745+ let resolved_str = crate::core::resolve_module_request_key(source, base_path, import_type);
744746 if self.loaded_module_exports.contains_key(&resolved_str) {
745747 Some(resolved_str)
746748 } else {
@@ -834,7 +836,7 @@ impl<'gc> Compiler<'gc> {
834836 let mut reexport_map: std::collections::HashMap<String, (String, String)> = std::collections::HashMap::new();
835837 for stmt in statements {
836838 if let StatementKind::Export(specs, _, Some(source)) = &*stmt.kind {
837- if self.is_self_import(source) {
839+ if self.is_self_import(source, None ) {
838840 continue; // Skip self-re-exports
839841 }
840842 for spec in specs {
@@ -848,7 +850,7 @@ impl<'gc> Compiler<'gc> {
848850 }
849851 crate::core::statement::ExportSpecifier::Star => {
850852 // export * from "module" — expand all exports (except default)
851- if let Some(resolved) = self.resolve_import_path(source)
853+ if let Some(resolved) = self.resolve_import_path(source, None )
852854 && let Some(exports) = self.loaded_module_exports.get(&resolved)
853855 {
854856 for export_name in exports.keys() {
@@ -868,16 +870,16 @@ impl<'gc> Compiler<'gc> {
868870 }
869871
870872 for stmt in statements {
871- if let StatementKind::Import(specifiers, source) = &*stmt.kind
872- && self.is_self_import(source)
873+ if let StatementKind::Import(specifiers, source, import_type ) = &*stmt.kind
874+ && self.is_self_import(source, import_type.as_deref() )
873875 {
874876 for spec in specifiers {
875877 match spec {
876878 ImportSpecifier::Named(name, alias) => {
877879 let local = alias.as_deref().unwrap_or(name).to_string();
878880 // Check if this is a re-export → redirect to loaded module
879881 if let Some((re_src, orig_name)) = reexport_map.get(name)
880- && let Some(resolved) = self.resolve_import_path(re_src)
882+ && let Some(resolved) = self.resolve_import_path(re_src, None )
881883 {
882884 self.chunk.loaded_module_vars.insert(local.clone(), (resolved, orig_name.clone()));
883885 self.chunk.const_import_bindings.insert(local);
@@ -892,7 +894,7 @@ impl<'gc> Compiler<'gc> {
892894 ImportSpecifier::Default(local) => {
893895 // Check if default is a re-export
894896 if let Some((re_src, orig_name)) = reexport_map.get("default")
895- && let Some(resolved) = self.resolve_import_path(re_src)
897+ && let Some(resolved) = self.resolve_import_path(re_src, None )
896898 {
897899 self.chunk.loaded_module_vars.insert(local.clone(), (resolved, orig_name.clone()));
898900 self.chunk.const_import_bindings.insert(local.clone());
@@ -922,7 +924,7 @@ impl<'gc> Compiler<'gc> {
922924
923925 // Include re-exported names in the namespace
924926 for (export_name, (re_src, orig_name)) in &reexport_map {
925- if let Some(resolved) = self.resolve_import_path(re_src) {
927+ if let Some(resolved) = self.resolve_import_path(re_src, None ) {
926928 let ns_reexport_key = format!("__ns_reexport_{}_{}", local, export_name);
927929 self.chunk
928930 .loaded_module_vars
@@ -954,7 +956,7 @@ impl<'gc> Compiler<'gc> {
954956 .collect();
955957
956958 for (export_name, (re_src, orig_name)) in &reexport_map {
957- if let Some(resolved) = self.resolve_import_path(re_src) {
959+ if let Some(resolved) = self.resolve_import_path(re_src, None ) {
958960 let ns_reexport_key = format!("__ns_reexport_{}_{}", local, export_name);
959961 self.chunk
960962 .loaded_module_vars
@@ -4379,7 +4381,7 @@ impl<'gc> Compiler<'gc> {
43794381 self.chunk.write_u16(idx);
43804382 }
43814383 }
4382- StatementKind::Import(specifiers, source) => {
4384+ StatementKind::Import(specifiers, source, import_type ) => {
43834385 let define_binding = |this: &mut Self, local_name: &str| {
43844386 this.emit_define_var(local_name);
43854387 };
@@ -4417,7 +4419,7 @@ impl<'gc> Compiler<'gc> {
44174419
44184420 for spec in specifiers {
44194421 // Check for self-import first
4420- if self.is_self_import(source) {
4422+ if self.is_self_import(source, import_type.as_deref() ) {
44214423 match spec {
44224424 ImportSpecifier::Named(name, alias) => {
44234425 let local = alias.as_deref().unwrap_or(name).to_string();
@@ -4585,7 +4587,7 @@ impl<'gc> Compiler<'gc> {
45854587 define_binding(self, local);
45864588 }
45874589 (_, ImportSpecifier::Namespace(local)) => {
4588- if let Some(resolved_str) = self.resolve_import_path(source) {
4590+ if let Some(resolved_str) = self.resolve_import_path(source, import_type.as_deref() ) {
45894591 // Resolved from loaded module — value injected at runtime.
45904592 // Still emit placeholder + define to keep stack balanced.
45914593 self.chunk.write_opcode(Opcode::NewObject);
@@ -4600,7 +4602,7 @@ impl<'gc> Compiler<'gc> {
46004602 define_binding(self, local);
46014603 }
46024604 (_, ImportSpecifier::DeferredNamespace(local)) => {
4603- if let Some(resolved_str) = self.resolve_import_path(source) {
4605+ if let Some(resolved_str) = self.resolve_import_path(source, import_type.as_deref() ) {
46044606 self.chunk.write_opcode(Opcode::NewObject);
46054607 self.chunk.write_byte(0);
46064608 self.chunk
@@ -4614,7 +4616,7 @@ impl<'gc> Compiler<'gc> {
46144616 define_binding(self, local);
46154617 }
46164618 (_, ImportSpecifier::Default(local)) => {
4617- let resolved = self.resolve_import_path(source);
4619+ let resolved = self.resolve_import_path(source, import_type.as_deref() );
46184620 if let Some(resolved_str) = resolved {
46194621 // Resolved from loaded module — value injected at runtime.
46204622 let idx = self.chunk.add_constant(Value::Undefined);
@@ -4633,7 +4635,7 @@ impl<'gc> Compiler<'gc> {
46334635 }
46344636 (_, ImportSpecifier::Named(name, alias)) => {
46354637 let local = alias.as_deref().unwrap_or(name).to_string();
4636- let resolved = self.resolve_import_path(source);
4638+ let resolved = self.resolve_import_path(source, import_type.as_deref() );
46374639 if let Some(resolved_str) = resolved {
46384640 // Resolved from loaded module — value injected at runtime.
46394641 let idx = self.chunk.add_constant(Value::Undefined);
0 commit comments