Skip to content
This repository was archived by the owner on Jul 16, 2023. It is now read-only.

Commit c515313

Browse files
feat: rename member-ordering-extended to member-ordering (#1041)
* chore: bump dorny/test-reporter from 1.5.0 to 1.6.0 (#1037) Bumps [dorny/test-reporter](https://github.com/dorny/test-reporter) from 1.5.0 to 1.6.0. - [Release notes](https://github.com/dorny/test-reporter/releases) - [Changelog](https://github.com/dorny/test-reporter/blob/main/CHANGELOG.md) - [Commits](dorny/test-reporter@v1.5.0...v1.6.0) --- updated-dependencies: - dependency-name: dorny/test-reporter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: rename member-ordering-extended to member-ordering * fix: update imports * fix: update imports * test: update tests * test: update tests Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1 parent 64f8d3f commit c515313

29 files changed

+654
-1344
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
* feat: **Breaking change** rename `member-ordering-extended` to `member-ordering`, discarding the old implementation.
56
* feat: support report to the json file option for the `analyze` command.
67
* feat: make CliRunner a part of public API in order to support transitive executable calls use-case.
78
* feat: add static code diagnostic [`avoid-cascade-after-if-null`](https://dartcodemetrics.dev/docs/rules/common/avoid-cascade-after-if-null).

lib/presets/dart_all.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dart_code_metrics:
2323
- binary-expression-operand-order
2424
- double-literal-format
2525
- format-comment
26-
- member-ordering-extended
26+
- member-ordering
2727
- newline-before-return
2828
- no-boolean-literal-compare
2929
- no-empty-block

lib/src/analyzers/lint_analyzer/rules/rules_factory.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import 'rules_list/consistent_update_render_object/consistent_update_render_obje
3535
import 'rules_list/double_literal_format/double_literal_format_rule.dart';
3636
import 'rules_list/format_comment/format_comment_rule.dart';
3737
import 'rules_list/member_ordering/member_ordering_rule.dart';
38-
import 'rules_list/member_ordering_extended/member_ordering_extended_rule.dart';
3938
import 'rules_list/missing_test_assertion/missing_test_assertion_rule.dart';
4039
import 'rules_list/newline_before_return/newline_before_return_rule.dart';
4140
import 'rules_list/no_boolean_literal_compare/no_boolean_literal_compare_rule.dart';
@@ -111,7 +110,6 @@ final _implementedRules = <String, Rule Function(Map<String, Object>)>{
111110
DoubleLiteralFormatRule.ruleId: DoubleLiteralFormatRule.new,
112111
FormatCommentRule.ruleId: FormatCommentRule.new,
113112
MemberOrderingRule.ruleId: MemberOrderingRule.new,
114-
MemberOrderingExtendedRule.ruleId: MemberOrderingExtendedRule.new,
115113
MissingTestAssertionRule.ruleId: MissingTestAssertionRule.new,
116114
NewlineBeforeReturnRule.ruleId: NewlineBeforeReturnRule.new,
117115
NoBooleanLiteralCompareRule.ruleId: NoBooleanLiteralCompareRule.new,
Lines changed: 109 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,117 @@
11
part of 'member_ordering_rule.dart';
22

33
class _ConfigParser {
4-
static const _orderConfig = 'order';
5-
6-
static List<_MembersGroup> parseOrder(Map<String, Object> config) {
7-
final order = config[_orderConfig] is Iterable
8-
? List<String>.from(config[_orderConfig] as Iterable)
9-
: <String>[];
10-
11-
return order.isEmpty
12-
? _MembersGroup._groupsOrder
13-
: order
14-
.map((group) => group.snakeCaseToKebab())
15-
.map(_MembersGroup.parse)
16-
.whereNotNull()
17-
.toList();
4+
static const _defaultOrderList = [
5+
'public-fields',
6+
'private-fields',
7+
'public-getters',
8+
'private-getters',
9+
'public-setters',
10+
'private-setters',
11+
'constructors',
12+
'public-methods',
13+
'private-methods',
14+
];
15+
16+
static final _regExp = RegExp(
17+
'(overridden-|protected-)?(private-|public-)?(static-)?(late-)?'
18+
'(var-|final-|const-)?(nullable-)?(named-)?(factory-)?(build-)?'
19+
'(init-state-)?(did-change-dependencies-)?(did-update-widget-)?'
20+
'(dispose-)?',
21+
);
22+
23+
static List<_MemberGroup> parseOrder(Map<String, Object> config) {
24+
final order = config['order'] is Iterable
25+
? List<String>.from(config['order'] as Iterable)
26+
: _defaultOrderList;
27+
28+
return order.map(_parseGroup).whereNotNull().toList();
1829
}
1930

2031
static bool parseAlphabetize(Map<String, Object> config) =>
2132
(config['alphabetize'] as bool?) ?? false;
33+
34+
static bool parseAlphabetizeByType(Map<String, Object> config) =>
35+
(config['alphabetize-by-type'] as bool?) ?? false;
36+
37+
// ignore: long-method
38+
static _MemberGroup? _parseGroup(String group) {
39+
final lastGroup = group.endsWith('getters-setters')
40+
? 'getters-setters'
41+
: group.split('-').lastOrNull;
42+
final type = _MemberType.parse(lastGroup);
43+
final result = _regExp.allMatches(group.toLowerCase());
44+
45+
final hasGroups = result.isNotEmpty && result.first.groupCount > 0;
46+
if (hasGroups && type != null) {
47+
final match = result.first;
48+
49+
final annotation = _Annotation.parse(match.group(1)?.replaceAll('-', ''));
50+
final modifier = _Modifier.parse(match.group(2)?.replaceAll('-', ''));
51+
final isStatic = match.group(3) != null;
52+
final isLate = match.group(4) != null;
53+
final keyword = _FieldKeyword.parse(match.group(5)?.replaceAll('-', ''));
54+
final isNullable = match.group(6) != null;
55+
final isNamed = match.group(7) != null;
56+
final isFactory = match.group(8) != null;
57+
final isBuild = match.group(9) != null;
58+
final isInitState = match.group(10) != null;
59+
final isDidChangeDependencies = match.group(11) != null;
60+
final isDidUpdateWidget = match.group(12) != null;
61+
final isDispose = match.group(13) != null;
62+
63+
switch (type) {
64+
case _MemberType.field:
65+
return _FieldMemberGroup._(
66+
isLate: isLate,
67+
isNullable: isNullable,
68+
isStatic: isStatic,
69+
keyword: keyword,
70+
annotation: annotation,
71+
memberType: type,
72+
modifier: modifier,
73+
rawRepresentation: group,
74+
);
75+
76+
case _MemberType.method:
77+
return _MethodMemberGroup._(
78+
isNullable: isNullable,
79+
isStatic: isStatic,
80+
isBuild: isBuild,
81+
isInitState: isInitState,
82+
isDidChangeDependencies: isDidChangeDependencies,
83+
isDidUpdateWidget: isDidUpdateWidget,
84+
isDispose: isDispose,
85+
annotation: annotation,
86+
memberType: type,
87+
modifier: modifier,
88+
rawRepresentation: group,
89+
);
90+
91+
case _MemberType.getter:
92+
case _MemberType.setter:
93+
case _MemberType.getterAndSetter:
94+
return _GetSetMemberGroup._(
95+
isNullable: isNullable,
96+
isStatic: isStatic,
97+
annotation: annotation,
98+
memberType: type,
99+
modifier: modifier,
100+
rawRepresentation: group,
101+
);
102+
103+
case _MemberType.constructor:
104+
return _ConstructorMemberGroup._(
105+
isNamed: isFactory || isNamed,
106+
isFactory: isFactory,
107+
annotation: annotation,
108+
memberType: type,
109+
modifier: modifier,
110+
rawRepresentation: group,
111+
);
112+
}
113+
}
114+
115+
return null;
116+
}
22117
}

lib/src/analyzers/lint_analyzer/rules/rules_list/member_ordering/member_ordering_rule.dart

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
import 'package:analyzer/dart/ast/ast.dart';
44
import 'package:analyzer/dart/ast/visitor.dart';
5+
import 'package:analyzer/dart/element/nullability_suffix.dart';
56
import 'package:collection/collection.dart';
67

8+
import '../../../../../utils/flutter_types_utils.dart';
79
import '../../../../../utils/node_utils.dart';
8-
import '../../../../../utils/string_extensions.dart';
910
import '../../../lint_utils.dart';
1011
import '../../../models/internal_resolved_unit_result.dart';
1112
import '../../../models/issue.dart';
@@ -14,22 +15,29 @@ import '../../models/common_rule.dart';
1415
import '../../rule_utils.dart';
1516

1617
part 'config_parser.dart';
18+
part 'models/annotation.dart';
19+
part 'models/field_keyword.dart';
20+
part 'models/member_group.dart';
21+
part 'models/member_type.dart';
22+
part 'models/modifier.dart';
1723
part 'visitor.dart';
1824

19-
// Inspired by TSLint (https://palantir.github.io/tslint/rules/member-ordering/)
20-
2125
class MemberOrderingRule extends CommonRule {
2226
static const ruleId = 'member-ordering';
2327

2428
static const _warningMessage = 'should be before';
2529
static const _warningAlphabeticalMessage = 'should be alphabetically before';
30+
static const _warningTypeAlphabeticalMessage =
31+
'type name should be alphabetically before';
2632

27-
final List<_MembersGroup> _groupsOrder;
33+
final List<_MemberGroup> _groupsOrder;
2834
final bool _alphabetize;
35+
final bool _alphabetizeByType;
2936

3037
MemberOrderingRule([Map<String, Object> config = const {}])
3138
: _groupsOrder = _ConfigParser.parseOrder(config),
3239
_alphabetize = _ConfigParser.parseAlphabetize(config),
40+
_alphabetizeByType = _ConfigParser.parseAlphabetizeByType(config),
3341
super(
3442
id: ruleId,
3543
severity: readSeverity(config, Severity.style),
@@ -55,7 +63,7 @@ class MemberOrderingRule extends CommonRule {
5563
withCommentOrMetadata: true,
5664
),
5765
message:
58-
'${info.memberOrder.memberGroup.name} $_warningMessage ${info.memberOrder.previousMemberGroup?.name}.',
66+
'${info.memberOrder.memberGroup} $_warningMessage ${info.memberOrder.previousMemberGroup}.',
5967
),
6068
),
6169
if (_alphabetize)
@@ -75,6 +83,19 @@ class MemberOrderingRule extends CommonRule {
7583
'${names.currentName} $_warningAlphabeticalMessage ${names.previousName}.',
7684
);
7785
}),
86+
if (!_alphabetize && _alphabetizeByType)
87+
...membersInfo.where((info) => info.memberOrder.isByTypeWrong).map(
88+
(info) => createIssue(
89+
rule: this,
90+
location: nodeLocation(
91+
node: info.classMember,
92+
source: source,
93+
withCommentOrMetadata: true,
94+
),
95+
message:
96+
'${info.memberOrder.memberNames.currentName} $_warningTypeAlphabeticalMessage ${info.memberOrder.memberNames.previousName}.',
97+
),
98+
),
7899
];
79100
}
80101
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
part of '../member_ordering_extended_rule.dart';
1+
part of '../member_ordering_rule.dart';
22

33
class _Annotation {
44
final String name;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
part of '../member_ordering_extended_rule.dart';
1+
part of '../member_ordering_rule.dart';
22

33
class _FieldKeyword {
44
final String type;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
part of '../member_ordering_extended_rule.dart';
1+
part of '../member_ordering_rule.dart';
22

33
abstract class _MemberGroup {
44
final _Annotation annotation;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
part of '../member_ordering_extended_rule.dart';
1+
part of '../member_ordering_rule.dart';
22

33
class _MemberType {
44
final String type;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
part of '../member_ordering_extended_rule.dart';
1+
part of '../member_ordering_rule.dart';
22

33
class _Modifier {
44
final String type;

0 commit comments

Comments
 (0)