Skip to content

Commit

Permalink
feat(linter/unicorn): add fixer to prefer-date-now (#5147)
Browse files Browse the repository at this point in the history
  • Loading branch information
camc314 committed Aug 26, 2024
1 parent a58e448 commit 7ccde4b
Showing 1 changed file with 34 additions and 14 deletions.
48 changes: 34 additions & 14 deletions crates/oxc_linter/src/rules/unicorn/prefer_date_now.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ declare_oxc_lint!(
/// ```
PreferDateNow,
pedantic,
pending
fix
);

impl Rule for PreferDateNow {
Expand All @@ -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()"),
);
}
}

Expand All @@ -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()"),
);
}
}
}
Expand All @@ -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) => {
Expand Down Expand Up @@ -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;
};

Expand Down Expand Up @@ -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();
}

0 comments on commit 7ccde4b

Please sign in to comment.