Skip to content

Commit

Permalink
polish transpilers, add support for error reporter
Browse files Browse the repository at this point in the history
  • Loading branch information
KSDaemon committed Feb 14, 2025
1 parent 732d304 commit e51ad70
Show file tree
Hide file tree
Showing 6 changed files with 450 additions and 569 deletions.
146 changes: 60 additions & 86 deletions rust/cubetranspilers/src/check_dup_prop_transpiler.rs
Original file line number Diff line number Diff line change
@@ -1,32 +1,30 @@
use std::collections::HashSet;

use swc_core::common::errors::Handler;
use swc_core::common::{BytePos, Span, DUMMY_SP};
use swc_core::ecma::visit::VisitMutWith;
use swc_core::plugin::errors::HANDLER;
use swc_core::plugin::proxies::TransformPluginProgramMetadata;
use swc_core::{
ecma::{
ast::*,
visit::{visit_mut_pass, VisitMut},
},
ecma::{ast::*, visit::VisitMut},
plugin::proxies::PluginSourceMapProxy,
};

pub struct CheckDupPropTransformVisitor {
pub struct CheckDupPropTransformVisitor<'a> {
pub(crate) source_map: Option<PluginSourceMapProxy>,
handler: &'a Handler,
}

impl CheckDupPropTransformVisitor {
pub fn new(source_map: Option<PluginSourceMapProxy>) -> Self {
CheckDupPropTransformVisitor { source_map }
impl<'a> CheckDupPropTransformVisitor<'a> {
pub fn new(source_map: Option<PluginSourceMapProxy>, handler: &'a Handler) -> Self {
CheckDupPropTransformVisitor {
source_map,
handler,
}
}

fn emit_error(&mut self, span: Span, message: &str) {
HANDLER.with(|handler| {
handler
.struct_span_err(span, &self.format_msg(span, message))
.emit();
});
self.handler
.struct_span_err(span, &self.format_msg(span, message))
.emit();
}

fn format_msg(&self, span: Span, message: &str) -> String {
Expand Down Expand Up @@ -87,7 +85,7 @@ impl CheckDupPropTransformVisitor {
}
}

impl VisitMut for CheckDupPropTransformVisitor {
impl VisitMut for CheckDupPropTransformVisitor<'_> {
// Implement necessary visit_mut_* methods for actual custom transform.
// A comprehensive list of possible visitor methods can be found here:
// https://rustdoc.swc.rs/swc_ecma_visit/trait.VisitMut.html
Expand All @@ -108,12 +106,6 @@ impl VisitMut for CheckDupPropTransformVisitor {
}
}

pub fn process_transform(program: Program, metadata: TransformPluginProgramMetadata) -> Program {
program.apply(&mut visit_mut_pass(CheckDupPropTransformVisitor {
source_map: Some(metadata.source_map),
}))
}

#[cfg(test)]
mod tests {
// Recommended strategy to test plugin's transform is verify
Expand All @@ -128,7 +120,7 @@ mod tests {
common::{
errors::{DiagnosticBuilder, Emitter, Handler, HandlerFlags},
sync::Lrc,
FileName, Globals, SourceMap,
FileName, SourceMap,
},
ecma::visit::VisitMutWith,
};
Expand All @@ -147,7 +139,6 @@ mod tests {

#[test]
fn test_errors_for_duplicates_first_level() {
let globals = Globals::new();
let cm: Lrc<SourceMap> = Default::default();
let diagnostics = Arc::new(Mutex::new(Vec::new()));
let emitter = Box::new(TestEmitter {
Expand Down Expand Up @@ -210,26 +201,21 @@ mod tests {
});
"#;

swc_core::common::GLOBALS.set(&globals, || {
HANDLER.set(&handler, || {
let fm = cm.new_source_file(
Arc::new(FileName::Custom("input.js".into())),
js_code.into(),
);
let lexer = Lexer::new(
Syntax::Es(Default::default()),
EsVersion::Es2020,
StringInput::from(&*fm),
None,
);
let mut parser = Parser::new_from(lexer);
let mut program: Program =
parser.parse_program().expect("Failed to parse the JS code");

let mut visitor = CheckDupPropTransformVisitor { source_map: None };
program.visit_mut_with(&mut visitor);
});
});
let fm = cm.new_source_file(
Arc::new(FileName::Custom("input.js".into())),
js_code.into(),
);
let lexer = Lexer::new(
Syntax::Es(Default::default()),
EsVersion::Es2020,
StringInput::from(&*fm),
None,
);
let mut parser = Parser::new_from(lexer);
let mut program: Program = parser.parse_program().expect("Failed to parse the JS code");

let mut visitor = CheckDupPropTransformVisitor::new(None, &handler);
program.visit_mut_with(&mut visitor);

let diags = diagnostics.lock().unwrap();
let msgs: Vec<_> = diags
Expand All @@ -241,7 +227,6 @@ mod tests {

#[test]
fn test_errors_for_duplicates_deep_level() {
let globals = Globals::new();
let cm: Lrc<SourceMap> = Default::default();
let diagnostics = Arc::new(Mutex::new(Vec::new()));
let emitter = Box::new(TestEmitter {
Expand Down Expand Up @@ -304,26 +289,21 @@ mod tests {
});
"#;

swc_core::common::GLOBALS.set(&globals, || {
HANDLER.set(&handler, || {
let fm = cm.new_source_file(
Arc::new(FileName::Custom("input.js".into())),
js_code.into(),
);
let lexer = Lexer::new(
Syntax::Es(Default::default()),
EsVersion::Es2020,
StringInput::from(&*fm),
None,
);
let mut parser = Parser::new_from(lexer);
let mut program: Program =
parser.parse_program().expect("Failed to parse the JS code");

let mut visitor = CheckDupPropTransformVisitor { source_map: None };
program.visit_mut_with(&mut visitor);
});
});
let fm = cm.new_source_file(
Arc::new(FileName::Custom("input.js".into())),
js_code.into(),
);
let lexer = Lexer::new(
Syntax::Es(Default::default()),
EsVersion::Es2020,
StringInput::from(&*fm),
None,
);
let mut parser = Parser::new_from(lexer);
let mut program: Program = parser.parse_program().expect("Failed to parse the JS code");

let mut visitor = CheckDupPropTransformVisitor::new(None, &handler);
program.visit_mut_with(&mut visitor);

let diags = diagnostics.lock().unwrap();
let msgs: Vec<_> = diags
Expand All @@ -335,7 +315,6 @@ mod tests {

#[test]
fn test_no_errors() {
let globals = Globals::new();
let cm: Lrc<SourceMap> = Default::default();
let diagnostics = Arc::new(Mutex::new(Vec::new()));
let emitter = Box::new(TestEmitter {
Expand Down Expand Up @@ -391,26 +370,21 @@ mod tests {
});
"#;

swc_core::common::GLOBALS.set(&globals, || {
HANDLER.set(&handler, || {
let fm = cm.new_source_file(
Arc::new(FileName::Custom("input.js".into())),
js_code.into(),
);
let lexer = Lexer::new(
Syntax::Es(Default::default()),
EsVersion::Es2020,
StringInput::from(&*fm),
None,
);
let mut parser = Parser::new_from(lexer);
let mut program: Program =
parser.parse_program().expect("Failed to parse the JS code");

let mut visitor = CheckDupPropTransformVisitor { source_map: None };
program.visit_mut_with(&mut visitor);
});
});
let fm = cm.new_source_file(
Arc::new(FileName::Custom("input.js".into())),
js_code.into(),
);
let lexer = Lexer::new(
Syntax::Es(Default::default()),
EsVersion::Es2020,
StringInput::from(&*fm),
None,
);
let mut parser = Parser::new_from(lexer);
let mut program: Program = parser.parse_program().expect("Failed to parse the JS code");

let mut visitor = CheckDupPropTransformVisitor::new(None, &handler);
program.visit_mut_with(&mut visitor);

let diags = diagnostics.lock().unwrap();
assert!(diags.is_empty(), "Should not emit errors",);
Expand Down
Loading

0 comments on commit e51ad70

Please sign in to comment.