Skip to content

Commit 3c8312d

Browse files
feat: [member-ordering] add accessor support for member-ordering (#7927)
* Add accessor support for member-ordering * Add test and docs --------- Co-authored-by: Josh Goldberg <[email protected]>
1 parent 7e353cb commit 3c8312d

File tree

4 files changed

+152
-1
lines changed

4 files changed

+152
-1
lines changed

Diff for: packages/eslint-plugin/docs/rules/member-ordering.md

+31
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,37 @@ The default configuration looks as follows:
126126

127127
"constructor",
128128

129+
// Accessors
130+
"public-static-accessor",
131+
"protected-static-accessor",
132+
"private-static-accessor",
133+
"#private-static-accessor",
134+
135+
"public-decorated-accessor",
136+
"protected-decorated-accessor",
137+
"private-decorated-accessor",
138+
139+
"public-instance-accessor",
140+
"protected-instance-accessor",
141+
"private-instance-accessor",
142+
"#private-instance-accessor",
143+
144+
"public-abstract-accessor",
145+
"protected-abstract-accessor",
146+
147+
"public-accessor",
148+
"protected-accessor",
149+
"private-accessor",
150+
"#private-accessor",
151+
152+
"static-accessor",
153+
"instance-accessor",
154+
"abstract-accessor",
155+
156+
"decorated-accessor",
157+
158+
"accessor",
159+
129160
// Getters
130161
"public-static-get",
131162
"protected-static-get",

Diff for: packages/eslint-plugin/src/rules/member-ordering.ts

+38-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type ReadonlyType = 'readonly-field' | 'readonly-signature';
1919

2020
type MemberKind =
2121
| ReadonlyType
22+
| 'accessor'
2223
| 'call-signature'
2324
| 'constructor'
2425
| 'field'
@@ -30,6 +31,7 @@ type MemberKind =
3031

3132
type DecoratedMemberKind =
3233
| Exclude<ReadonlyType, 'readonly-signature'>
34+
| 'accessor'
3335
| 'field'
3436
| 'get'
3537
| 'method'
@@ -170,6 +172,37 @@ export const defaultOrder: MemberType[] = [
170172

171173
'constructor',
172174

175+
// Accessors
176+
'public-static-accessor',
177+
'protected-static-accessor',
178+
'private-static-accessor',
179+
'#private-static-accessor',
180+
181+
'public-decorated-accessor',
182+
'protected-decorated-accessor',
183+
'private-decorated-accessor',
184+
185+
'public-instance-accessor',
186+
'protected-instance-accessor',
187+
'private-instance-accessor',
188+
'#private-instance-accessor',
189+
190+
'public-abstract-accessor',
191+
'protected-abstract-accessor',
192+
193+
'public-accessor',
194+
'protected-accessor',
195+
'private-accessor',
196+
'#private-accessor',
197+
198+
'static-accessor',
199+
'instance-accessor',
200+
'abstract-accessor',
201+
202+
'decorated-accessor',
203+
204+
'accessor',
205+
173206
// Getters
174207
'public-static-get',
175208
'protected-static-get',
@@ -274,6 +307,7 @@ const allMemberTypes = Array.from(
274307
'method',
275308
'call-signature',
276309
'constructor',
310+
'accessor',
277311
'get',
278312
'set',
279313
'static-initialization',
@@ -293,12 +327,13 @@ const allMemberTypes = Array.from(
293327
all.add(`${accessibility}-${type}`); // e.g. `public-field`
294328
}
295329

296-
// Only class instance fields, methods, get and set can have decorators attached to them
330+
// Only class instance fields, methods, accessors, get and set can have decorators attached to them
297331
if (
298332
accessibility !== '#private' &&
299333
(type === 'readonly-field' ||
300334
type === 'field' ||
301335
type === 'method' ||
336+
type === 'accessor' ||
302337
type === 'get' ||
303338
type === 'set')
304339
) {
@@ -355,6 +390,8 @@ function getNodeType(node: Member): MemberKind | null {
355390
return 'constructor';
356391
case AST_NODE_TYPES.TSAbstractPropertyDefinition:
357392
return node.readonly ? 'readonly-field' : 'field';
393+
case AST_NODE_TYPES.AccessorProperty:
394+
return 'accessor';
358395
case AST_NODE_TYPES.PropertyDefinition:
359396
return node.value && functionExpressions.includes(node.value.type)
360397
? 'method'

Diff for: packages/eslint-plugin/tests/rules/member-ordering.test.ts

+39
Original file line numberDiff line numberDiff line change
@@ -2055,6 +2055,20 @@ class Foo {
20552055
},
20562056
],
20572057
},
2058+
{
2059+
code: `
2060+
class Foo {
2061+
accessor bar;
2062+
2063+
baz() {}
2064+
}
2065+
`,
2066+
options: [
2067+
{
2068+
default: ['accessor', 'method'],
2069+
},
2070+
],
2071+
},
20582072
],
20592073
invalid: [
20602074
{
@@ -5065,6 +5079,31 @@ interface Foo {
50655079
},
50665080
],
50675081
},
5082+
{
5083+
code: `
5084+
class Foo {
5085+
accessor bar;
5086+
5087+
baz() {}
5088+
}
5089+
`,
5090+
options: [
5091+
{
5092+
default: ['method', 'accessor'],
5093+
},
5094+
],
5095+
errors: [
5096+
{
5097+
messageId: 'incorrectGroupOrder',
5098+
data: {
5099+
name: 'baz',
5100+
rank: 'accessor',
5101+
},
5102+
line: 5,
5103+
column: 3,
5104+
},
5105+
],
5106+
},
50685107
],
50695108
};
50705109

0 commit comments

Comments
 (0)