@@ -66,29 +66,53 @@ impl Rule for NoRedeclare {
66
66
. get ( 0 )
67
67
. and_then ( |config| config. get ( "builtinGlobals" ) )
68
68
. and_then ( serde_json:: Value :: as_bool)
69
- . unwrap_or ( false ) ;
69
+ . unwrap_or ( true ) ;
70
70
71
71
Self { built_in_globals }
72
72
}
73
73
74
74
fn run_on_symbol ( & self , symbol_id : SymbolId , ctx : & LintContext ) {
75
75
let name = ctx. scoping ( ) . symbol_name ( symbol_id) ;
76
+ let decl_span = ctx. scoping ( ) . symbol_span ( symbol_id) ;
76
77
let is_builtin = self . built_in_globals
77
78
&& ( GLOBALS [ "builtin" ] . contains_key ( name) || ctx. globals ( ) . is_enabled ( name) ) ;
78
79
79
- let decl_span = ctx. scoping ( ) . symbol_span ( symbol_id) ;
80
-
81
80
if is_builtin {
82
81
ctx. diagnostic ( no_redeclare_as_builtin_in_diagnostic ( name, decl_span) ) ;
83
82
}
84
83
85
- for window in ctx. scoping ( ) . symbol_redeclarations ( symbol_id) . windows ( 2 ) {
86
- let first = & window[ 0 ] ;
87
- let second = & window[ 1 ] ;
84
+ if ctx. source_type ( ) . is_typescript ( ) {
85
+ let mut iter = ctx. scoping ( ) . symbol_redeclarations ( symbol_id) . iter ( ) . filter ( |rd| {
86
+ if is_builtin {
87
+ if rd. span != decl_span {
88
+ ctx. diagnostic ( no_redeclare_as_builtin_in_diagnostic ( name, rd. span ) ) ;
89
+ }
90
+ return false ;
91
+ }
92
+ if rd. flags . is_function ( ) {
93
+ let node = ctx. nodes ( ) . get_node ( rd. declaration ) ;
94
+ if let Some ( func) = node. kind ( ) . as_function ( ) {
95
+ return !func. is_ts_declare_function ( ) ;
96
+ }
97
+ }
98
+ true
99
+ } ) ;
100
+
101
+ if let Some ( first) = iter. next ( ) {
102
+ iter. fold ( first, |prev, next| {
103
+ ctx. diagnostic ( no_redeclare_diagnostic ( name, prev. span , next. span ) ) ;
104
+ next
105
+ } ) ;
106
+ }
107
+
108
+ return ;
109
+ }
110
+
111
+ for windows in ctx. scoping ( ) . symbol_redeclarations ( symbol_id) . windows ( 2 ) {
88
112
if is_builtin {
89
- ctx. diagnostic ( no_redeclare_as_builtin_in_diagnostic ( name, second . span ) ) ;
113
+ ctx. diagnostic ( no_redeclare_as_builtin_in_diagnostic ( name, windows [ 1 ] . span ) ) ;
90
114
} else {
91
- ctx. diagnostic ( no_redeclare_diagnostic ( name, first . span , second . span ) ) ;
115
+ ctx. diagnostic ( no_redeclare_diagnostic ( name, windows [ 0 ] . span , windows [ 1 ] . span ) ) ;
92
116
}
93
117
}
94
118
}
@@ -122,6 +146,9 @@ fn test() {
122
146
( "var self = 1" , Some ( serde_json:: json!( [ { "builtinGlobals" : false } ] ) ) ) ,
123
147
( "var globalThis = foo" , Some ( serde_json:: json!( [ { "builtinGlobals" : false } ] ) ) ) ,
124
148
( "var globalThis = foo" , Some ( serde_json:: json!( [ { "builtinGlobals" : false } ] ) ) ) ,
149
+ // Issue: <https://github.com/oxc-project/oxc/issues/10396>
150
+ ( "export function foo(): void; export function foo() { }" , None ) ,
151
+ ( "function foo(arg: string): void; function foo(arg: number): any {}" , None ) ,
125
152
] ;
126
153
127
154
let fail = vec ! [
@@ -139,31 +166,21 @@ fn test() {
139
166
( "class C { static { var a; { var a; } } }" , None ) ,
140
167
( "class C { static { { var a; } var a; } }" , None ) ,
141
168
( "class C { static { { var a; } { var a; } } }" , None ) ,
142
- (
143
- "var Object = 0; var Object = 0; var globalThis = 0;" ,
144
- Some ( serde_json:: json!( [ { "builtinGlobals" : true } ] ) ) ,
145
- ) ,
146
- (
147
- "var a; var {a = 0, b: Object = 0} = {};" ,
148
- Some ( serde_json:: json!( [ { "builtinGlobals" : true } ] ) ) ,
149
- ) ,
150
- (
151
- "var a; var {a = 0, b: globalThis = 0} = {};" ,
152
- Some ( serde_json:: json!( [ { "builtinGlobals" : true } ] ) ) ,
153
- ) ,
169
+ ( "var Object = 0; var Object = 0; var globalThis = 0;" , None ) ,
170
+ ( "var a; var {a = 0, b: Object = 0} = {};" , None ) ,
171
+ ( "var a; var {a = 0, b: globalThis = 0} = {};" , None ) ,
154
172
( "function f() { var a; var a; }" , None ) ,
155
173
( "function f(a, b = 1) { var a; var b;}" , None ) ,
156
174
( "function f() { var a; if (test) { var a; } }" , None ) ,
157
175
( "for (var a, a;;);" , None ) ,
176
+ // Issue: <https://github.com/oxc-project/oxc/issues/10396>
177
+ ( "export function undefined(): void; export function undefined() { }" , None ) ,
178
+ ( "type foo = 1; export function foo(): void; export function foo() { }" , None ) ,
158
179
] ;
159
180
160
181
Tester :: new ( NoRedeclare :: NAME , NoRedeclare :: PLUGIN , pass, fail) . test_and_snapshot ( ) ;
161
182
162
- let fail = vec ! [ (
163
- "var foo;" ,
164
- Some ( serde_json:: json!( [ { "builtinGlobals" : true } ] ) ) ,
165
- Some ( serde_json:: json!( { "globals" : { "foo" : false } } ) ) ,
166
- ) ] ;
183
+ let fail = vec ! [ ( "var foo;" , None , Some ( serde_json:: json!( { "globals" : { "foo" : false } } ) ) ) ] ;
167
184
168
185
Tester :: new ( NoRedeclare :: NAME , NoRedeclare :: PLUGIN , vec ! [ ] , fail) . test ( ) ;
169
186
}
0 commit comments