Skip to content

Commit 2542f32

Browse files
committed
feat: add sync feature
1 parent ecc160d commit 2542f32

File tree

5 files changed

+23
-21
lines changed

5 files changed

+23
-21
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ typescript = ["transforms", "swc_ecma_transforms_typescript"]
2929
utils = ["swc_ecma_utils"]
3030
view = ["dprint-swc-ext/view"]
3131
visit = ["swc_ecma_visit", "swc_visit", "swc_visit_macros", "swc_macros_common"]
32+
sync = ["swc_common/concurrent"]
3233

3334
[dependencies]
3435
base64 = { version = "0.21.6", optional = true }

src/source_map.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

3-
use std::rc::Rc;
4-
3+
use crate::swc::common::sync::Lrc;
54
use crate::swc::common::FileName;
65
use crate::swc::common::SourceFile;
76
use crate::ModuleSpecifier;
@@ -25,30 +24,30 @@ impl IntoSwcFileName for String {
2524

2625
#[derive(Clone, Default)]
2726
pub struct SourceMap {
28-
inner: Rc<crate::swc::common::SourceMap>,
27+
inner: Lrc<crate::swc::common::SourceMap>,
2928
}
3029

3130
impl SourceMap {
3231
pub fn single(file_name: impl IntoSwcFileName, source: String) -> Self {
3332
let map = Self::default();
3433
map.inner.new_source_file(
35-
Rc::new(IntoSwcFileName::into_file_name(file_name)),
34+
Lrc::new(IntoSwcFileName::into_file_name(file_name)),
3635
source,
3736
);
3837
map
3938
}
4039

41-
pub fn inner(&self) -> &Rc<crate::swc::common::SourceMap> {
40+
pub fn inner(&self) -> &Lrc<crate::swc::common::SourceMap> {
4241
&self.inner
4342
}
4443

4544
pub fn new_source_file(
4645
&self,
4746
file_name: impl IntoSwcFileName,
4847
source: String,
49-
) -> Rc<SourceFile> {
48+
) -> Lrc<SourceFile> {
5049
self.inner.new_source_file(
51-
Rc::new(IntoSwcFileName::into_file_name(file_name)),
50+
Lrc::new(IntoSwcFileName::into_file_name(file_name)),
5251
source,
5352
)
5453
}

src/transpiling/mod.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

33
use std::borrow::Cow;
4-
use std::rc::Rc;
54
use std::sync::Arc;
65

76
use deno_media_type::MediaType;
@@ -14,6 +13,7 @@ use crate::emit;
1413
use crate::swc::ast::Program;
1514
use crate::swc::common::comments::SingleThreadedComments;
1615
use crate::swc::common::errors::Diagnostic as SwcDiagnostic;
16+
use crate::swc::common::sync::{Lock, Lrc};
1717
use crate::swc::ecma_visit::visit_mut_pass;
1818
use crate::swc::parser::error::SyntaxError;
1919
use crate::swc::transforms::fixer;
@@ -39,7 +39,6 @@ use crate::ProgramRef;
3939
use crate::SourceMap;
4040

4141
use deno_error::JsError;
42-
use std::cell::RefCell;
4342

4443
mod jsx_precompile;
4544
mod transforms;
@@ -53,7 +52,7 @@ pub enum TranspileResult {
5352
///
5453
/// This is a performance issue and you should strive to get an `Owned` result.
5554
Cloned(EmittedSourceText),
56-
/// The emit occured consuming the `ParsedSource` without cloning.
55+
/// The emit occurred consuming the `ParsedSource` without cloning.
5756
Owned(EmittedSourceText),
5857
}
5958

@@ -174,8 +173,8 @@ impl Default for TranspileOptions {
174173
impl TranspileOptions {
175174
fn as_tsx_config(&self) -> typescript::TsxConfig {
176175
typescript::TsxConfig {
177-
pragma: Some(Rc::new(self.jsx_factory.clone())),
178-
pragma_frag: Some(Rc::new(self.jsx_fragment_factory.clone())),
176+
pragma: Some(Lrc::new(self.jsx_factory.clone())),
177+
pragma_frag: Some(Lrc::new(self.jsx_fragment_factory.clone())),
179178
}
180179
}
181180

@@ -196,7 +195,7 @@ impl TranspileOptions {
196195
},
197196
// no need for this to be false because we treat all files as modules
198197
no_empty_export: true,
199-
// we don't suport this, so leave it as-is so it errors in v8
198+
// we don't support this, so leave it as-is so it errors in v8
200199
import_export_assign_config:
201200
typescript::TsImportExportAssignConfig::Preserve,
202201
// Do not opt into swc's optimization to inline enum member values
@@ -619,7 +618,7 @@ fn convert_script_module_to_swc_script(
619618

620619
#[derive(Default, Clone)]
621620
struct DiagnosticCollector {
622-
diagnostics_cell: Rc<RefCell<Vec<SwcDiagnostic>>>,
621+
diagnostics: Lrc<Lock<Vec<SwcDiagnostic>>>,
623622
}
624623

625624
impl DiagnosticCollector {
@@ -635,7 +634,8 @@ impl DiagnosticCollector {
635634
impl crate::swc::common::errors::Emitter for DiagnosticCollector {
636635
fn emit(&mut self, db: &crate::swc::common::errors::DiagnosticBuilder<'_>) {
637636
use std::ops::Deref;
638-
self.diagnostics_cell.borrow_mut().push(db.deref().clone());
637+
let mut diagnostics = self.diagnostics.lock();
638+
diagnostics.push(db.deref().clone());
639639
}
640640
}
641641

@@ -720,8 +720,8 @@ pub fn fold_program<'a>(
720720
Some(comments),
721721
#[allow(deprecated)]
722722
react::Options {
723-
pragma: Some(Rc::new(options.jsx_factory.clone())),
724-
pragma_frag: Some(Rc::new(options.jsx_fragment_factory.clone())),
723+
pragma: Some(Lrc::new(options.jsx_factory.clone())),
724+
pragma_frag: Some(Lrc::new(options.jsx_fragment_factory.clone())),
725725
// This will use `Object.assign()` instead of the `_extends` helper
726726
// when spreading props (Note: this property is deprecated)
727727
use_builtins: Some(true),
@@ -755,7 +755,7 @@ pub fn fold_program<'a>(
755755
);
756756

757757
let emitter = DiagnosticCollector::default();
758-
let diagnostics_cell = emitter.diagnostics_cell.clone();
758+
let diagnostics_cell = emitter.diagnostics.clone();
759759
let handler = emitter.into_handler();
760760
let result = crate::swc::common::errors::HANDLER.set(&handler, || {
761761
helpers::HELPERS

src/transpiling/transforms.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ mod test {
288288
use crate::swc::ast::Module;
289289
use crate::swc::codegen::text_writer::JsWriter;
290290
use crate::swc::codegen::Node;
291+
use crate::swc::common::sync::Lrc;
291292
use crate::swc::common::FileName;
292293
use crate::swc::common::SourceMap;
293294
use crate::swc::ecma_visit::Fold;
@@ -499,9 +500,9 @@ mod test {
499500
}
500501

501502
fn parse(src: &str) -> (Rc<SourceMap>, Module) {
502-
let source_map = Rc::new(SourceMap::default());
503+
let source_map = Lrc::new(SourceMap::default());
503504
let source_file = source_map.new_source_file(
504-
Rc::new(FileName::Url(
505+
Lrc::new(FileName::Url(
505506
ModuleSpecifier::parse("file:///test.ts").unwrap(),
506507
)),
507508
src.to_string(),
@@ -514,7 +515,7 @@ mod test {
514515
(source_map, parser.parse_module().unwrap())
515516
}
516517

517-
fn print(source_map: Rc<SourceMap>, module: Module) -> String {
518+
fn print(source_map: Lrc<SourceMap>, module: Module) -> String {
518519
let mut buf = vec![];
519520
{
520521
let mut writer =

0 commit comments

Comments
 (0)