diff --git a/crates/oxc_linter/src/rules/unicorn/prefer_date_now.rs b/crates/oxc_linter/src/rules/unicorn/prefer_date_now.rs index 33940eecc0289..acdea4b256932 100644 --- a/crates/oxc_linter/src/rules/unicorn/prefer_date_now.rs +++ b/crates/oxc_linter/src/rules/unicorn/prefer_date_now.rs @@ -51,7 +51,7 @@ declare_oxc_lint!( /// ``` PreferDateNow, pedantic, - pending + fix ); impl Rule for PreferDateNow { @@ -60,17 +60,20 @@ impl Rule for PreferDateNow { AstKind::CallExpression(call_expr) => { // `new Date().{getTime,valueOf}()` if let Some(member_expr) = - call_expr.callee.without_parenthesized().as_member_expression() + call_expr.callee.get_inner_expression().as_member_expression() { if call_expr.arguments.is_empty() && !member_expr.is_computed() && matches!(member_expr.static_property_name(), Some("getTime" | "valueOf")) - && is_new_date(member_expr.object().without_parenthesized()) + && is_new_date(member_expr.object().get_inner_expression()) { - ctx.diagnostic(prefer_date_now_over_methods( - call_expr.span, - member_expr.static_property_name().unwrap(), - )); + ctx.diagnostic_with_fix( + prefer_date_now_over_methods( + call_expr.span, + member_expr.static_property_name().unwrap(), + ), + |fixer| fixer.replace(call_expr.span, "Date.now()"), + ); } } @@ -82,10 +85,11 @@ impl Rule for PreferDateNow { if let Some(expr) = call_expr.arguments.first().and_then(Argument::as_expression) { - if is_new_date(expr.without_parenthesized()) { - ctx.diagnostic(prefer_date_now_over_number_date_object( - call_expr.span, - )); + if is_new_date(expr.get_inner_expression()) { + ctx.diagnostic_with_fix( + prefer_date_now_over_number_date_object(call_expr.span), + |fixer| fixer.replace(call_expr.span, "Date.now()"), + ); } } } @@ -99,7 +103,9 @@ impl Rule for PreferDateNow { return; } if is_new_date(&unary_expr.argument) { - ctx.diagnostic(prefer_date_now(unary_expr.argument.span())); + ctx.diagnostic_with_fix(prefer_date_now(unary_expr.argument.span()), |fixer| { + fixer.replace(unary_expr.span, "Date.now()") + }); } } AstKind::AssignmentExpression(assignment_expr) => { @@ -143,7 +149,7 @@ impl Rule for PreferDateNow { } fn is_new_date(expr: &Expression) -> bool { - let Expression::NewExpression(new_expr) = expr.without_parenthesized() else { + let Expression::NewExpression(new_expr) = expr.get_inner_expression() else { return false; }; @@ -217,5 +223,19 @@ fn test() { r"function foo(){return-new Date}", ]; - Tester::new(PreferDateNow::NAME, pass, fail).test_and_snapshot(); + let fix = vec![ + ("new Date().getTime()", "Date.now()"), + ("new Date().valueOf()", "Date.now()"), + ("Number(new Date())", "Date.now()"), + ("BigInt(new Date())", "Date.now()"), + ("(new Date() as number).getTime()", "Date.now()"), + ("(new Date().valueOf() as string)", "(Date.now() as string)"), + ("(new Date() ). getTime()", "Date.now()"), + ("(new Date().valueOf() )", "(Date.now() )"), + ("Number(new Date() )", "Date.now()"), + ("BigInt(new Date());", "Date.now();"), + ("BigInt(new Date());", "Date.now();"), + ]; + + Tester::new(PreferDateNow::NAME, pass, fail).expect_fix(fix).test_and_snapshot(); }