1
1
import rule from 'eslint/lib/rules/no-redeclare' ;
2
+ import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree' ;
2
3
import { RuleTester } from '../RuleTester' ;
3
4
4
5
const ruleTester = new RuleTester ( {
5
6
parserOptions : {
6
- ecmaVersion : 6 ,
7
- sourceType : 'module' ,
8
- ecmaFeatures : { }
7
+ ecmaVersion : 6
9
8
} ,
10
9
parser : '@typescript-eslint/parser'
11
10
} ) ;
12
11
13
12
ruleTester . run ( 'no-redeclare' , rule , {
14
13
valid : [
14
+ 'var a = 3; var b = function() { var a = 10; };' ,
15
+ 'var a = 3; a = 10;' ,
16
+ {
17
+ code : 'if (true) {\n let b = 2;\n} else { \nlet b = 3;\n}' ,
18
+ parserOptions : {
19
+ ecmaVersion : 6
20
+ }
21
+ } ,
22
+ 'var Object = 0;' ,
23
+ { code : 'var Object = 0;' , options : [ { builtinGlobals : false } ] } ,
24
+ {
25
+ code : 'var Object = 0;' ,
26
+ options : [ { builtinGlobals : true } ] ,
27
+ parserOptions : { sourceType : 'module' }
28
+ } ,
29
+ {
30
+ code : 'var Object = 0;' ,
31
+ options : [ { builtinGlobals : true } ] ,
32
+ parserOptions : { ecmaFeatures : { globalReturn : true } }
33
+ } ,
34
+ { code : 'var top = 0;' , env : { browser : true } } ,
35
+ { code : 'var top = 0;' , options : [ { builtinGlobals : true } ] } ,
36
+ {
37
+ code : 'var top = 0;' ,
38
+ options : [ { builtinGlobals : true } ] ,
39
+ parserOptions : { ecmaFeatures : { globalReturn : true } } ,
40
+ env : { browser : true }
41
+ } ,
42
+ {
43
+ code : 'var top = 0;' ,
44
+ options : [ { builtinGlobals : true } ] ,
45
+ parserOptions : { sourceType : 'module' } ,
46
+ env : { browser : true }
47
+ } ,
48
+ {
49
+ code : 'var self = 1' ,
50
+ options : [ { builtinGlobals : true } ] ,
51
+ env : { browser : false }
52
+ } ,
15
53
// https://github.com/eslint/typescript-eslint-parser/issues/443
16
54
`
17
55
const Foo = 1;
@@ -22,7 +60,211 @@ type Foo = 1;
22
60
function foo({ bar }: { bar: string }) {
23
61
console.log(bar);
24
62
}
63
+ ` ,
64
+ `
65
+ type AST<T extends ParserOptions> = TSESTree.Program &
66
+ (T['range'] extends true ? { range: [number, number] } : {}) &
67
+ (T['tokens'] extends true ? { tokens: TSESTree.Token[] } : {}) &
68
+ (T['comment'] extends true ? { comments: TSESTree.Comment[] } : {});
69
+ interface ParseAndGenerateServicesResult<T extends ParserOptions> {
70
+ ast: AST<T>;
71
+ services: ParserServices;
72
+ }
73
+ ` ,
74
+ `
75
+ function A<T>() {}
76
+ interface B<T> {}
77
+ type C<T> = Array<T>
78
+ class D<T> {}
25
79
`
26
80
] ,
27
- invalid : [ ]
81
+ invalid : [
82
+ {
83
+ code : 'var a = 3; var a = 10;' ,
84
+ parserOptions : { ecmaVersion : 6 } ,
85
+ errors : [
86
+ {
87
+ message : "'a' is already defined." ,
88
+ type : AST_NODE_TYPES . Identifier
89
+ } as any
90
+ ]
91
+ } ,
92
+ {
93
+ code : 'switch(foo) { case a: var b = 3;\ncase b: var b = 4}' ,
94
+ errors : [
95
+ {
96
+ message : "'b' is already defined." ,
97
+ type : AST_NODE_TYPES . Identifier
98
+ } as any
99
+ ]
100
+ } ,
101
+ {
102
+ code : 'var a = 3; var a = 10;' ,
103
+ errors : [
104
+ {
105
+ message : "'a' is already defined." ,
106
+ type : AST_NODE_TYPES . Identifier
107
+ } as any
108
+ ]
109
+ } ,
110
+ {
111
+ code : 'var a = {}; var a = [];' ,
112
+ errors : [
113
+ {
114
+ message : "'a' is already defined." ,
115
+ type : AST_NODE_TYPES . Identifier
116
+ } as any
117
+ ]
118
+ } ,
119
+ {
120
+ code : 'var a; function a() {}' ,
121
+ errors : [
122
+ {
123
+ message : "'a' is already defined." ,
124
+ type : AST_NODE_TYPES . Identifier
125
+ } as any
126
+ ]
127
+ } ,
128
+ {
129
+ code : 'function a() {} function a() {}' ,
130
+ errors : [
131
+ {
132
+ message : "'a' is already defined." ,
133
+ type : AST_NODE_TYPES . Identifier
134
+ } as any
135
+ ]
136
+ } ,
137
+ {
138
+ code : 'var a = function() { }; var a = function() { }' ,
139
+ errors : [
140
+ {
141
+ message : "'a' is already defined." ,
142
+ type : AST_NODE_TYPES . Identifier
143
+ } as any
144
+ ]
145
+ } ,
146
+ {
147
+ code : 'var a = function() { }; var a = new Date();' ,
148
+ errors : [
149
+ {
150
+ message : "'a' is already defined." ,
151
+ type : AST_NODE_TYPES . Identifier
152
+ } as any
153
+ ]
154
+ } ,
155
+ {
156
+ code : 'var a = 3; var a = 10; var a = 15;' ,
157
+ errors : [
158
+ {
159
+ message : "'a' is already defined." ,
160
+ type : AST_NODE_TYPES . Identifier
161
+ } as any ,
162
+ {
163
+ message : "'a' is already defined." ,
164
+ type : AST_NODE_TYPES . Identifier
165
+ } as any
166
+ ]
167
+ } ,
168
+ {
169
+ code : 'var a; var a;' ,
170
+ parserOptions : { sourceType : 'module' } ,
171
+ errors : [
172
+ {
173
+ message : "'a' is already defined." ,
174
+ type : AST_NODE_TYPES . Identifier
175
+ } as any
176
+ ]
177
+ } ,
178
+ {
179
+ code : 'export var a; var a;' ,
180
+ parserOptions : { sourceType : 'module' } ,
181
+ errors : [
182
+ {
183
+ message : "'a' is already defined." ,
184
+ type : AST_NODE_TYPES . Identifier
185
+ } as any
186
+ ]
187
+ } ,
188
+ {
189
+ code : 'var Object = 0;' ,
190
+ options : [ { builtinGlobals : true } ] ,
191
+ errors : [
192
+ {
193
+ message : "'Object' is already defined." ,
194
+ type : AST_NODE_TYPES . Identifier
195
+ } as any
196
+ ]
197
+ } ,
198
+ {
199
+ code : 'var top = 0;' ,
200
+ options : [ { builtinGlobals : true } ] ,
201
+ errors : [
202
+ {
203
+ message : "'top' is already defined." ,
204
+ type : AST_NODE_TYPES . Identifier
205
+ } as any
206
+ ] ,
207
+ env : { browser : true }
208
+ } ,
209
+ {
210
+ code : 'var a; var {a = 0, b: Object = 0} = {};' ,
211
+ options : [ { builtinGlobals : true } ] ,
212
+ parserOptions : { ecmaVersion : 6 } ,
213
+ errors : [
214
+ {
215
+ message : "'a' is already defined." ,
216
+ type : AST_NODE_TYPES . Identifier
217
+ } as any ,
218
+ {
219
+ message : "'Object' is already defined." ,
220
+ type : AST_NODE_TYPES . Identifier
221
+ } as any
222
+ ]
223
+ } ,
224
+ {
225
+ code : 'var a; var {a = 0, b: Object = 0} = {};' ,
226
+ options : [ { builtinGlobals : true } ] ,
227
+ parserOptions : { ecmaVersion : 6 , sourceType : 'module' } ,
228
+ errors : [
229
+ {
230
+ message : "'a' is already defined." ,
231
+ type : AST_NODE_TYPES . Identifier
232
+ } as any
233
+ ]
234
+ } ,
235
+ {
236
+ code : 'var a; var {a = 0, b: Object = 0} = {};' ,
237
+ options : [ { builtinGlobals : true } ] ,
238
+ parserOptions : { ecmaVersion : 6 , ecmaFeatures : { globalReturn : true } } ,
239
+ errors : [
240
+ {
241
+ message : "'a' is already defined." ,
242
+ type : AST_NODE_TYPES . Identifier
243
+ } as any
244
+ ]
245
+ } ,
246
+ {
247
+ code : 'var a; var {a = 0, b: Object = 0} = {};' ,
248
+ options : [ { builtinGlobals : false } ] ,
249
+ parserOptions : { ecmaVersion : 6 } ,
250
+ errors : [
251
+ {
252
+ message : "'a' is already defined." ,
253
+ type : AST_NODE_TYPES . Identifier
254
+ } as any
255
+ ]
256
+ } ,
257
+
258
+ // Notifications of readonly are moved from no-undef: https://github.com/eslint/eslint/issues/4504
259
+ {
260
+ code : '/*global b:false*/ var b = 1;' ,
261
+ options : [ { builtinGlobals : true } ] ,
262
+ errors : [
263
+ {
264
+ message : "'b' is already defined." ,
265
+ type : AST_NODE_TYPES . Identifier
266
+ } as any
267
+ ]
268
+ }
269
+ ]
28
270
} ) ;
0 commit comments