From 9d90e35d51555d9f853f2eccfa771f47d71a6bc1 Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Tue, 4 Oct 2022 10:29:30 +0200 Subject: Refactor to share a test utility --- tests/test_utils/swc.rs | 29 +++++++++++++++++++- tests/test_utils/to_document.rs | 60 ++++++++++++++++++++++++----------------- tests/test_utils/to_swc.rs | 2 -- 3 files changed, 64 insertions(+), 27 deletions(-) (limited to 'tests/test_utils') diff --git a/tests/test_utils/swc.rs b/tests/test_utils/swc.rs index c0fffa0..80376b8 100644 --- a/tests/test_utils/swc.rs +++ b/tests/test_utils/swc.rs @@ -3,8 +3,11 @@ extern crate swc_common; extern crate swc_ecma_ast; extern crate swc_ecma_parser; use micromark::{MdxExpressionKind, MdxSignal}; -use swc_common::{source_map::Pos, BytePos, FileName, SourceFile, Spanned}; +use swc_common::{ + source_map::Pos, sync::Lrc, BytePos, FileName, FilePathMapping, SourceFile, SourceMap, Spanned, +}; use swc_ecma_ast::{EsVersion, Expr, Module}; +use swc_ecma_codegen::{text_writer::JsWriter, Emitter}; use swc_ecma_parser::{ error::Error as SwcError, parse_file_as_expr, parse_file_as_module, EsConfig, Syntax, }; @@ -164,6 +167,30 @@ pub fn parse_expression_to_tree( } } +/// Serialize an SWC module. +/// To do: support comments. +#[allow(dead_code)] +pub fn serialize(module: &Module) -> String { + let mut buf = vec![]; + let cm = Lrc::new(SourceMap::new(FilePathMapping::empty())); + // let comm = &program.comments as &dyn swc_common::comments::Comments; + { + let mut emitter = Emitter { + cfg: swc_ecma_codegen::Config { + ..Default::default() + }, + cm: cm.clone(), + // To do: figure out how to pass them. + comments: None, + wr: JsWriter::new(cm, "\n", &mut buf, None), + }; + + emitter.emit_module(module).unwrap(); + } + + String::from_utf8_lossy(&buf).to_string() +} + /// Check that the resulting AST of ESM is OK. /// /// This checks that only module declarations (import/exports) are used, not diff --git a/tests/test_utils/to_document.rs b/tests/test_utils/to_document.rs index b44d029..96e9d7f 100644 --- a/tests/test_utils/to_document.rs +++ b/tests/test_utils/to_document.rs @@ -186,8 +186,10 @@ pub fn to_document(mut program: Program, options: &Options) -> Result swc_ecma_ast::Expr::Fn(func), swc_ecma_ast::DefaultDecl::TsInterfaceDecl(_) => { // To do: improved error? Not sure what a real example of this is? - unreachable!("Cannot use TypeScript interface declarations as default export in MDX") - }, + unreachable!( + "Cannot use TypeScript interface declarations as default export in MDX" + ) + } })); } swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportDefaultExpr( @@ -206,7 +208,9 @@ pub fn to_document(mut program: Program, options: &Options) -> Result { + swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportNamed( + mut named_export, + )) => { // SWC is currently crashing when generating code, w/o source // map, if an actual location is set on this node. named_export.span = swc_common::DUMMY_SP; @@ -220,8 +224,11 @@ pub fn to_document(mut program: Program, options: &Options) -> Result Result Result