feat(linter/unicorn): add fixer to prefer-date-now (#5147)

This commit is contained in:
camc314 2024-08-26 14:05:01 +00:00
parent a58e44845f
commit 7ccde4b853

View file

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