aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_utils
diff options
context:
space:
mode:
authorLibravatar Titus Wormer <tituswormer@gmail.com>2022-10-04 10:29:30 +0200
committerLibravatar Titus Wormer <tituswormer@gmail.com>2022-10-04 10:29:30 +0200
commit9d90e35d51555d9f853f2eccfa771f47d71a6bc1 (patch)
treeafaa271b06215981a137868f652431ef9ab293f7 /tests/test_utils
parent3a1fd1918f65c0a751a872d66e2d5bb01c64830c (diff)
downloadmarkdown-rs-9d90e35d51555d9f853f2eccfa771f47d71a6bc1.tar.gz
markdown-rs-9d90e35d51555d9f853f2eccfa771f47d71a6bc1.tar.bz2
markdown-rs-9d90e35d51555d9f853f2eccfa771f47d71a6bc1.zip
Refactor to share a test utility
Diffstat (limited to '')
-rw-r--r--tests/test_utils/swc.rs29
-rw-r--r--tests/test_utils/to_document.rs60
-rw-r--r--tests/test_utils/to_swc.rs2
3 files changed, 64 insertions, 27 deletions
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<Program, S
swc_ecma_ast::DefaultDecl::Fn(func) => 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<Program, S
// export {a, b as c} from 'd'
// export {a, b as c}
// ```
- swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportNamed(mut named_export)) => {
+ 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<Program, S
// branch of this looks interesting, but as far as I
// understand it *is not* valid ES.
// `export a from 'b'` is a syntax error, even in SWC.
- if let swc_ecma_ast::ExportSpecifier::Named(named) = &named_export.specifiers[index] {
- if let Some(swc_ecma_ast::ModuleExportName::Ident(ident)) = &named.exported {
+ if let swc_ecma_ast::ExportSpecifier::Named(named) =
+ &named_export.specifiers[index]
+ {
+ if let Some(swc_ecma_ast::ModuleExportName::Ident(ident)) = &named.exported
+ {
if ident.sym.as_ref() == "default" {
// For some reason the AST supports strings
// instead of identifiers.
@@ -254,29 +261,33 @@ pub fn to_document(mut program: Program, options: &Options) -> Result<Program, S
// If there was just a default export, we can drop the original node.
if !named_export.specifiers.is_empty() {
// Pass through.
- replacements.push(swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportNamed(named_export)));
+ replacements.push(swc_ecma_ast::ModuleItem::ModuleDecl(
+ swc_ecma_ast::ModuleDecl::ExportNamed(named_export),
+ ));
}
// It’s an `export {x} from 'y'`, so generate an import.
if let Some(source) = source {
- replacements.push(swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::Import(swc_ecma_ast::ImportDecl {
- specifiers: vec![swc_ecma_ast::ImportSpecifier::Named(
- swc_ecma_ast::ImportNamedSpecifier {
- local: swc_ecma_ast::Ident {
- sym: "MDXLayout".into(),
- optional: false,
+ replacements.push(swc_ecma_ast::ModuleItem::ModuleDecl(
+ swc_ecma_ast::ModuleDecl::Import(swc_ecma_ast::ImportDecl {
+ specifiers: vec![swc_ecma_ast::ImportSpecifier::Named(
+ swc_ecma_ast::ImportNamedSpecifier {
+ local: swc_ecma_ast::Ident {
+ sym: "MDXLayout".into(),
+ optional: false,
+ span: swc_common::DUMMY_SP,
+ },
+ imported: Some(swc_ecma_ast::ModuleExportName::Ident(id)),
span: swc_common::DUMMY_SP,
+ is_type_only: false,
},
- imported: Some(swc_ecma_ast::ModuleExportName::Ident( id)),
- span: swc_common::DUMMY_SP,
- is_type_only: false,
- },
- )],
- src: source,
- type_only: false,
- asserts: None,
- span: swc_common::DUMMY_SP,
- })))
+ )],
+ src: source,
+ type_only: false,
+ asserts: None,
+ span: swc_common::DUMMY_SP,
+ }),
+ ))
}
// It’s an `export {x}`, so generate a variable declaration.
else {
@@ -284,13 +295,14 @@ pub fn to_document(mut program: Program, options: &Options) -> Result<Program, S
}
} else {
// Pass through.
- replacements.push(swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportNamed(named_export)));
+ replacements.push(swc_ecma_ast::ModuleItem::ModuleDecl(
+ swc_ecma_ast::ModuleDecl::ExportNamed(named_export),
+ ));
}
}
swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::Import(_))
| swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportDecl(_))
| swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportAll(_))
- // To do: handle TS things?
| swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::TsImportEquals(_))
| swc_ecma_ast::ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::TsExportAssignment(
_,
diff --git a/tests/test_utils/to_swc.rs b/tests/test_utils/to_swc.rs
index 59d60ee..6ed48b6 100644
--- a/tests/test_utils/to_swc.rs
+++ b/tests/test_utils/to_swc.rs
@@ -379,8 +379,6 @@ fn transform_root(
}
}
- // To do: remove whitespace?
- // To do: return a single child if there is one?
Ok(Some(swc_ecma_ast::JSXElementChild::JSXFragment(
create_fragment(nodes, node),
)))