Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(es/minifier): mark some builtin functions pure. #6842

Draft
wants to merge 16 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Add test and remove println
hyf0 committed Jan 21, 2023
commit 62fe5c3a3d434879991502593f7c19f42aef1a54
6 changes: 0 additions & 6 deletions crates/swc_ecma_minifier/src/metadata/mod.rs
Original file line number Diff line number Diff line change
@@ -169,12 +169,6 @@ impl VisitMut for InfoMarker<'_> {
n.span = n.span.apply_mark(self.marks.pure);
} else if let Some(pure_fns) = &self.pure_funcs {
if let Callee::Expr(e) = &n.callee {
println!("--pure_fns: {pure_fns:#?}");
println!("e: {e:#?}");
println!(
"pure_fns.contains(&EqIgnoreSpanExprRef(e)): {:?}",
pure_fns.contains(&HashEqIgnoreSpanExprRef(e))
);
// Check for pure_funcs
if pure_fns.contains(&HashEqIgnoreSpanExprRef(e)) {
n.span = n.span.apply_mark(self.marks.pure);
54 changes: 54 additions & 0 deletions crates/swc_ecma_minifier/src/metadata/tests.rs
Original file line number Diff line number Diff line change
@@ -158,3 +158,57 @@
// fn export_default_fn_1() {
// assert_standalone("export default function f(module, exports) {}", 0);
// }

use std::hash::Hash;

use rustc_hash::FxHashSet;
use swc_common::{Mark, DUMMY_SP};
use swc_ecma_utils::{member_expr, quote_expr};

use super::HashEqIgnoreSpanExprRef;

#[test]
fn test_hash_eq_ignore_span_expr_ref() {
use swc_ecma_ast::*;

fn expr_ref<'a>(expr_ref: &'a Expr) -> HashEqIgnoreSpanExprRef<'a> {
HashEqIgnoreSpanExprRef(expr_ref)
}

testing::run_test(false, |_cm, _handler| {
let dummy_sp = DUMMY_SP;
let meaningful_sp = dummy_sp.apply_mark(Mark::new());

let meaningful_ident_expr = Expr::Ident(Ident::new("foo".into(), meaningful_sp));
let dummy_ident_expr = Expr::Ident(Ident::new("foo".into(), dummy_sp));

let meaningful_member_expr = member_expr!(meaningful_sp, foo.bar);
let dummy_member_expr = member_expr!(dummy_sp, foo.bar);

let meaningful_null_expr = quote_expr!(meaningful_sp, null);
let dummy_null_expr = quote_expr!(dummy_sp, null);

assert_eq!(
expr_ref(&meaningful_ident_expr),
expr_ref(&dummy_ident_expr)
);

let mut set = FxHashSet::from_iter([
expr_ref(&meaningful_ident_expr),
expr_ref(&meaningful_member_expr),
expr_ref(&meaningful_null_expr),
]);

assert!(set.contains(&expr_ref(&dummy_ident_expr)));
assert!(set.contains(&expr_ref(&dummy_member_expr)));
assert!(set.contains(&expr_ref(&dummy_null_expr)));

set.insert(expr_ref(&dummy_ident_expr));
set.insert(expr_ref(&dummy_member_expr));
set.insert(expr_ref(&dummy_null_expr));
assert_eq!(set.len(), 3);

Ok(())
})
.unwrap();
}