diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/provide_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/provide_dependency.rs index cd225f8dd2b..47a8fe48128 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/provide_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/provide_dependency.rs @@ -1,8 +1,8 @@ use itertools::Itertools; -use rspack_core::DependencyType; use rspack_core::{ - create_exports_object_referenced, module_raw, Compilation, ExtendedReferencedExport, ModuleGraph, - NormalInitFragment, RuntimeSpec, UsedName, + create_exports_object_referenced, module_raw, Compilation, DependencyType, + ExtendedReferencedExport, ModuleGraph, NormalInitFragment, RealDependencyLocation, RuntimeSpec, + UsedName, }; use rspack_core::{AsContextDependency, Dependency, InitFragmentKey, InitFragmentStage}; use rspack_core::{DependencyCategory, DependencyId, DependencyTemplate}; @@ -12,19 +12,22 @@ use swc_core::atoms::Atom; #[derive(Debug, Clone)] pub struct ProvideDependency { - start: u32, - end: u32, id: DependencyId, request: Atom, identifier: String, ids: Vec, + range: RealDependencyLocation, } impl ProvideDependency { - pub fn new(start: u32, end: u32, request: Atom, identifier: String, ids: Vec) -> Self { + pub fn new( + range: RealDependencyLocation, + request: Atom, + identifier: String, + ids: Vec, + ) -> Self { Self { - start, - end, + range, request, identifier, ids, @@ -38,6 +41,10 @@ impl Dependency for ProvideDependency { &self.id } + fn loc(&self) -> Option { + Some(self.range.to_string()) + } + fn category(&self) -> &DependencyCategory { &DependencyCategory::Esm } @@ -116,7 +123,7 @@ impl DependencyTemplate for ProvideDependency { InitFragmentKey::ModuleExternal(format!("provided {}", self.identifier)), None, ))); - source.replace(self.start, self.end, &self.identifier, None); + source.replace(self.range.start, self.range.end, &self.identifier, None); } fn dependency_id(&self) -> Option { diff --git a/crates/rspack_plugin_javascript/src/parser_plugin/provide_plugin.rs b/crates/rspack_plugin_javascript/src/parser_plugin/provide_plugin.rs index e5ec3d76613..3110da02358 100644 --- a/crates/rspack_plugin_javascript/src/parser_plugin/provide_plugin.rs +++ b/crates/rspack_plugin_javascript/src/parser_plugin/provide_plugin.rs @@ -2,7 +2,7 @@ use itertools::Itertools; use once_cell::sync::OnceCell; use rspack_core::{ ApplyContext, CompilerOptions, ModuleType, NormalModuleFactoryParser, ParserAndGenerator, - ParserOptions, Plugin, PluginContext, SpanExt, + ParserOptions, Plugin, PluginContext, RealDependencyLocation, }; use rspack_error::Result; use rspack_hook::{plugin, plugin_hook}; @@ -13,11 +13,14 @@ use crate::{ dependency::ProvideDependency, parser_and_generator::JavaScriptParserAndGenerator, visitors::JavascriptParser, BoxJavascriptParserPlugin, }; - const SOURCE_DOT: &str = r#"."#; const MODULE_DOT: &str = r#"_dot_"#; -fn dep(value: &ProvideValue, name: &str, start: u32, end: u32) -> Option { +fn create_provide_dep( + name: &str, + value: &ProvideValue, + range: RealDependencyLocation, +) -> Option { if let Some(requests) = value.get(name) { let name_identifier = if name.contains(SOURCE_DOT) { format!("__webpack_provide_{}", name.replace(SOURCE_DOT, MODULE_DOT)) @@ -25,8 +28,7 @@ fn dep(value: &ProvideValue, name: &str, start: u32, end: u32) -> Option Option { - dep( - &self.provide, + let range: RealDependencyLocation = expr.callee.span().into(); + create_provide_dep( for_name, - expr.callee.span().real_lo(), - expr.callee.span().real_hi(), + &self.provide, + range.with_source(parser.source_map.clone()), ) .map(|dep| { parser.dependencies.push(Box::new(dep)); @@ -104,11 +106,11 @@ impl JavascriptParserPlugin for ProvidePlugin { expr: &swc_core::ecma::ast::MemberExpr, for_name: &str, ) -> Option { - dep( - &self.provide, + let range: RealDependencyLocation = expr.span().into(); + create_provide_dep( for_name, - expr.span().real_lo(), - expr.span().real_hi(), + &self.provide, + range.with_source(parser.source_map.clone()), ) .map(|dep| { parser.dependencies.push(Box::new(dep)); @@ -122,11 +124,11 @@ impl JavascriptParserPlugin for ProvidePlugin { ident: &swc_core::ecma::ast::Ident, for_name: &str, ) -> Option { - dep( - &self.provide, + let range: RealDependencyLocation = ident.span.into(); + create_provide_dep( for_name, - ident.span.real_lo(), - ident.span.real_hi(), + &self.provide, + range.with_source(parser.source_map.clone()), ) .map(|dep| { parser.dependencies.push(Box::new(dep));