Skip to content

Commit ae6f2f3

Browse files
authored
fix: use parse meta to collect ts info (#11083)
1 parent 81adb7f commit ae6f2f3

File tree

21 files changed

+119
-41
lines changed

21 files changed

+119
-41
lines changed

crates/rspack_binding_api/src/plugins/js_loader/context.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ impl TryFrom<&mut LoaderContext<RunnerContext>> for JsLoaderContext {
141141
Some(c) => Either::B(c.to_owned().into_bytes().into()),
142142
None => Either::A(Null),
143143
},
144-
parse_meta: cx.parse_meta.clone().into_iter().collect(),
144+
// Since js side only set parse meta, and can't read it, so we can use Default here to only bring the
145+
// set values from js side to rust side.
146+
parse_meta: Default::default(),
145147
additional_data: cx
146148
.additional_data()
147149
.and_then(|data| data.get::<ThreadsafeJsValueRef<Unknown>>())

crates/rspack_binding_api/src/plugins/js_loader/scheduler.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,12 @@ pub(crate) fn merge_loader_context(
180180
})
181181
.collect();
182182
to.loader_index = from.loader_index;
183-
to.parse_meta = from.parse_meta.into_iter().collect();
183+
to.parse_meta.extend(
184+
from
185+
.parse_meta
186+
.into_iter()
187+
.map(|(k, v)| (k, Box::new(v) as _)),
188+
);
184189

185190
Ok(())
186191
}

crates/rspack_core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pub mod reserved_names;
102102

103103
use rspack_cacheable::{cacheable, with::AsPreset};
104104
pub use rspack_loader_runner::{
105-
get_scheme, parse_resource, AdditionalData, ResourceData, ResourceParsedData, Scheme,
105+
get_scheme, parse_resource, AdditionalData, ParseMeta, ResourceData, ResourceParsedData, Scheme,
106106
BUILTIN_LOADER_PREFIX,
107107
};
108108
pub use rspack_macros::{impl_runtime_module, impl_source_map_config};

crates/rspack_core/src/parser_and_generator.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use rspack_cacheable::{
77
};
88
use rspack_error::{Result, TWithDiagnosticArray};
99
use rspack_hash::RspackHashDigest;
10-
use rspack_loader_runner::{AdditionalData, ResourceData};
10+
use rspack_loader_runner::{AdditionalData, ParseMeta, ResourceData};
1111
use rspack_sources::BoxSource;
1212
use rspack_util::{ext::AsAny, source_map::SourceMapKind};
1313
use rustc_hash::{FxHashMap, FxHashSet};
@@ -35,7 +35,7 @@ pub struct ParseContext<'a> {
3535
pub resource_data: &'a ResourceData,
3636
pub compiler_options: &'a CompilerOptions,
3737
pub additional_data: Option<AdditionalData>,
38-
pub parse_meta: FxHashMap<String, String>,
38+
pub parse_meta: ParseMeta,
3939
pub build_info: &'a mut BuildInfo,
4040
pub build_meta: &'a mut BuildMeta,
4141
}
@@ -49,6 +49,8 @@ pub struct CollectedTypeScriptInfo {
4949
pub exported_enums: FxHashMap<Atom, TSEnumValue>,
5050
}
5151

52+
pub const COLLECTED_TYPESCRIPT_INFO_PARSE_META_KEY: &str = "rspack-collected-ts-info";
53+
5254
#[cacheable]
5355
#[derive(Debug, Default, Clone)]
5456
pub struct TSEnumValue(

crates/rspack_loader_runner/src/content.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use rspack_cacheable::{
1212
};
1313
use rspack_error::{Error, Result, ToStringResultToRspackResultExt};
1414
use rspack_paths::Utf8PathBuf;
15+
use rustc_hash::FxHashMap;
1516

1617
use crate::{get_scheme, Scheme};
1718

@@ -290,3 +291,4 @@ impl DescriptionData {
290291
}
291292

292293
pub type AdditionalData = anymap::Map<dyn CloneAny + Send + Sync>;
294+
pub type ParseMeta = FxHashMap<String, Box<dyn CloneAny + Send + Sync>>;

crates/rspack_loader_runner/src/context.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ use derive_more::Debug;
44
use rspack_error::Diagnostic;
55
use rspack_paths::Utf8Path;
66
use rspack_sources::SourceMap;
7-
use rustc_hash::{FxHashMap, FxHashSet as HashSet};
7+
use rustc_hash::FxHashSet as HashSet;
88

99
use crate::{
10-
loader::LoaderItemList, AdditionalData, Content, LoaderItem, LoaderRunnerPlugin, ResourceData,
10+
loader::LoaderItemList, AdditionalData, Content, LoaderItem, LoaderRunnerPlugin, ParseMeta,
11+
ResourceData,
1112
};
1213

1314
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
@@ -38,7 +39,7 @@ pub struct LoaderContext<Context> {
3839
pub resource_data: Arc<ResourceData>,
3940
#[debug(skip)]
4041
pub context: Context,
41-
pub parse_meta: FxHashMap<String, String>,
42+
pub parse_meta: ParseMeta,
4243

4344
pub(crate) content: Option<Content>,
4445
pub(crate) source_map: Option<SourceMap>,

crates/rspack_loader_runner/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ mod plugin;
88
mod runner;
99
mod scheme;
1010

11-
pub use content::{AdditionalData, Content, DescriptionData, ResourceData};
11+
pub use content::{AdditionalData, Content, DescriptionData, ParseMeta, ResourceData};
1212
pub use context::{LoaderContext, State};
1313
pub use loader::{parse_resource, DisplayWithSuffix, Loader, LoaderItem, ResourceParsedData};
1414
pub use plugin::LoaderRunnerPlugin;

crates/rspack_loader_runner/src/runner.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{fmt::Debug, path::PathBuf, sync::Arc};
33
use rspack_error::{error, IntoTWithDiagnosticArray, Result, TWithDiagnosticArray};
44
use rspack_fs::ReadableFileSystem;
55
use rspack_sources::SourceMap;
6-
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};
6+
use rustc_hash::FxHashSet as HashSet;
77
use tokio::task::spawn_blocking;
88
use tracing::{info_span, Instrument};
99

@@ -12,6 +12,7 @@ use crate::{
1212
context::{LoaderContext, State},
1313
loader::{Loader, LoaderItem},
1414
plugin::LoaderRunnerPlugin,
15+
ParseMeta,
1516
};
1617

1718
impl<Context> LoaderContext<Context> {
@@ -215,7 +216,7 @@ pub struct LoaderResult {
215216
pub content: Content,
216217
pub source_map: Option<SourceMap>,
217218
pub additional_data: Option<AdditionalData>,
218-
pub parse_meta: HashMap<String, String>,
219+
pub parse_meta: ParseMeta,
219220
}
220221

221222
impl<Context> TryFrom<LoaderContext<Context>> for TWithDiagnosticArray<LoaderResult> {

crates/rspack_loader_swc/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use options::SwcCompilerOptionsWithAdditional;
1111
pub use options::SwcLoaderJsOptions;
1212
pub use plugin::SwcLoaderPlugin;
1313
use rspack_cacheable::{cacheable, cacheable_dyn};
14-
use rspack_core::{AdditionalData, Mode, RunnerContext};
14+
use rspack_core::{Mode, RunnerContext, COLLECTED_TYPESCRIPT_INFO_PARSE_META_KEY};
1515
use rspack_error::{miette, Diagnostic, Result};
1616
use rspack_javascript_compiler::{JavaScriptCompiler, TransformOutput};
1717
use rspack_loader_runner::{Identifiable, Identifier, Loader, LoaderContext};
@@ -124,14 +124,14 @@ impl SwcLoader {
124124
);
125125
}
126126

127-
let mut finish = (code, map, None);
128127
if let Some(collected_ts_info) = collected_ts_info {
129-
let mut additional_data = AdditionalData::new();
130-
additional_data.insert(collected_ts_info);
131-
finish.2 = Some(additional_data);
128+
loader_context.parse_meta.insert(
129+
COLLECTED_TYPESCRIPT_INFO_PARSE_META_KEY.to_string(),
130+
Box::new(collected_ts_info),
131+
);
132132
}
133133

134-
loader_context.finish_with(finish);
134+
loader_context.finish_with((code, map));
135135

136136
Ok(())
137137
}

crates/rspack_plugin_extract_css/src/parser_plugin.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ pub struct PluginCssExtractParserPlugin {
2525

2626
impl JavascriptParserPlugin for PluginCssExtractParserPlugin {
2727
fn finish(&self, parser: &mut JavascriptParser) -> Option<bool> {
28-
let deps = if let Some(data_str) = parser.parse_meta.get(PLUGIN_NAME) {
29-
if let Some(deps) = self.cache.get(data_str) {
28+
let deps = if let Some(data_str) = parser.parse_meta.remove(PLUGIN_NAME)
29+
&& let Ok(data_str) = (data_str as Box<dyn std::any::Any>)
30+
.downcast::<String>()
31+
.map(|i| *i)
32+
{
33+
if let Some(deps) = self.cache.get(&data_str) {
3034
deps.clone()
31-
} else if let Ok(data) = serde_json::from_str::<Vec<CssExtractJsonData>>(data_str) {
35+
} else if let Ok(data) = serde_json::from_str::<Vec<CssExtractJsonData>>(&data_str) {
3236
let deps = data
3337
.iter()
3438
.enumerate()
@@ -65,7 +69,7 @@ impl JavascriptParserPlugin for PluginCssExtractParserPlugin {
6569
},
6670
)
6771
.collect::<Vec<_>>();
68-
self.cache.insert(data_str.clone(), deps.clone());
72+
self.cache.insert(data_str, deps.clone());
6973
parser.build_info.strict = true;
7074
deps
7175
} else {

0 commit comments

Comments
 (0)