test(transformer/jsx): move tests setup into a macro (#7618)

Follow up after #7553. Move tests setup for JSX pragmas into a macro to prevent tests having access to an owned `TraverseCtx`, for safety.
This commit is contained in:
overlookmotel 2024-12-04 02:47:26 +00:00
parent 25bffa59e5
commit 2158c3851b

View file

@ -1073,26 +1073,38 @@ mod test {
use std::path::Path; use std::path::Path;
use oxc_allocator::Allocator; use oxc_allocator::Allocator;
use oxc_ast::{ast::Expression, AstBuilder}; use oxc_ast::ast::Expression;
use oxc_semantic::{ScopeTree, SymbolTable}; use oxc_semantic::{ScopeTree, SymbolTable};
use oxc_traverse::ReusableTraverseCtx; use oxc_traverse::ReusableTraverseCtx;
use crate::{context::TransformCtx, TransformOptions}; use crate::{TransformCtx, TransformOptions};
use super::Pragma; use super::Pragma;
macro_rules! setup {
($traverse_ctx:ident, $transform_ctx:ident) => {
let allocator = Allocator::default();
let traverse_ctx =
ReusableTraverseCtx::new(ScopeTree::default(), SymbolTable::default(), &allocator);
// SAFETY: Macro user only gets a `&mut TraverseCtx`, which cannot be abused
let mut traverse_ctx = unsafe { traverse_ctx.unwrap() };
let $traverse_ctx = &mut traverse_ctx;
let $transform_ctx =
TransformCtx::new(Path::new("test.jsx"), &TransformOptions::default());
};
}
#[test] #[test]
fn this_expr_pragma() { fn this_expr_pragma() {
let alloc = Allocator::default(); setup!(traverse_ctx, transform_ctx);
let ast = AstBuilder::new(&alloc);
let ctx = TransformCtx::new(Path::new("test.jsx"), &TransformOptions::default());
// SAFETY: constructed to avoid unsoundness
let mut traverse_ctx = unsafe {
ReusableTraverseCtx::new(ScopeTree::default(), SymbolTable::default(), &alloc).unwrap()
};
let pragma = Pragma::parse(Some(&"this.a.b".to_string()), "createElement", ast, &ctx); let pragma = Pragma::parse(
let expr = pragma.create_expression(&mut traverse_ctx); Some(&"this.a.b".to_string()),
"createElement",
traverse_ctx.ast,
&transform_ctx,
);
let expr = pragma.create_expression(traverse_ctx);
let Expression::StaticMemberExpression(outer_member) = &expr else { panic!() }; let Expression::StaticMemberExpression(outer_member) = &expr else { panic!() };
let Expression::StaticMemberExpression(inner_member) = &outer_member.object else { let Expression::StaticMemberExpression(inner_member) = &outer_member.object else {
@ -1105,17 +1117,15 @@ mod test {
#[test] #[test]
fn import_meta_pragma() { fn import_meta_pragma() {
let alloc = Allocator::default(); setup!(traverse_ctx, transform_ctx);
let ast = AstBuilder::new(&alloc);
let ctx = TransformCtx::new(Path::new("test.jsx"), &TransformOptions::default());
// SAFETY: constructed to avoid unsoundness
let mut traverse_ctx = unsafe {
ReusableTraverseCtx::new(ScopeTree::default(), SymbolTable::default(), &alloc).unwrap()
};
let pragma = let pragma = Pragma::parse(
Pragma::parse(Some(&"import.meta.prop".to_string()), "createElement", ast, &ctx); Some(&"import.meta.prop".to_string()),
let expr = pragma.create_expression(&mut traverse_ctx); "createElement",
traverse_ctx.ast,
&transform_ctx,
);
let expr = pragma.create_expression(traverse_ctx);
let Expression::StaticMemberExpression(member) = &expr else { panic!() }; let Expression::StaticMemberExpression(member) = &expr else { panic!() };
let Expression::MetaProperty(meta_prop) = &member.object else { panic!() }; let Expression::MetaProperty(meta_prop) = &member.object else { panic!() };