@@ -7,7 +7,9 @@ use oxc_macros::declare_oxc_lint;
7
7
use oxc_span:: { GetSpan , Span } ;
8
8
use serde_json:: Value ;
9
9
10
- use crate :: { AstNode , context:: LintContext , globals:: GLOBAL_OBJECT_NAMES , rule:: Rule } ;
10
+ use crate :: {
11
+ AstNode , context:: LintContext , fixer:: RuleFixer , globals:: GLOBAL_OBJECT_NAMES , rule:: Rule ,
12
+ } ;
11
13
12
14
fn prefer_number_properties_diagnostic ( span : Span , method_name : & str ) -> OxcDiagnostic {
13
15
OxcDiagnostic :: warn ( format ! ( "Use `Number.{method_name}` instead of the global `{method_name}`" ) )
@@ -73,7 +75,7 @@ declare_oxc_lint!(
73
75
PreferNumberProperties ,
74
76
unicorn,
75
77
restriction,
76
- fix
78
+ dangerous_fix
77
79
) ;
78
80
79
81
impl Rule for PreferNumberProperties {
@@ -124,21 +126,31 @@ impl Rule for PreferNumberProperties {
124
126
Some ( AstKind :: ObjectProperty ( _) )
125
127
) )
126
128
{
127
- ctx. diagnostic_with_fix (
128
- prefer_number_properties_diagnostic ( ident_ref. span , & ident_ref. name ) ,
129
- |fixer| match ctx. nodes ( ) . parent_kind ( node. id ( ) ) {
130
- Some ( AstKind :: ObjectProperty ( object_property) )
131
- if object_property. shorthand =>
132
- {
133
- fixer. insert_text_before (
134
- & ident_ref. span ,
135
- format ! ( "{}: Number." , ident_ref. name. as_str( ) ) ,
136
- )
137
- }
138
- Some ( _) => fixer. insert_text_before ( & ident_ref. span , "Number." ) ,
139
- None => unreachable ! ( ) ,
140
- } ,
141
- ) ;
129
+ let fixer = |fixer : RuleFixer < ' _ , ' a > | match ctx. nodes ( ) . parent_kind ( node. id ( ) )
130
+ {
131
+ Some ( AstKind :: ObjectProperty ( object_property) )
132
+ if object_property. shorthand =>
133
+ {
134
+ fixer. insert_text_before (
135
+ & ident_ref. span ,
136
+ format ! ( "{}: Number." , ident_ref. name. as_str( ) ) ,
137
+ )
138
+ }
139
+ Some ( _) => fixer. insert_text_before ( & ident_ref. span , "Number." ) ,
140
+ None => unreachable ! ( ) ,
141
+ } ;
142
+
143
+ if ident_ref. name . as_str ( ) == "isNaN" || ident_ref. name . as_str ( ) == "isFinite" {
144
+ ctx. diagnostic_with_dangerous_fix (
145
+ prefer_number_properties_diagnostic ( ident_ref. span , & ident_ref. name ) ,
146
+ fixer,
147
+ ) ;
148
+ } else {
149
+ ctx. diagnostic_with_fix (
150
+ prefer_number_properties_diagnostic ( ident_ref. span , & ident_ref. name ) ,
151
+ fixer,
152
+ ) ;
153
+ }
142
154
}
143
155
}
144
156
AstKind :: CallExpression ( call_expr) => {
@@ -153,20 +165,35 @@ impl Rule for PreferNumberProperties {
153
165
}
154
166
}
155
167
156
- ctx. diagnostic_with_fix (
157
- prefer_number_properties_diagnostic ( call_expr. callee . span ( ) , ident_name) ,
158
- |fixer| match & call_expr. callee {
159
- Expression :: Identifier ( ident) => {
160
- fixer. insert_text_before ( & ident. span , "Number." )
161
- }
162
- match_member_expression ! ( Expression ) => {
163
- let member_expr = call_expr. callee . to_member_expression ( ) ;
168
+ let fixer = |fixer : RuleFixer < ' _ , ' a > | match & call_expr. callee {
169
+ Expression :: Identifier ( ident) => {
170
+ fixer. insert_text_before ( & ident. span , "Number." )
171
+ }
172
+ match_member_expression ! ( Expression ) => {
173
+ let member_expr = call_expr. callee . to_member_expression ( ) ;
174
+
175
+ fixer. replace ( member_expr. object ( ) . span ( ) , "Number" )
176
+ }
177
+ _ => unreachable ! ( ) ,
178
+ } ;
164
179
165
- fixer. replace ( member_expr. object ( ) . span ( ) , "Number" )
166
- }
167
- _ => unreachable ! ( ) ,
168
- } ,
169
- ) ;
180
+ if ident_name == "isFinite" || ident_name == "isNaN" {
181
+ ctx. diagnostic_with_dangerous_fix (
182
+ prefer_number_properties_diagnostic (
183
+ call_expr. callee . span ( ) ,
184
+ ident_name,
185
+ ) ,
186
+ fixer,
187
+ ) ;
188
+ } else {
189
+ ctx. diagnostic_with_fix (
190
+ prefer_number_properties_diagnostic (
191
+ call_expr. callee . span ( ) ,
192
+ ident_name,
193
+ ) ,
194
+ fixer,
195
+ ) ;
196
+ }
170
197
}
171
198
}
172
199
_ => { }
0 commit comments