From 38992580e27759f3288530a9d4dcfe9da31e3c69 Mon Sep 17 00:00:00 2001 From: shulaoda Date: Mon, 29 Jul 2024 05:29:52 +0800 Subject: [PATCH 1/4] feat: better diagnostic report for HarmonyImportSideEffectDependency --- crates/node_binding/binding.d.ts | 2 + .../rspack_binding_values/src/rspack_error.rs | 2 + crates/rspack_binding_values/src/stats.rs | 2 + .../src/compiler/make/repair/factorize.rs | 2 +- .../src/dependency/dependency_trait.rs | 5 ++ crates/rspack_core/src/stats.rs | 4 ++ crates/rspack_error/src/diagnostic.rs | 66 +++++++++++++++++++ .../esm/harmony_import_dependency.rs | 9 ++- ...harmony_export_dependency_parser_plugin.rs | 2 + ...harmony_import_dependency_parser_plugin.rs | 2 + .../__snapshots__/StatsOutput.test.js.snap | 6 +- .../stats.err | 4 +- .../stats.err | 2 +- .../factorize/cannot-resolve/stats.err | 2 +- .../factorize/empty-dependency/stats.err | 2 +- .../stats.err | 2 +- .../stats.err | 2 +- .../resolve-extensions-error/stats.err | 6 +- .../tests/errorCases/error-map.js | 1 + .../tests/errorCases/error-test-push.js | 1 + .../tests/errorCases/error-test-splice-2.js | 1 + .../tests/errorCases/resolve-fail-esm.js | 1 + 22 files changed, 111 insertions(+), 15 deletions(-) diff --git a/crates/node_binding/binding.d.ts b/crates/node_binding/binding.d.ts index 3a8308424995..e4e531eab6c0 100644 --- a/crates/node_binding/binding.d.ts +++ b/crates/node_binding/binding.d.ts @@ -566,6 +566,7 @@ export interface JsRspackError { name: string message: string moduleIdentifier?: string + loc?: string file?: string stack?: string hideStack?: boolean @@ -654,6 +655,7 @@ export interface JsStatsError { chunkName?: string chunkEntry?: boolean chunkInitial?: boolean + loc?: string file?: string moduleIdentifier?: string moduleName?: string diff --git a/crates/rspack_binding_values/src/rspack_error.rs b/crates/rspack_binding_values/src/rspack_error.rs index 6d629b64c770..33f3bb7f44ca 100644 --- a/crates/rspack_binding_values/src/rspack_error.rs +++ b/crates/rspack_binding_values/src/rspack_error.rs @@ -34,6 +34,7 @@ pub struct JsRspackError { pub name: String, pub message: String, pub module_identifier: Option, + pub loc: Option, pub file: Option, pub stack: Option, pub hide_stack: Option, @@ -50,6 +51,7 @@ impl JsRspackError { }), message: diagnostic.render_report(colored)?, module_identifier: diagnostic.module_identifier().map(|d| d.to_string()), + loc: diagnostic.format_location(), file: diagnostic.file().map(|f| f.to_string_lossy().to_string()), stack: diagnostic.stack(), hide_stack: diagnostic.hide_stack(), diff --git a/crates/rspack_binding_values/src/stats.rs b/crates/rspack_binding_values/src/stats.rs index cf3b2345a141..6b8cde4a1a37 100644 --- a/crates/rspack_binding_values/src/stats.rs +++ b/crates/rspack_binding_values/src/stats.rs @@ -17,6 +17,7 @@ pub struct JsStatsError { pub chunk_name: Option, pub chunk_entry: Option, pub chunk_initial: Option, + pub loc: Option, pub file: Option, pub module_identifier: Option<&'static str>, pub module_name: Option, @@ -34,6 +35,7 @@ impl From> for JsStatsError { module_identifier: stats.module_identifier, module_name: stats.module_name.map(|i| i.into_owned()), module_id: stats.module_id.map(|i| i.to_owned()), + loc: stats.loc, file: stats.file.map(|f| f.to_string_lossy().to_string()), chunk_name: stats.chunk_name, chunk_entry: stats.chunk_entry, diff --git a/crates/rspack_core/src/compiler/make/repair/factorize.rs b/crates/rspack_core/src/compiler/make/repair/factorize.rs index 4653d7f36838..9e271401ea75 100644 --- a/crates/rspack_core/src/compiler/make/repair/factorize.rs +++ b/crates/rspack_core/src/compiler/make/repair/factorize.rs @@ -127,7 +127,7 @@ impl Task for FactorizeTask { return Err(e); } let mut diagnostics = Vec::with_capacity(create_data.diagnostics.len() + 1); - diagnostics.push(e.into()); + diagnostics.push(Into::::into(e).with_loc(create_data.dependency.loc())); diagnostics.append(&mut create_data.diagnostics); // Continue bundling if `options.bail` set to `false`. Ok(vec![Box::new( diff --git a/crates/rspack_core/src/dependency/dependency_trait.rs b/crates/rspack_core/src/dependency/dependency_trait.rs index c1076b7eacdb..3e371ab1f468 100644 --- a/crates/rspack_core/src/dependency/dependency_trait.rs +++ b/crates/rspack_core/src/dependency/dependency_trait.rs @@ -3,6 +3,7 @@ use std::{any::Any, fmt::Debug}; use dyn_clone::{clone_trait_object, DynClone}; use rspack_collections::IdentifierSet; use rspack_error::Diagnostic; +use rspack_error::ErrorLocation; use rspack_util::ext::AsAny; use swc_core::ecma::atoms::Atom; @@ -66,6 +67,10 @@ pub trait Dependency: ConnectionState::Bool(true) } + fn loc(&self) -> Option { + None + } + fn span(&self) -> Option { None } diff --git a/crates/rspack_core/src/stats.rs b/crates/rspack_core/src/stats.rs index 45de7d58b317..de626d0bcc01 100644 --- a/crates/rspack_core/src/stats.rs +++ b/crates/rspack_core/src/stats.rs @@ -609,6 +609,7 @@ impl Stats<'_> { module_identifier: module_identifier.map(|i| i.as_str()), module_name, module_id: module_id.flatten(), + loc: d.format_location(), file: d.file().map(ToOwned::to_owned), chunk_name: chunk.and_then(|c| c.name.clone()), @@ -654,6 +655,7 @@ impl Stats<'_> { module_identifier: module_identifier.map(|i| i.as_str()), module_name, module_id: module_id.flatten(), + loc: d.format_location(), file: d.file().map(ToOwned::to_owned), chunk_name: chunk.and_then(|c| c.name.clone()), @@ -1254,6 +1256,7 @@ pub struct StatsError<'s> { pub module_identifier: Option<&'static str>, pub module_name: Option>, pub module_id: Option<&'s str>, + pub loc: Option, pub file: Option, pub chunk_name: Option, @@ -1271,6 +1274,7 @@ pub struct StatsWarning<'s> { pub module_identifier: Option<&'static str>, pub module_name: Option>, pub module_id: Option<&'s str>, + pub loc: Option, pub file: Option, pub chunk_name: Option, diff --git a/crates/rspack_error/src/diagnostic.rs b/crates/rspack_error/src/diagnostic.rs index 0e4342c483e3..a752ca977cd2 100644 --- a/crates/rspack_error/src/diagnostic.rs +++ b/crates/rspack_error/src/diagnostic.rs @@ -7,6 +7,7 @@ use std::{ use miette::{GraphicalTheme, IntoDiagnostic, MietteDiagnostic}; use rspack_collections::Identifier; +use swc_core::common::{SourceMap, Span}; use crate::{graphical::GraphicalReportHandler, Error}; @@ -61,10 +62,41 @@ impl fmt::Display for RspackSeverity { } } +#[derive(Debug, Clone)] +pub struct SourcePosition { + pub line: usize, + pub column: usize, +} + +#[derive(Debug, Clone)] +pub struct ErrorLocation { + pub start: SourcePosition, + pub end: SourcePosition, +} + +impl ErrorLocation { + pub fn new(span: Span, source_map: &SourceMap) -> Self { + let lo = source_map.lookup_char_pos(span.lo()); + let hi = source_map.lookup_char_pos(span.hi()); + + ErrorLocation { + start: SourcePosition { + line: lo.line, + column: lo.col_display, + }, + end: SourcePosition { + line: hi.line, + column: hi.col_display, + }, + } + } +} + #[derive(Debug, Clone)] pub struct Diagnostic { inner: Arc, module_identifier: Option, + loc: Option, file: Option, hide_stack: Option, chunk: Option, @@ -82,6 +114,7 @@ impl From for Diagnostic { Self { inner: Arc::new(value), module_identifier: None, + loc: None, file: None, hide_stack: None, chunk: None, @@ -108,6 +141,7 @@ impl Diagnostic { ) .into(), module_identifier: None, + loc: None, file: None, hide_stack: None, chunk: None, @@ -124,6 +158,7 @@ impl Diagnostic { ) .into(), module_identifier: None, + loc: None, file: None, hide_stack: None, chunk: None, @@ -164,6 +199,37 @@ impl Diagnostic { self } + pub fn format_location(&self) -> Option { + if let Some(loc) = &self.loc { + if loc.start.line == loc.end.line { + if loc.start.column == loc.end.column { + return Some(format!("{}:{}", loc.start.line, loc.start.column)); + } + + return Some(format!( + "{}:{}-{}", + loc.start.line, loc.start.column, loc.end.column + )); + } + + return Some(format!( + "{}:{}-{}:{}", + loc.start.line, loc.start.column, loc.end.line, loc.end.column + )); + } + + return None; + } + + pub fn loc(&self) -> Option { + self.loc.clone() + } + + pub fn with_loc(mut self, loc: Option) -> Self { + self.loc = loc; + self + } + pub fn file(&self) -> Option<&Path> { self.file.as_deref() } diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs index 9118f56b5928..b05f6b331e8c 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs @@ -12,8 +12,8 @@ use rspack_core::{ }; use rspack_core::{ModuleGraph, RuntimeSpec}; use rspack_error::miette::{MietteDiagnostic, Severity}; -use rspack_error::DiagnosticExt; use rspack_error::{Diagnostic, TraceableError}; +use rspack_error::{DiagnosticExt, ErrorLocation}; use swc_core::ecma::atoms::Atom; use super::create_resource_identifier_for_esm_dependency; @@ -44,6 +44,7 @@ pub struct HarmonyImportSideEffectDependency { pub request: Atom, pub source_order: i32, pub id: DependencyId, + pub loc: ErrorLocation, pub span: ErrorSpan, pub source_span: ErrorSpan, pub dependency_type: DependencyType, @@ -56,6 +57,7 @@ impl HarmonyImportSideEffectDependency { pub fn new( request: Atom, source_order: i32, + loc: ErrorLocation, span: ErrorSpan, source_span: ErrorSpan, dependency_type: DependencyType, @@ -68,6 +70,7 @@ impl HarmonyImportSideEffectDependency { id: DependencyId::new(), source_order, request, + loc, span, source_span, dependency_type, @@ -378,6 +381,10 @@ impl Dependency for HarmonyImportSideEffectDependency { &self.id } + fn loc(&self) -> Option { + Some(self.loc.clone()) + } + fn span(&self) -> Option { Some(self.span) } diff --git a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs index 9a7baaa049bf..4e1b9d042405 100644 --- a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs +++ b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs @@ -1,4 +1,5 @@ use rspack_core::{BoxDependency, ConstDependency, DependencyLocation, DependencyType, SpanExt}; +use rspack_error::ErrorLocation; use swc_core::atoms::Atom; use swc_core::common::Spanned; @@ -54,6 +55,7 @@ impl JavascriptParserPlugin for HarmonyExportDependencyParserPlugin { let side_effect_dep = HarmonyImportSideEffectDependency::new( source.clone(), parser.last_harmony_import_order, + ErrorLocation::new(statement.span(), &parser.source_map), statement.span().into(), statement.source_span().into(), DependencyType::EsmExport, diff --git a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs index 4760da447749..9c56cf4ecac8 100644 --- a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs +++ b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs @@ -1,4 +1,5 @@ use rspack_core::{ConstDependency, Dependency, DependencyType, ImportAttributes, SpanExt}; +use rspack_error::ErrorLocation; use swc_core::atoms::Atom; use swc_core::common::{Span, Spanned}; use swc_core::ecma::ast::{ @@ -72,6 +73,7 @@ impl JavascriptParserPlugin for HarmonyImportDependencyParserPlugin { let dependency = HarmonyImportSideEffectDependency::new( source.into(), parser.last_harmony_import_order, + ErrorLocation::new(import_decl.span, &parser.source_map), import_decl.span.into(), import_decl.src.span.into(), DependencyType::EsmImport, diff --git a/packages/rspack-test-tools/tests/__snapshots__/StatsOutput.test.js.snap b/packages/rspack-test-tools/tests/__snapshots__/StatsOutput.test.js.snap index 606d4cca1515..6a201e4ebcd6 100644 --- a/packages/rspack-test-tools/tests/__snapshots__/StatsOutput.test.js.snap +++ b/packages/rspack-test-tools/tests/__snapshots__/StatsOutput.test.js.snap @@ -225,7 +225,7 @@ Chunk Group cimanyd 337 bytes = cimanyd.js" `; exports[`statsOutput statsOutput/nonexistent-import-source-error should print correct stats for 1`] = ` -"ERROR in ./index.js +"ERROR in ./index.js 1:0-19 × Module not found: Can't resolve 'not-exist' in 'Xdir/nonexistent-import-source-error' ╭──── 1 │ import \\"not-exist\\"; @@ -385,7 +385,7 @@ exports[`statsOutput statsOutput/resolve-overflow-error should print correct sta "asset main.js 348 bytes [emitted] (name: main) ./index.js 51 bytes [built] [code generated] [1 error] -ERROR in ./index.js +ERROR in ./index.js 1:0-34 × Module not found: Can't resolve 'cycle-alias/a' in 'Xdir/resolve-overflow-error' ╭─[1:18] 1 │ import { a } from \\"cycle-alias/a\\"; @@ -402,7 +402,7 @@ exports[`statsOutput statsOutput/resolve-unexpected-exports-in-pkg-error should runtime modules 280 bytes 1 module ./index.js 39 bytes [built] [code generated] [1 error] -ERROR in ./index.js +ERROR in ./index.js 1:0-22 × Invalid \\"exports\\" target \\"../../index.js\\" defined for '.' in the package config Xdir/resolve-unexpected-exports-in-pkg-error/node_modules/pkg-a/package.json Rspack x.x.x compiled with 1 error in X s" diff --git a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-conflict/stats.err b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-conflict/stats.err index f24938554927..d1b273070332 100644 --- a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-conflict/stats.err +++ b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-conflict/stats.err @@ -1,4 +1,4 @@ -ERROR in ./node_modules/some-module/a.ts +ERROR in ./node_modules/some-module/a.ts 1:0-23 × Module not found: Can't resolve './b.js' in '/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-conflict/node_modules/some-module' ╭─[1:14] 1 │ export * from "./b.js"; @@ -8,7 +8,7 @@ ERROR in ./node_modules/some-module/a.ts @ ./node_modules/some-module/a.ts @ ./reexport.ts -ERROR in ./node_modules/some-module/a.ts +ERROR in ./node_modules/some-module/a.ts 2:0-23 × Module not found: Can't resolve './c.js' in '/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-conflict/node_modules/some-module' ╭─[2:14] 1 │ export * from "./b.js"; diff --git a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-import/stats.err b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-import/stats.err index 3ccd9b25a4da..0bfe301fd363 100644 --- a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-import/stats.err +++ b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-import/stats.err @@ -1,4 +1,4 @@ -ERROR in ./node_modules/some-module/a.ts +ERROR in ./node_modules/some-module/a.ts 1:0-23 × Module not found: Can't resolve './b.js' in '/tests/diagnosticsCases/factorize/cannot-resolve-with-concatenate-import/node_modules/some-module' ╭──── 1 │ export * from "./b.js"; diff --git a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve/stats.err b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve/stats.err index 5071ddf2e58d..f30ec1985653 100644 --- a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve/stats.err +++ b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/cannot-resolve/stats.err @@ -1,4 +1,4 @@ -ERROR in ./index.js +ERROR in ./index.js 1:0-12 × Module not found: Can't resolve './a' in '/tests/diagnosticsCases/factorize/cannot-resolve' ╭──── 1 │ import "./a" diff --git a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/empty-dependency/stats.err b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/empty-dependency/stats.err index 6a6a96ca4787..d80ded7633da 100644 --- a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/empty-dependency/stats.err +++ b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/empty-dependency/stats.err @@ -6,7 +6,7 @@ ERROR in ./index.js 2 │ import "" ╰──── -ERROR in ./index.js +ERROR in ./index.js 2:0-9 × Empty dependency: Expected a non-empty request ╭─[2:7] 1 │ require("") diff --git a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/fully-specified-resolve-suggestions/stats.err b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/fully-specified-resolve-suggestions/stats.err index 04f8f7370e07..6fccd347294e 100644 --- a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/fully-specified-resolve-suggestions/stats.err +++ b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/fully-specified-resolve-suggestions/stats.err @@ -1,4 +1,4 @@ -ERROR in ./index.js +ERROR in ./index.js 1:0-14 × Module not found: Can't resolve './foo' in '/tests/diagnosticsCases/factorize/fully-specified-resolve-suggestions' ╭──── 1 │ import "./foo" diff --git a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/prefer-relative-resolve-suggestions/stats.err b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/prefer-relative-resolve-suggestions/stats.err index defe0db122b2..fab35609577b 100644 --- a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/prefer-relative-resolve-suggestions/stats.err +++ b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/prefer-relative-resolve-suggestions/stats.err @@ -1,4 +1,4 @@ -ERROR in ./index.js +ERROR in ./index.js 1:0-15 × Module not found: Can't resolve 'foo.js' in '/tests/diagnosticsCases/factorize/prefer-relative-resolve-suggestions' ╭──── 1 │ import "foo.js" diff --git a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/resolve-extensions-error/stats.err b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/resolve-extensions-error/stats.err index 5fa63902f1de..3030f4764260 100644 --- a/packages/rspack-test-tools/tests/diagnosticsCases/factorize/resolve-extensions-error/stats.err +++ b/packages/rspack-test-tools/tests/diagnosticsCases/factorize/resolve-extensions-error/stats.err @@ -1,4 +1,4 @@ -ERROR in ./err/index.js +ERROR in ./err/index.js 1:0-21 × Module not found: Can't resolve '../a' in '/tests/diagnosticsCases/factorize/resolve-extensions-error/err' ╭──── 1 │ import a from '../a'; @@ -12,7 +12,7 @@ ERROR in ./err/index.js @ ./err/index.js -ERROR in ./index.js +ERROR in ./index.js 2:0-16 × Module not found: Can't resolve './test' in '/tests/diagnosticsCases/factorize/resolve-extensions-error' ╭─[2:7] 1 │ import './err'; @@ -26,7 +26,7 @@ ERROR in ./index.js 1. add the extension `".txt"` to `resolve.extensions` in your rspack configuration 2. use './test/index.txt' instead of './test' -ERROR in ./index.js +ERROR in ./index.js 3:0-20 × Module not found: Can't resolve './a' in '/tests/diagnosticsCases/factorize/resolve-extensions-error' ╭─[3:14] 1 │ import './err'; diff --git a/packages/rspack-test-tools/tests/errorCases/error-map.js b/packages/rspack-test-tools/tests/errorCases/error-map.js index 3e2ef7e234dd..19d4ea5590e2 100644 --- a/packages/rspack-test-tools/tests/errorCases/error-map.js +++ b/packages/rspack-test-tools/tests/errorCases/error-map.js @@ -24,6 +24,7 @@ module.exports = { Array [ Object { "index": 0, + "loc": "1:0-33", "message": " × Module not found: Can't resolve './answer' in 'packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm'\\n ╭────\\n 1 │ import { answer } from './answer'\\n · ──────────\\n ╰────\\n help: Did you mean './answer.js'?\\n \\n The request './answer' failed to resolve only because it was resolved as fully specified,\\n probably because the origin is strict EcmaScript Module,\\n e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '\\"type\\": \\"module\\"'.\\n \\n The extension in the request is mandatory for it to be fully specified.\\n Add the extension to the request.\\n", "moduleIdentifier": "javascript/esm|packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm/index.js", "name": "Error", diff --git a/packages/rspack-test-tools/tests/errorCases/error-test-push.js b/packages/rspack-test-tools/tests/errorCases/error-test-push.js index a8581db71891..77657d36b3c2 100644 --- a/packages/rspack-test-tools/tests/errorCases/error-test-push.js +++ b/packages/rspack-test-tools/tests/errorCases/error-test-push.js @@ -23,6 +23,7 @@ module.exports = { "stack": "Error: test push\\n at Object.fn (packages/rspack-test-tools/tests/errorCases/error-test-push.js:10:31)\\n at next (packages/rspack-lite-tapable/dist/index.js:530:25)\\n at AsyncSeriesHook.callAsyncStageRange (packages/rspack-lite-tapable/dist/index.js:550:9)\\n at AsyncSeriesHook.callAsync (packages/rspack-lite-tapable/dist/index.js:88:21)\\n at packages/rspack/dist/Compiler.js:458:41\\n at packages/rspack/dist/Compiler.js:525:23", }, Object { + "loc": "1:0-33", "message": " × Module not found: Can't resolve './answer' in 'packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm'\\n ╭────\\n 1 │ import { answer } from './answer'\\n · ──────────\\n ╰────\\n help: Did you mean './answer.js'?\\n \\n The request './answer' failed to resolve only because it was resolved as fully specified,\\n probably because the origin is strict EcmaScript Module,\\n e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '\\"type\\": \\"module\\"'.\\n \\n The extension in the request is mandatory for it to be fully specified.\\n Add the extension to the request.\\n", "moduleId": "./resolve-fail-esm/index.js", "moduleIdentifier": "javascript/esm|packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm/index.js", diff --git a/packages/rspack-test-tools/tests/errorCases/error-test-splice-2.js b/packages/rspack-test-tools/tests/errorCases/error-test-splice-2.js index 6491e84e3d95..302fbbe02e63 100644 --- a/packages/rspack-test-tools/tests/errorCases/error-test-splice-2.js +++ b/packages/rspack-test-tools/tests/errorCases/error-test-splice-2.js @@ -23,6 +23,7 @@ module.exports = { "stack": "Error: test splice\\n at Object.fn (packages/rspack-test-tools/tests/errorCases/error-test-splice-2.js:10:39)\\n at next (packages/rspack-lite-tapable/dist/index.js:530:25)\\n at AsyncSeriesHook.callAsyncStageRange (packages/rspack-lite-tapable/dist/index.js:550:9)\\n at AsyncSeriesHook.callAsync (packages/rspack-lite-tapable/dist/index.js:88:21)\\n at packages/rspack/dist/Compiler.js:458:41\\n at packages/rspack/dist/Compiler.js:525:23", }, Object { + "loc": "1:0-33", "message": " × Module not found: Can't resolve './answer' in 'packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm'\\n ╭────\\n 1 │ import { answer } from './answer'\\n · ──────────\\n ╰────\\n help: Did you mean './answer.js'?\\n \\n The request './answer' failed to resolve only because it was resolved as fully specified,\\n probably because the origin is strict EcmaScript Module,\\n e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '\\"type\\": \\"module\\"'.\\n \\n The extension in the request is mandatory for it to be fully specified.\\n Add the extension to the request.\\n", "moduleId": "./resolve-fail-esm/index.js", "moduleIdentifier": "javascript/esm|packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm/index.js", diff --git a/packages/rspack-test-tools/tests/errorCases/resolve-fail-esm.js b/packages/rspack-test-tools/tests/errorCases/resolve-fail-esm.js index 4f32cc201c14..9bfd0d4cfa9b 100644 --- a/packages/rspack-test-tools/tests/errorCases/resolve-fail-esm.js +++ b/packages/rspack-test-tools/tests/errorCases/resolve-fail-esm.js @@ -11,6 +11,7 @@ module.exports = { Object { "errors": Array [ Object { + "loc": "1:0-33", "message": " × Module not found: Can't resolve './answer' in 'packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm'\\n ╭────\\n 1 │ import { answer } from './answer'\\n · ──────────\\n ╰────\\n help: Did you mean './answer.js'?\\n \\n The request './answer' failed to resolve only because it was resolved as fully specified,\\n probably because the origin is strict EcmaScript Module,\\n e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '\\"type\\": \\"module\\"'.\\n \\n The extension in the request is mandatory for it to be fully specified.\\n Add the extension to the request.\\n", "moduleId": "./resolve-fail-esm/index.js", "moduleIdentifier": "javascript/esm|packages/rspack-test-tools/tests/fixtures/errors/resolve-fail-esm/index.js", From dac96c8dc43a859f70c0592f6a652b05329d539e Mon Sep 17 00:00:00 2001 From: shulaoda Date: Mon, 29 Jul 2024 05:44:58 +0800 Subject: [PATCH 2/4] chore: remove unnecessary --- crates/rspack_error/src/diagnostic.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rspack_error/src/diagnostic.rs b/crates/rspack_error/src/diagnostic.rs index a752ca977cd2..dbcdd3ee9ed8 100644 --- a/crates/rspack_error/src/diagnostic.rs +++ b/crates/rspack_error/src/diagnostic.rs @@ -218,7 +218,7 @@ impl Diagnostic { )); } - return None; + None } pub fn loc(&self) -> Option { From f5e7ce960cef802fbc38bb220cd9bd0230dd381f Mon Sep 17 00:00:00 2001 From: shulaoda Date: Tue, 30 Jul 2024 12:55:28 +0800 Subject: [PATCH 3/4] feat: impl more harmony dependencies --- crates/rspack_error/src/diagnostic.rs | 4 +- .../harmony_export_expression_dependency.rs | 52 +++++++++++++------ .../esm/harmony_export_header_dependency.rs | 32 +++++++----- ...ny_export_imported_specifier_dependency.rs | 19 ++++--- .../esm/harmony_import_dependency.rs | 3 +- .../harmony_import_specifier_dependency.rs | 45 ++++++++-------- .../hmr/harmony_accept_dependency.rs | 16 +++--- ...harmony_export_dependency_parser_plugin.rs | 44 ++++++---------- ...harmony_import_dependency_parser_plugin.rs | 24 ++++----- .../hot_module_replacement_plugin.rs | 7 ++- 10 files changed, 132 insertions(+), 114 deletions(-) diff --git a/crates/rspack_error/src/diagnostic.rs b/crates/rspack_error/src/diagnostic.rs index dbcdd3ee9ed8..2478227dd35e 100644 --- a/crates/rspack_error/src/diagnostic.rs +++ b/crates/rspack_error/src/diagnostic.rs @@ -62,13 +62,13 @@ impl fmt::Display for RspackSeverity { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy)] pub struct SourcePosition { pub line: usize, pub column: usize, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy)] pub struct ErrorLocation { pub start: SourcePosition, pub end: SourcePosition, diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_expression_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_expression_dependency.rs index fa227532c223..4e75cc9b4e56 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_expression_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_expression_dependency.rs @@ -2,11 +2,12 @@ use itertools::Itertools; use rspack_collections::{Identifier, IdentifierSet}; use rspack_core::{ property_access, AsContextDependency, AsModuleDependency, Compilation, Dependency, - DependencyLocation, DependencyType, ExportNameOrSpec, ExportsOfExportsSpec, ExportsSpec, + DependencyType, ErrorSpan, ExportNameOrSpec, ExportsOfExportsSpec, ExportsSpec, HarmonyExportInitFragment, ModuleGraph, RuntimeGlobals, RuntimeSpec, UsedName, DEFAULT_EXPORT, }; use rspack_core::{DependencyId, DependencyTemplate}; use rspack_core::{TemplateContext, TemplateReplaceSource}; +use rspack_error::ErrorLocation; use swc_core::atoms::Atom; use crate::parser_plugin::JS_DEFAULT_KEYWORD; @@ -19,26 +20,39 @@ pub enum DeclarationId { #[derive(Debug, Clone)] pub struct DeclarationInfo { - pub range: DependencyLocation, - pub prefix: String, - pub suffix: String, + range: ErrorSpan, + prefix: String, + suffix: String, +} + +impl DeclarationInfo { + pub fn new(range: ErrorSpan, prefix: String, suffix: String) -> Self { + Self { + range, + prefix, + suffix, + } + } } #[derive(Debug, Clone)] pub struct HarmonyExportExpressionDependency { - pub range: DependencyLocation, - pub range_stmt: DependencyLocation, - pub declaration: Option, - pub id: DependencyId, + id: DependencyId, + loc: ErrorLocation, + range: ErrorSpan, + range_stmt: ErrorSpan, + declaration: Option, } impl HarmonyExportExpressionDependency { pub fn new( - range: DependencyLocation, - range_stmt: DependencyLocation, + loc: ErrorLocation, + range: ErrorSpan, + range_stmt: ErrorSpan, declaration: Option, ) -> Self { Self { + loc, range, range_stmt, declaration, @@ -56,6 +70,10 @@ impl Dependency for HarmonyExportExpressionDependency { &self.id } + fn loc(&self) -> Option { + Some(self.loc) + } + fn get_exports(&self, _mg: &ModuleGraph) -> Option { Some(ExportsSpec { exports: ExportsOfExportsSpec::Array(vec![ExportNameOrSpec::String( @@ -116,8 +134,8 @@ impl DependencyTemplate for HarmonyExportExpressionDependency { DeclarationId::Id(id) => id, DeclarationId::Func(func) => { source.replace( - func.range.start(), - func.range.end(), + func.range.start, + func.range.end, &format!("{}{}{}", func.prefix, DEFAULT_EXPORT, func.suffix), None, ); @@ -151,8 +169,8 @@ impl DependencyTemplate for HarmonyExportExpressionDependency { } source.replace( - self.range_stmt.start(), - self.range.start(), + self.range_stmt.start, + self.range.start, "/* harmony default export */ ", None, ); @@ -207,12 +225,12 @@ impl DependencyTemplate for HarmonyExportExpressionDependency { }; source.replace( - self.range_stmt.start(), - self.range.start(), + self.range_stmt.start, + self.range.start, &format!("{}(", content), None, ); - source.replace(self.range.end(), self.range_stmt.end(), ");", None); + source.replace(self.range.end, self.range_stmt.end, ");", None); } } diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs index 4d39d0f20b09..a7f18f9a7696 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs @@ -1,21 +1,24 @@ use rspack_core::{ - AsContextDependency, AsModuleDependency, Dependency, DependencyId, DependencyLocation, - DependencyTemplate, DependencyType, TemplateContext, TemplateReplaceSource, + AsContextDependency, AsModuleDependency, Dependency, DependencyId, DependencyTemplate, + DependencyType, ErrorSpan, TemplateContext, TemplateReplaceSource, }; +use rspack_error::ErrorLocation; // Remove `export` label. // Before: `export const a = 1` // After: `const a = 1` #[derive(Debug, Clone)] pub struct HarmonyExportHeaderDependency { - pub range: Option, - pub range_stmt: DependencyLocation, - pub id: DependencyId, + id: DependencyId, + loc: ErrorLocation, + range: Option, + range_stmt: ErrorSpan, } impl HarmonyExportHeaderDependency { - pub fn new(range: Option, range_stmt: DependencyLocation) -> Self { + pub fn new(loc: ErrorLocation, range: Option, range_stmt: ErrorSpan) -> Self { Self { + loc, range, range_stmt, id: DependencyId::default(), @@ -24,12 +27,17 @@ impl HarmonyExportHeaderDependency { } impl Dependency for HarmonyExportHeaderDependency { - fn dependency_type(&self) -> &DependencyType { - &DependencyType::EsmExportHeader - } fn id(&self) -> &rspack_core::DependencyId { &self.id } + + fn loc(&self) -> Option { + Some(self.loc) + } + + fn dependency_type(&self) -> &DependencyType { + &DependencyType::EsmExportHeader + } } impl DependencyTemplate for HarmonyExportHeaderDependency { @@ -39,11 +47,11 @@ impl DependencyTemplate for HarmonyExportHeaderDependency { _code_generatable_context: &mut TemplateContext, ) { source.replace( - self.range_stmt.start(), + self.range_stmt.start, if let Some(range) = self.range.clone() { - range.start() + range.start } else { - self.range_stmt.end() + self.range_stmt.end }, "", None, diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_imported_specifier_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_imported_specifier_dependency.rs index 10d41a288f23..9e89aa91b6c3 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_imported_specifier_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_imported_specifier_dependency.rs @@ -16,7 +16,7 @@ use rspack_core::{ }; use rspack_error::{ miette::{MietteDiagnostic, Severity}, - Diagnostic, DiagnosticExt, TraceableError, + Diagnostic, DiagnosticExt, ErrorLocation, TraceableError, }; use rustc_hash::{FxHashSet as HashSet, FxHasher}; use swc_core::ecma::atoms::Atom; @@ -34,16 +34,17 @@ use super::{ #[derive(Debug, Clone)] pub struct HarmonyExportImportedSpecifierDependency { pub id: DependencyId, - pub source_order: i32, - pub request: Atom, pub ids: Vec, pub name: Option, - resource_identifier: String, - pub other_star_exports: Option>, + pub request: Atom, pub export_all: bool, - export_presence_mode: ExportPresenceMode, + pub source_order: i32, + pub other_star_exports: Option>, + loc: ErrorLocation, span: ErrorSpan, attributes: Option, + resource_identifier: String, + export_presence_mode: ExportPresenceMode, } impl HarmonyExportImportedSpecifierDependency { @@ -55,6 +56,7 @@ impl HarmonyExportImportedSpecifierDependency { name: Option, export_all: bool, other_star_exports: Option>, + loc: ErrorLocation, span: ErrorSpan, export_presence_mode: ExportPresenceMode, attributes: Option, @@ -70,6 +72,7 @@ impl HarmonyExportImportedSpecifierDependency { resource_identifier, export_all, other_star_exports, + loc, span, export_presence_mode, attributes, @@ -1055,6 +1058,10 @@ impl Dependency for HarmonyExportImportedSpecifierDependency { &self.id } + fn loc(&self) -> Option { + Some(self.loc) + } + fn span(&self) -> Option { Some(self.span) } diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs index b05f6b331e8c..b9d744f53e92 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_dependency.rs @@ -54,6 +54,7 @@ pub struct HarmonyImportSideEffectDependency { } impl HarmonyImportSideEffectDependency { + #[allow(clippy::too_many_arguments)] pub fn new( request: Atom, source_order: i32, @@ -382,7 +383,7 @@ impl Dependency for HarmonyImportSideEffectDependency { } fn loc(&self) -> Option { - Some(self.loc.clone()) + Some(self.loc) } fn span(&self) -> Option { diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_specifier_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_specifier_dependency.rs index 2f31f48743da..10fdc971c9bc 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_specifier_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_import_specifier_dependency.rs @@ -2,13 +2,13 @@ use rspack_collections::IdentifierSet; use rspack_core::{ create_exports_object_referenced, export_from_import, get_dependency_used_by_exports_condition, get_exports_type, AsContextDependency, ConnectionState, Dependency, DependencyCategory, - DependencyCondition, DependencyId, DependencyTemplate, DependencyType, ExportPresenceMode, - ExportsType, ExtendedReferencedExport, ImportAttributes, JavascriptParserOptions, - ModuleDependency, ModuleGraph, ReferencedExport, RuntimeSpec, TemplateContext, - TemplateReplaceSource, UsedByExports, + DependencyCondition, DependencyId, DependencyTemplate, DependencyType, ErrorSpan, + ExportPresenceMode, ExportsType, ExtendedReferencedExport, ImportAttributes, + JavascriptParserOptions, ModuleDependency, ModuleGraph, ReferencedExport, RuntimeSpec, + TemplateContext, TemplateReplaceSource, UsedByExports, }; use rspack_core::{property_access, ModuleReferenceOptions}; -use rspack_error::Diagnostic; +use rspack_error::{Diagnostic, ErrorLocation}; use rustc_hash::FxHashSet as HashSet; use swc_core::ecma::atoms::Atom; @@ -23,17 +23,17 @@ pub struct HarmonyImportSpecifierDependency { source_order: i32, shorthand: bool, asi_safe: bool, - start: u32, - end: u32, + loc: ErrorLocation, + span: ErrorSpan, ids: Vec, call: bool, direct_import: bool, used_by_exports: Option, - pub namespace_object_as_context: bool, referenced_properties_in_destructuring: Option>, resource_identifier: String, export_presence_mode: ExportPresenceMode, attributes: Option, + pub namespace_object_as_context: bool, } impl HarmonyImportSpecifierDependency { @@ -44,8 +44,8 @@ impl HarmonyImportSpecifierDependency { source_order: i32, shorthand: bool, asi_safe: bool, - start: u32, - end: u32, + loc: ErrorLocation, + span: ErrorSpan, ids: Vec, call: bool, direct_import: bool, @@ -62,8 +62,8 @@ impl HarmonyImportSpecifierDependency { source_order, shorthand, asi_safe, - start, - end, + loc, + span, ids, call, direct_import, @@ -144,9 +144,9 @@ impl DependencyTemplate for HarmonyImportSpecifierDependency { // TODO do this by PureExpressionDependency. let value = format!("/* \"{}\" unused */null", self.request); if self.shorthand { - source.insert(self.end, &format!(": {value}"), None); + source.insert(self.span.end, &format!(": {value}"), None); } else { - source.replace(self.start, self.end, &value, None) + source.replace(self.span.start, self.span.end, &value, None) } return; } @@ -203,9 +203,9 @@ impl DependencyTemplate for HarmonyImportSpecifierDependency { }; if self.shorthand { - source.insert(self.end, format!(": {export_expr}").as_str(), None); + source.insert(self.span.end, format!(": {export_expr}").as_str(), None); } else { - source.replace(self.start, self.end, export_expr.as_str(), None); + source.replace(self.span.start, self.span.end, export_expr.as_str(), None); } } @@ -219,15 +219,16 @@ impl Dependency for HarmonyImportSpecifierDependency { &self.id } - fn source_order(&self) -> Option { - Some(self.source_order) + fn loc(&self) -> Option { + Some(self.loc) } fn span(&self) -> Option { - Some(rspack_core::ErrorSpan { - start: self.start, - end: self.end, - }) + Some(self.span) + } + + fn source_order(&self) -> Option { + Some(self.source_order) } fn get_attributes(&self) -> Option<&ImportAttributes> { diff --git a/crates/rspack_plugin_javascript/src/dependency/hmr/harmony_accept_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/hmr/harmony_accept_dependency.rs index 66fab1bad54a..0df36b28c3a6 100644 --- a/crates/rspack_plugin_javascript/src/dependency/hmr/harmony_accept_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/hmr/harmony_accept_dependency.rs @@ -1,23 +1,21 @@ use rspack_core::{ import_statement, runtime_condition_expression, AsDependency, DependencyId, DependencyTemplate, - RuntimeCondition, TemplateContext, TemplateReplaceSource, + ErrorSpan, RuntimeCondition, TemplateContext, TemplateReplaceSource, }; use crate::dependency::get_import_emitted_runtime; #[derive(Debug, Clone)] pub struct HarmonyAcceptDependency { - start: u32, - end: u32, + range: ErrorSpan, has_callback: bool, dependency_ids: Vec, } impl HarmonyAcceptDependency { - pub fn new(start: u32, end: u32, has_callback: bool, dependency_ids: Vec) -> Self { + pub fn new(range: ErrorSpan, has_callback: bool, dependency_ids: Vec) -> Self { Self { - start, - end, + range, has_callback, dependency_ids, } @@ -93,18 +91,18 @@ impl DependencyTemplate for HarmonyAcceptDependency { if self.has_callback { source.insert( - self.start, + self.range.start, format!("function(__WEBPACK_OUTDATED_DEPENDENCIES__) {{\n{content}(").as_str(), None, ); source.insert( - self.end, + self.range.end, ")(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this)", None, ); } else { source.insert( - self.start, + self.range.start, format!(", function(){{\n{content}\n}}").as_str(), None, ); diff --git a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs index 4e1b9d042405..f84532cc1c60 100644 --- a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs +++ b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_export_dependency_parser_plugin.rs @@ -1,4 +1,4 @@ -use rspack_core::{BoxDependency, ConstDependency, DependencyLocation, DependencyType, SpanExt}; +use rspack_core::{BoxDependency, ConstDependency, DependencyType, ErrorSpan, SpanExt}; use rspack_error::ErrorLocation; use swc_core::atoms::Atom; use swc_core::common::Spanned; @@ -25,18 +25,9 @@ impl JavascriptParserPlugin for HarmonyExportDependencyParserPlugin { fn export(&self, parser: &mut JavascriptParser, statement: ExportLocal) -> Option { let span = statement.span(); let dep = HarmonyExportHeaderDependency::new( - statement.declaration_span().map(|span| { - DependencyLocation::new( - span.real_lo(), - span.real_hi(), - Some(parser.source_map.clone()), - ) - }), - DependencyLocation::new( - span.real_lo(), - span.real_hi(), - Some(parser.source_map.clone()), - ), + ErrorLocation::new(span, &parser.source_map), + statement.declaration_span().map(|span| span.into()), + span.into(), ); parser.presentational_dependencies.push(Box::new(dep)); Some(true) @@ -91,6 +82,7 @@ impl JavascriptParserPlugin for HarmonyExportDependencyParserPlugin { Some(export_name.clone()), false, None, + ErrorLocation::new(statement.span(), &parser.source_map), statement.span().into(), HarmonyExportImportedSpecifierDependency::create_export_presence_mode( parser.javascript_options, @@ -131,6 +123,7 @@ impl JavascriptParserPlugin for HarmonyExportDependencyParserPlugin { export_name.cloned(), local_id.is_some(), star_exports, + ErrorLocation::new(statement.span(), &parser.source_map), statement.span().into(), HarmonyExportImportedSpecifierDependency::create_export_presence_mode( parser.javascript_options, @@ -152,17 +145,10 @@ impl JavascriptParserPlugin for HarmonyExportDependencyParserPlugin { ) -> Option { let expr_span = expr.span(); let statement_span = statement.span(); - let dep = HarmonyExportExpressionDependency::new( - DependencyLocation::new( - expr_span.real_lo(), - expr_span.real_hi(), - Some(parser.source_map.clone()), - ), - DependencyLocation::new( - statement_span.real_lo(), - statement_span.real_hi(), - Some(parser.source_map.clone()), - ), + let dep: HarmonyExportExpressionDependency = HarmonyExportExpressionDependency::new( + ErrorLocation::new(statement.span(), &parser.source_map), + ErrorSpan::new(expr_span.real_lo(), expr_span.real_hi()), + ErrorSpan::new(statement_span.real_lo(), statement_span.real_hi()), match expr { ExportDefaultExpression::FnDecl(f) => { let start = f.span().real_lo(); @@ -171,14 +157,14 @@ impl JavascriptParserPlugin for HarmonyExportDependencyParserPlugin { } else { f.function.body.span().real_lo() }; - Some(DeclarationId::Func(DeclarationInfo { - range: DependencyLocation::new(start, end, Some(parser.source_map.clone())), - prefix: format!( + Some(DeclarationId::Func(DeclarationInfo::new( + ErrorSpan::new(start, end), + format!( "{}function{} ", if f.function.is_async { "async " } else { "" }, if f.function.is_generator { "*" } else { "" }, ), - suffix: format!( + format!( r#"({}"#, if f.function.params.is_empty() { ") " @@ -186,7 +172,7 @@ impl JavascriptParserPlugin for HarmonyExportDependencyParserPlugin { "" } ), - })) + ))) } ExportDefaultExpression::ClassDecl(c) => c .ident diff --git a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs index 9c56cf4ecac8..58489f1b3c96 100644 --- a/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs +++ b/crates/rspack_plugin_javascript/src/parser_plugin/harmony_import_dependency_parser_plugin.rs @@ -140,8 +140,8 @@ impl JavascriptParserPlugin for HarmonyImportDependencyParserPlugin { settings.source_order, parser.in_short_hand, !parser.is_asi_position(ident.span_lo()), - ident.span.real_lo(), - ident.span.real_hi(), + ErrorLocation::new(ident.span(), &parser.source_map), + ident.span.into(), settings.ids, parser.in_tagged_template_tag, true, @@ -189,14 +189,14 @@ impl JavascriptParserPlugin for HarmonyImportDependencyParserPlugin { let settings = HarmonySpecifierData::downcast(tag_info.data.clone()?); let non_optional_members = get_non_optional_part(members, members_optionals); - let (start, end) = if members.len() > non_optional_members.len() { + let span = if members.len() > non_optional_members.len() { let expr = get_non_optional_member_chain_from_expr( callee, (members.len() - non_optional_members.len()) as i32, ); - (expr.span().real_lo(), expr.span().real_hi()) + expr.span() } else { - (callee.span().real_lo(), callee.span().real_hi()) + callee.span() }; let mut ids = settings.ids; ids.extend(non_optional_members.iter().cloned()); @@ -207,8 +207,8 @@ impl JavascriptParserPlugin for HarmonyImportDependencyParserPlugin { settings.source_order, false, !parser.is_asi_position(call_expr.span_lo()), - start, - end, + ErrorLocation::new(span, &parser.source_map), + span.into(), ids, true, direct_import, @@ -254,14 +254,14 @@ impl JavascriptParserPlugin for HarmonyImportDependencyParserPlugin { let settings = HarmonySpecifierData::downcast(tag_info.data.clone()?); let non_optional_members = get_non_optional_part(members, members_optionals); - let (start, end) = if members.len() > non_optional_members.len() { + let span = if members.len() > non_optional_members.len() { let expr = get_non_optional_member_chain_from_member( member_expr, (members.len() - non_optional_members.len()) as i32, ); - (expr.span().real_lo(), expr.span().real_hi()) + expr.span() } else { - (member_expr.span.real_lo(), member_expr.span.real_hi()) + member_expr.span() }; let mut ids = settings.ids; ids.extend(non_optional_members.iter().cloned()); @@ -271,8 +271,8 @@ impl JavascriptParserPlugin for HarmonyImportDependencyParserPlugin { settings.source_order, false, !parser.is_asi_position(member_expr.span_lo()), - start, - end, + ErrorLocation::new(span, &parser.source_map), + span.into(), ids, false, false, // x.xx() diff --git a/crates/rspack_plugin_javascript/src/parser_plugin/hot_module_replacement_plugin.rs b/crates/rspack_plugin_javascript/src/parser_plugin/hot_module_replacement_plugin.rs index 2d22c9f196c7..7e18e39a0f9f 100644 --- a/crates/rspack_plugin_javascript/src/parser_plugin/hot_module_replacement_plugin.rs +++ b/crates/rspack_plugin_javascript/src/parser_plugin/hot_module_replacement_plugin.rs @@ -81,11 +81,11 @@ impl<'parser> JavascriptParser<'parser> { if self.build_meta.esm && !call_expr.args.is_empty() { let dependency_ids = dependencies.iter().map(|dep| *dep.id()).collect::>(); if let Some(callback_arg) = call_expr.args.get(1) { + let span = callback_arg.span(); self .presentational_dependencies .push(Box::new(HarmonyAcceptDependency::new( - callback_arg.span().real_lo(), - callback_arg.span().real_hi(), + span.into(), true, dependency_ids, ))); @@ -93,8 +93,7 @@ impl<'parser> JavascriptParser<'parser> { self .presentational_dependencies .push(Box::new(HarmonyAcceptDependency::new( - call_expr.span().real_hi() - 1, - 0, + ErrorSpan::new(call_expr.span().real_hi() - 1, 0), false, dependency_ids, ))); From 5d7c6d0a4167bec4552d34794fbf667c85b31d17 Mon Sep 17 00:00:00 2001 From: shulaoda Date: Tue, 30 Jul 2024 13:32:16 +0800 Subject: [PATCH 4/4] chore: remove unnecessary code --- crates/rspack_error/src/diagnostic.rs | 2 +- .../src/dependency/esm/harmony_export_header_dependency.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/rspack_error/src/diagnostic.rs b/crates/rspack_error/src/diagnostic.rs index 2478227dd35e..104b54ffa675 100644 --- a/crates/rspack_error/src/diagnostic.rs +++ b/crates/rspack_error/src/diagnostic.rs @@ -222,7 +222,7 @@ impl Diagnostic { } pub fn loc(&self) -> Option { - self.loc.clone() + self.loc } pub fn with_loc(mut self, loc: Option) -> Self { diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs index a7f18f9a7696..9914a772617f 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/harmony_export_header_dependency.rs @@ -48,7 +48,7 @@ impl DependencyTemplate for HarmonyExportHeaderDependency { ) { source.replace( self.range_stmt.start, - if let Some(range) = self.range.clone() { + if let Some(range) = self.range { range.start } else { self.range_stmt.end