Skip to content

Commit 1c07942

Browse files
committed
refactor(parser): pass SourceType to ModuleRecordBuilder (#17610)
Passing `SourceType` to `ModuleRecordBuilder`, so it can manage its errors itself. Before all errors were collected and later checked if this is a typescript file. Now it will skip the generation of the diagnostic (performance). This refactoring is needed for TS error 1363 (see downstream PR), where we WANT diagnostics for typescript files
1 parent c9b5d7d commit 1c07942

3 files changed

Lines changed: 13 additions & 8 deletions

File tree

crates/oxc_parser/src/lib.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ impl<'a> ParserImpl<'a> {
418418
state: ParserState::new(),
419419
ctx: Self::default_context(source_type, options),
420420
ast: AstBuilder::new(allocator),
421-
module_record_builder: ModuleRecordBuilder::new(allocator),
421+
module_record_builder: ModuleRecordBuilder::new(allocator, source_type),
422422
is_ts: source_type.is_typescript(),
423423
}
424424
}
@@ -466,13 +466,11 @@ impl<'a> ParserImpl<'a> {
466466
}
467467
let (module_record, module_record_errors) = self.module_record_builder.build();
468468
if errors.len() != 1 {
469-
errors.reserve(self.lexer.errors.len() + self.errors.len());
469+
errors
470+
.reserve(self.lexer.errors.len() + self.errors.len() + module_record_errors.len());
470471
errors.extend(self.lexer.errors);
471472
errors.extend(self.errors);
472-
// Skip checking for exports in TypeScript {
473-
if !self.source_type.is_typescript() {
474-
errors.extend(module_record_errors);
475-
}
473+
errors.extend(module_record_errors);
476474
}
477475
let irregular_whitespaces =
478476
self.lexer.trivia_builder.irregular_whitespaces.into_boxed_slice();

crates/oxc_parser/src/module_record.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ use crate::diagnostics;
99

1010
pub struct ModuleRecordBuilder<'a> {
1111
allocator: &'a Allocator,
12+
source_type: SourceType,
1213
module_record: ModuleRecord<'a>,
1314
export_entries: Vec<'a, ExportEntry<'a>>,
1415
exported_bindings_duplicated: Vec<'a, NameSpan<'a>>,
1516
}
1617

1718
impl<'a> ModuleRecordBuilder<'a> {
18-
pub fn new(allocator: &'a Allocator) -> Self {
19+
pub fn new(allocator: &'a Allocator, source_type: SourceType) -> Self {
1920
Self {
2021
allocator,
22+
source_type,
2123
module_record: ModuleRecord::new(allocator),
2224
export_entries: Vec::new_in(allocator),
2325
exported_bindings_duplicated: Vec::new_in(allocator),
@@ -35,6 +37,11 @@ impl<'a> ModuleRecordBuilder<'a> {
3537
pub fn errors(&self) -> std::vec::Vec<OxcDiagnostic> {
3638
let mut errors = vec![];
3739

40+
// Skip checking for exports in TypeScript
41+
if self.source_type.is_typescript() {
42+
return errors;
43+
}
44+
3845
let module_record = &self.module_record;
3946

4047
// It is a Syntax Error if the ExportedNames of ModuleItemList contains any duplicate entries.

tasks/track_memory_allocations/allocs_parser.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ File | File size || Sys allocs | Sys reallocs |
22
-------------------------------------------------------------------------------------------------------------------------------------------
33
checker.ts | 2.92 MB || 9672 | 21 || 267681 | 22847
44

5-
cal.com.tsx | 1.06 MB || 2211 | 62 || 138162 | 13699
5+
cal.com.tsx | 1.06 MB || 1083 | 49 || 138162 | 13699
66

77
RadixUIAdoptionSection.jsx | 2.52 kB || 1 | 0 || 365 | 66
88

0 commit comments

Comments
 (0)