From 3c8312d1e135dc65fa41f629993cd03ed82e3255 Mon Sep 17 00:00:00 2001 From: vilicvane Date: Tue, 14 Nov 2023 22:38:36 +0800 Subject: [PATCH] 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 --- .../docs/rules/member-ordering.md | 31 +++++++++++++ .../src/rules/member-ordering.ts | 39 +++++++++++++++- .../tests/rules/member-ordering.test.ts | 39 ++++++++++++++++ .../schema-snapshots/member-ordering.shot | 44 +++++++++++++++++++ 4 files changed, 152 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/docs/rules/member-ordering.md b/packages/eslint-plugin/docs/rules/member-ordering.md index fa53f680ec9..711d590728c 100644 --- a/packages/eslint-plugin/docs/rules/member-ordering.md +++ b/packages/eslint-plugin/docs/rules/member-ordering.md @@ -126,6 +126,37 @@ The default configuration looks as follows: "constructor", + // Accessors + "public-static-accessor", + "protected-static-accessor", + "private-static-accessor", + "#private-static-accessor", + + "public-decorated-accessor", + "protected-decorated-accessor", + "private-decorated-accessor", + + "public-instance-accessor", + "protected-instance-accessor", + "private-instance-accessor", + "#private-instance-accessor", + + "public-abstract-accessor", + "protected-abstract-accessor", + + "public-accessor", + "protected-accessor", + "private-accessor", + "#private-accessor", + + "static-accessor", + "instance-accessor", + "abstract-accessor", + + "decorated-accessor", + + "accessor", + // Getters "public-static-get", "protected-static-get", diff --git a/packages/eslint-plugin/src/rules/member-ordering.ts b/packages/eslint-plugin/src/rules/member-ordering.ts index 76d91d52784..0a5bca7a14c 100644 --- a/packages/eslint-plugin/src/rules/member-ordering.ts +++ b/packages/eslint-plugin/src/rules/member-ordering.ts @@ -19,6 +19,7 @@ type ReadonlyType = 'readonly-field' | 'readonly-signature'; type MemberKind = | ReadonlyType + | 'accessor' | 'call-signature' | 'constructor' | 'field' @@ -30,6 +31,7 @@ type MemberKind = type DecoratedMemberKind = | Exclude + | 'accessor' | 'field' | 'get' | 'method' @@ -170,6 +172,37 @@ export const defaultOrder: MemberType[] = [ 'constructor', + // Accessors + 'public-static-accessor', + 'protected-static-accessor', + 'private-static-accessor', + '#private-static-accessor', + + 'public-decorated-accessor', + 'protected-decorated-accessor', + 'private-decorated-accessor', + + 'public-instance-accessor', + 'protected-instance-accessor', + 'private-instance-accessor', + '#private-instance-accessor', + + 'public-abstract-accessor', + 'protected-abstract-accessor', + + 'public-accessor', + 'protected-accessor', + 'private-accessor', + '#private-accessor', + + 'static-accessor', + 'instance-accessor', + 'abstract-accessor', + + 'decorated-accessor', + + 'accessor', + // Getters 'public-static-get', 'protected-static-get', @@ -274,6 +307,7 @@ const allMemberTypes = Array.from( 'method', 'call-signature', 'constructor', + 'accessor', 'get', 'set', 'static-initialization', @@ -293,12 +327,13 @@ const allMemberTypes = Array.from( all.add(`${accessibility}-${type}`); // e.g. `public-field` } - // Only class instance fields, methods, get and set can have decorators attached to them + // Only class instance fields, methods, accessors, get and set can have decorators attached to them if ( accessibility !== '#private' && (type === 'readonly-field' || type === 'field' || type === 'method' || + type === 'accessor' || type === 'get' || type === 'set') ) { @@ -355,6 +390,8 @@ function getNodeType(node: Member): MemberKind | null { return 'constructor'; case AST_NODE_TYPES.TSAbstractPropertyDefinition: return node.readonly ? 'readonly-field' : 'field'; + case AST_NODE_TYPES.AccessorProperty: + return 'accessor'; case AST_NODE_TYPES.PropertyDefinition: return node.value && functionExpressions.includes(node.value.type) ? 'method' diff --git a/packages/eslint-plugin/tests/rules/member-ordering.test.ts b/packages/eslint-plugin/tests/rules/member-ordering.test.ts index b947d8a5a1e..47019dfe5ab 100644 --- a/packages/eslint-plugin/tests/rules/member-ordering.test.ts +++ b/packages/eslint-plugin/tests/rules/member-ordering.test.ts @@ -2055,6 +2055,20 @@ class Foo { }, ], }, + { + code: ` +class Foo { + accessor bar; + + baz() {} +} + `, + options: [ + { + default: ['accessor', 'method'], + }, + ], + }, ], invalid: [ { @@ -5065,6 +5079,31 @@ interface Foo { }, ], }, + { + code: ` +class Foo { + accessor bar; + + baz() {} +} + `, + options: [ + { + default: ['method', 'accessor'], + }, + ], + errors: [ + { + messageId: 'incorrectGroupOrder', + data: { + name: 'baz', + rank: 'accessor', + }, + line: 5, + column: 3, + }, + ], + }, ], }; diff --git a/packages/eslint-plugin/tests/schema-snapshots/member-ordering.shot b/packages/eslint-plugin/tests/schema-snapshots/member-ordering.shot index d7e2517bb91..658de4a1a19 100644 --- a/packages/eslint-plugin/tests/schema-snapshots/member-ordering.shot +++ b/packages/eslint-plugin/tests/schema-snapshots/member-ordering.shot @@ -9,8 +9,10 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "$defs": { "allItems": { "enum": [ + "#private-accessor", "#private-field", "#private-get", + "#private-instance-accessor", "#private-instance-field", "#private-instance-get", "#private-instance-method", @@ -20,20 +22,24 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "#private-method", "#private-readonly-field", "#private-set", + "#private-static-accessor", "#private-static-field", "#private-static-get", "#private-static-method", "#private-static-readonly-field", "#private-static-set", "#private-static-static-initialization", + "abstract-accessor", "abstract-field", "abstract-get", "abstract-method", "abstract-readonly-field", "abstract-set", "abstract-static-initialization", + "accessor", "call-signature", "constructor", + "decorated-accessor", "decorated-field", "decorated-get", "decorated-method", @@ -41,6 +47,7 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "decorated-set", "field", "get", + "instance-accessor", "instance-field", "instance-get", "instance-method", @@ -48,7 +55,9 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "instance-set", "instance-static-initialization", "method", + "private-accessor", "private-constructor", + "private-decorated-accessor", "private-decorated-field", "private-decorated-get", "private-decorated-method", @@ -56,6 +65,7 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "private-decorated-set", "private-field", "private-get", + "private-instance-accessor", "private-instance-field", "private-instance-get", "private-instance-method", @@ -65,19 +75,23 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "private-method", "private-readonly-field", "private-set", + "private-static-accessor", "private-static-field", "private-static-get", "private-static-method", "private-static-readonly-field", "private-static-set", "private-static-static-initialization", + "protected-abstract-accessor", "protected-abstract-field", "protected-abstract-get", "protected-abstract-method", "protected-abstract-readonly-field", "protected-abstract-set", "protected-abstract-static-initialization", + "protected-accessor", "protected-constructor", + "protected-decorated-accessor", "protected-decorated-field", "protected-decorated-get", "protected-decorated-method", @@ -85,6 +99,7 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "protected-decorated-set", "protected-field", "protected-get", + "protected-instance-accessor", "protected-instance-field", "protected-instance-get", "protected-instance-method", @@ -94,19 +109,23 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "protected-method", "protected-readonly-field", "protected-set", + "protected-static-accessor", "protected-static-field", "protected-static-get", "protected-static-method", "protected-static-readonly-field", "protected-static-set", "protected-static-static-initialization", + "public-abstract-accessor", "public-abstract-field", "public-abstract-get", "public-abstract-method", "public-abstract-readonly-field", "public-abstract-set", "public-abstract-static-initialization", + "public-accessor", "public-constructor", + "public-decorated-accessor", "public-decorated-field", "public-decorated-get", "public-decorated-method", @@ -114,6 +133,7 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "public-decorated-set", "public-field", "public-get", + "public-instance-accessor", "public-instance-field", "public-instance-get", "public-instance-method", @@ -123,6 +143,7 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "public-method", "public-readonly-field", "public-set", + "public-static-accessor", "public-static-field", "public-static-get", "public-static-method", @@ -133,6 +154,7 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "readonly-signature", "set", "signature", + "static-accessor", "static-field", "static-get", "static-initialization", @@ -324,8 +346,10 @@ type OrderOptions = type OptionalityOrderOptions = 'optional-first' | 'required-first'; type AllItems = + | '#private-accessor' | '#private-field' | '#private-get' + | '#private-instance-accessor' | '#private-instance-field' | '#private-instance-get' | '#private-instance-method' @@ -335,20 +359,24 @@ type AllItems = | '#private-method' | '#private-readonly-field' | '#private-set' + | '#private-static-accessor' | '#private-static-field' | '#private-static-get' | '#private-static-method' | '#private-static-readonly-field' | '#private-static-set' | '#private-static-static-initialization' + | 'abstract-accessor' | 'abstract-field' | 'abstract-get' | 'abstract-method' | 'abstract-readonly-field' | 'abstract-set' | 'abstract-static-initialization' + | 'accessor' | 'call-signature' | 'constructor' + | 'decorated-accessor' | 'decorated-field' | 'decorated-get' | 'decorated-method' @@ -356,6 +384,7 @@ type AllItems = | 'decorated-set' | 'field' | 'get' + | 'instance-accessor' | 'instance-field' | 'instance-get' | 'instance-method' @@ -363,7 +392,9 @@ type AllItems = | 'instance-set' | 'instance-static-initialization' | 'method' + | 'private-accessor' | 'private-constructor' + | 'private-decorated-accessor' | 'private-decorated-field' | 'private-decorated-get' | 'private-decorated-method' @@ -371,6 +402,7 @@ type AllItems = | 'private-decorated-set' | 'private-field' | 'private-get' + | 'private-instance-accessor' | 'private-instance-field' | 'private-instance-get' | 'private-instance-method' @@ -380,19 +412,23 @@ type AllItems = | 'private-method' | 'private-readonly-field' | 'private-set' + | 'private-static-accessor' | 'private-static-field' | 'private-static-get' | 'private-static-method' | 'private-static-readonly-field' | 'private-static-set' | 'private-static-static-initialization' + | 'protected-abstract-accessor' | 'protected-abstract-field' | 'protected-abstract-get' | 'protected-abstract-method' | 'protected-abstract-readonly-field' | 'protected-abstract-set' | 'protected-abstract-static-initialization' + | 'protected-accessor' | 'protected-constructor' + | 'protected-decorated-accessor' | 'protected-decorated-field' | 'protected-decorated-get' | 'protected-decorated-method' @@ -400,6 +436,7 @@ type AllItems = | 'protected-decorated-set' | 'protected-field' | 'protected-get' + | 'protected-instance-accessor' | 'protected-instance-field' | 'protected-instance-get' | 'protected-instance-method' @@ -409,19 +446,23 @@ type AllItems = | 'protected-method' | 'protected-readonly-field' | 'protected-set' + | 'protected-static-accessor' | 'protected-static-field' | 'protected-static-get' | 'protected-static-method' | 'protected-static-readonly-field' | 'protected-static-set' | 'protected-static-static-initialization' + | 'public-abstract-accessor' | 'public-abstract-field' | 'public-abstract-get' | 'public-abstract-method' | 'public-abstract-readonly-field' | 'public-abstract-set' | 'public-abstract-static-initialization' + | 'public-accessor' | 'public-constructor' + | 'public-decorated-accessor' | 'public-decorated-field' | 'public-decorated-get' | 'public-decorated-method' @@ -429,6 +470,7 @@ type AllItems = | 'public-decorated-set' | 'public-field' | 'public-get' + | 'public-instance-accessor' | 'public-instance-field' | 'public-instance-get' | 'public-instance-method' @@ -438,6 +480,7 @@ type AllItems = | 'public-method' | 'public-readonly-field' | 'public-set' + | 'public-static-accessor' | 'public-static-field' | 'public-static-get' | 'public-static-method' @@ -448,6 +491,7 @@ type AllItems = | 'readonly-signature' | 'set' | 'signature' + | 'static-accessor' | 'static-field' | 'static-get' | 'static-initialization'