Skip to content

Commit b209f4e

Browse files
change default named parameters ordering in rule config and test
extract models from visitor into their separate files rename some ParameterType enums to avoid using dart keywords add ParameterType.fromType remove unnecessary base class from documentation text perf(rule): make visitor a class member to avoid recreating new instance update test with new default ordering
1 parent 8b5293e commit b209f4e

File tree

8 files changed

+112
-98
lines changed

8 files changed

+112
-98
lines changed

lib/src/lints/named_parameters_ordering/config_parser.dart

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,13 @@
2121
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2222
// SOFTWARE.
2323

24-
import 'package:collection/collection.dart';
2524
import 'package:solid_lints/src/lints/named_parameters_ordering/models/parameter_type.dart';
2625

2726
/// Helper class to parse member_ordering rule config
2827
class NamedParametersConfigParser {
2928
static const _defaultOrderList = [
30-
'super',
3129
'required_super',
30+
'super',
3231
'required',
3332
'nullable',
3433
'default',
@@ -40,12 +39,6 @@ class NamedParametersConfigParser {
4039
? List<String>.from(orderConfig)
4140
: _defaultOrderList;
4241

43-
return order
44-
.map(
45-
(type) =>
46-
ParameterType.values.firstWhereOrNull((o) => o.type == type),
47-
)
48-
.nonNulls
49-
.toList();
42+
return order.map(ParameterType.fromType).nonNulls.toList();
5043
}
5144
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:analyzer/dart/ast/ast.dart';
2+
import 'package:solid_lints/src/lints/named_parameters_ordering/models/parameter_ordering_info.dart';
3+
4+
/// Data class that holds AST function parameter and it's order info
5+
class ParameterInfo {
6+
/// AST instance of an [FormalParameter]
7+
final FormalParameter formalParameter;
8+
9+
/// Function parameter order info
10+
final ParameterOrderingInfo parameterOrderingInfo;
11+
12+
/// Creates instance of an [ParameterInfo]
13+
const ParameterInfo({
14+
required this.formalParameter,
15+
required this.parameterOrderingInfo,
16+
});
17+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:solid_lints/src/lints/named_parameters_ordering/models/parameter_type.dart';
2+
3+
/// Data class holds information about parameter order info
4+
class ParameterOrderingInfo {
5+
/// Indicates if order is wrong
6+
final bool isWrong;
7+
8+
/// Info about current parameter parameter type
9+
final ParameterType parameterType;
10+
11+
/// Info about previous parameter parameter type
12+
final ParameterType? previousParameterType;
13+
14+
/// Creates instance of [ParameterOrderingInfo]
15+
const ParameterOrderingInfo({
16+
required this.isWrong,
17+
required this.parameterType,
18+
required this.previousParameterType,
19+
});
20+
}

lib/src/lints/named_parameters_ordering/models/parameter_type.dart

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
1+
import 'package:collection/collection.dart';
2+
13
/// Represents a function parameter type
24
enum ParameterType {
3-
/// Super parameter type (super.parameterName)
4-
super$('super'),
5+
/// Inherited (super) parameter type (super.parameterName)
6+
inherited('super'),
57

6-
/// Required super parameter type (required super.parameterName)
7-
requiredSuper('required_super'),
8+
/// Required inherited (super) parameter type (required super.parameterName)
9+
requiredInherited('required_super'),
810

911
/// Required parameter type (required String parameterName)
1012
required('required'),
1113

1214
/// Nullable parameter type (String? parameterName)
1315
nullable('nullable'),
1416

15-
/// Default parameter type (String parameterName = 'defaultValue')
16-
default$('default');
17+
/// Default value parameter type (String parameterName = 'defaultValue')
18+
defaultValue('default');
19+
20+
/// Returns [ParameterType] from type or null if not found
21+
static ParameterType? fromType(String type) {
22+
return values.firstWhereOrNull((o) => o.type == type);
23+
}
1724

1825
/// String representation of the parameter type
1926
final String type;

lib/src/lints/named_parameters_ordering/named_parameters_ordering_rule.dart

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:analyzer/error/listener.dart';
22
import 'package:custom_lint_builder/custom_lint_builder.dart';
33
import 'package:solid_lints/src/lints/named_parameters_ordering/models/named_parameters_ordering_parameters.dart';
4+
import 'package:solid_lints/src/lints/named_parameters_ordering/models/parameter_ordering_info.dart';
45
import 'package:solid_lints/src/lints/named_parameters_ordering/visitors/named_parameters_ordering_visitor.dart';
56
import 'package:solid_lints/src/models/rule_config.dart';
67
import 'package:solid_lints/src/models/solid_lint_rule.dart';
@@ -41,16 +42,6 @@ import 'package:solid_lints/src/models/solid_lint_rule.dart';
4142
/// #### BAD:
4243
///
4344
/// ```dart
44-
/// class User {
45-
/// final String accountType;
46-
/// final String? userId;
47-
///
48-
/// User({
49-
/// required this.accountType,
50-
/// this.userId,
51-
/// });
52-
/// }
53-
///
5445
/// class UserProfile extends User {
5546
/// final String? age;
5647
/// final String? country;
@@ -82,16 +73,6 @@ import 'package:solid_lints/src/models/solid_lint_rule.dart';
8273
/// #### GOOD:
8374
///
8475
/// ```dart
85-
/// class User {
86-
/// final String accountType;
87-
/// final String? userId;
88-
///
89-
/// User({
90-
/// required this.accountType,
91-
/// this.userId,
92-
/// });
93-
/// }
94-
///
9576
/// class UserProfile extends User {
9677
/// final String? age;
9778
/// final String? country;
@@ -121,11 +102,10 @@ import 'package:solid_lints/src/models/solid_lint_rule.dart';
121102
/// ```
122103
class NamedParametersOrderingRule
123104
extends SolidLintRule<NamedParametersOrderingParameters> {
124-
/// This lint rule represents
125-
/// the error whether we use bad formatted double literals.
105+
/// The name of this lint rule.
126106
static const lintName = 'named_parameters_ordering';
127107

128-
static const _warningMessage = 'should be before';
108+
late final _visitor = NamedParametersOrderingVisitor(config.parameters.order);
129109

130110
NamedParametersOrderingRule._(super.config);
131111

@@ -149,9 +129,7 @@ class NamedParametersOrderingRule
149129
CustomLintContext context,
150130
) {
151131
context.registry.addFormalParameterList((node) {
152-
final visitor = NamedParametersOrderingVisitor(config.parameters.order);
153-
154-
final parametersInfo = visitor.visitFormalParameterList(node);
132+
final parametersInfo = _visitor.visitFormalParameterList(node);
155133

156134
final wrongOrderParameters = parametersInfo.where(
157135
(info) => info.parameterOrderingInfo.isWrong,
@@ -173,7 +151,7 @@ class NamedParametersOrderingRule
173151
return LintCode(
174152
name: lintName,
175153
problemMessage: "${parameterOrdering.displayName} named parameters"
176-
" $_warningMessage "
154+
" should be before "
177155
"${previousParameterOrdering!.displayName} named parameters.",
178156
);
179157
}

lib/src/lints/named_parameters_ordering/visitors/named_parameters_ordering_visitor.dart

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
import 'package:analyzer/dart/ast/ast.dart' hide Annotation;
2525
import 'package:analyzer/dart/ast/visitor.dart';
26+
import 'package:solid_lints/src/lints/named_parameters_ordering/models/parameter_info.dart';
27+
import 'package:solid_lints/src/lints/named_parameters_ordering/models/parameter_ordering_info.dart';
2628
import 'package:solid_lints/src/lints/named_parameters_ordering/models/parameter_type.dart';
2729

2830
/// AST Visitor which finds all methods, functions and constructor named
@@ -88,11 +90,13 @@ class NamedParametersOrderingVisitor
8890

8991
switch (parameter) {
9092
case SuperFormalParameter(:final isRequired):
91-
return isRequired ? ParameterType.requiredSuper : ParameterType.super$;
93+
return isRequired
94+
? ParameterType.requiredInherited
95+
: ParameterType.inherited;
9296

9397
case DefaultFormalParameter():
9498
case _ when hasDefaultValue:
95-
return ParameterType.default$;
99+
return ParameterType.defaultValue;
96100

97101
case FieldFormalParameter(:final isRequired) ||
98102
FunctionTypedFormalParameter(:final isRequired) ||
@@ -110,37 +114,3 @@ class NamedParametersOrderingVisitor
110114
_parametersOrder.indexOf(currentParameterType);
111115
}
112116
}
113-
114-
/// Data class that holds AST function parameter and it's order info
115-
class ParameterInfo {
116-
/// AST instance of an [FormalParameter]
117-
final FormalParameter formalParameter;
118-
119-
/// Function parameter order info
120-
final ParameterOrderingInfo parameterOrderingInfo;
121-
122-
/// Creates instance of an [ParameterInfo]
123-
const ParameterInfo({
124-
required this.formalParameter,
125-
required this.parameterOrderingInfo,
126-
});
127-
}
128-
129-
/// Data class holds information about parameter order info
130-
class ParameterOrderingInfo {
131-
/// Indicates if order is wrong
132-
final bool isWrong;
133-
134-
/// Info about current parameter parameter type
135-
final ParameterType parameterType;
136-
137-
/// Info about previous parameter parameter type
138-
final ParameterType? previousParameterType;
139-
140-
/// Creates instance of [ParameterOrderingInfo]
141-
const ParameterOrderingInfo({
142-
required this.isWrong,
143-
required this.parameterType,
144-
required this.previousParameterType,
145-
});
146-
}

lint_test/analysis_options.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ custom_lint:
8484
- avoid_final_with_getter
8585
- named_parameters_ordering:
8686
order:
87-
- required
8887
- required_super
89-
- default
90-
- nullable
9188
- super
89+
- required
90+
- nullable
91+
- default
Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// ignore_for_file: unused_field, prefer_match_file_name, proper_super_calls, number_of_parameters
1+
// ignore_for_file: unused_field, prefer_match_file_name, proper_super_calls, number_of_parameters, avoid_unused_parameters, member_ordering
22
// ignore_for_file: unused_element
33
// ignore_for_file: no_empty_block
44

@@ -21,84 +21,113 @@ class UserProfile extends User {
2121
final String email;
2222
final bool isActive;
2323
final String name;
24+
final String? profileId;
2425

2526
// no lint
26-
UserProfile.orderedConstructor({
27+
UserProfile.orderedConstructor(
28+
this.profileId, {
29+
required super.accountType,
30+
super.userId,
2731
required this.name,
2832
required this.email,
29-
required super.accountType,
30-
this.isActive = true,
3133
this.age,
3234
this.country,
33-
super.userId,
35+
this.isActive = true,
3436
});
3537

36-
UserProfile.partiallyOrderedConstructor({
38+
UserProfile.partiallyOrderedConstructor(
39+
this.profileId, {
3740
required super.accountType,
38-
// expect_lint: named_parameters_ordering
3941
required this.email,
4042
this.age,
4143
// expect_lint: named_parameters_ordering
4244
required this.name,
4345
this.country,
4446
// expect_lint: named_parameters_ordering
45-
this.isActive = true,
4647
super.userId,
48+
this.isActive = true,
4749
});
4850

49-
UserProfile.unorderedConstructor({
51+
UserProfile.unorderedConstructor(
52+
String profileId, {
5053
this.age,
5154
// expect_lint: named_parameters_ordering
52-
required super.accountType,
53-
// expect_lint: named_parameters_ordering
54-
required this.name,
5555
super.userId,
5656
// expect_lint: named_parameters_ordering
57+
required super.accountType,
5758
this.country,
5859
// expect_lint: named_parameters_ordering
60+
required this.name,
5961
this.isActive = true,
6062
// expect_lint: named_parameters_ordering
6163
required this.email,
62-
});
64+
}) : profileId = profileId;
6365

66+
// no lint
6467
void orderedMethod({
6568
required String name,
6669
required String email,
67-
bool isActive = true,
6870
int? age,
71+
bool isActive = true,
6972
}) {
7073
return;
7174
}
7275

7376
void partiallyOrderedMethod({
7477
required String name,
75-
required String email,
7678
int? age,
7779
// expect_lint: named_parameters_ordering
80+
required String email,
7881
bool isActive = true,
7982
}) {
8083
return;
8184
}
8285

8386
void unorderedMethod({
84-
required String name,
8587
int? age,
8688
// expect_lint: named_parameters_ordering
89+
required String email,
8790
bool isActive = true,
8891
// expect_lint: named_parameters_ordering
92+
required String name,
93+
}) {
94+
return;
95+
}
96+
97+
void mixedParameters(
98+
String accountType,
99+
String? userId, {
100+
int? age,
101+
// expect_lint: named_parameters_ordering
89102
required String email,
103+
bool isActive = true,
104+
// expect_lint: named_parameters_ordering
105+
required String name,
90106
}) {
91107
return;
92108
}
93109
}
94110

95111
void functionExample({
96112
required String name,
113+
bool isActive = true,
114+
// expect_lint: named_parameters_ordering
97115
int? age,
98116
// expect_lint: named_parameters_ordering
99-
bool isActive = true,
117+
required String email,
118+
}) {
119+
return;
120+
}
121+
122+
void mixedParameters(
123+
String accountType,
124+
String? userId, {
125+
int? age,
100126
// expect_lint: named_parameters_ordering
101127
required String email,
128+
bool isActive = true,
129+
// expect_lint: named_parameters_ordering
130+
required String name,
102131
}) {
103132
return;
104133
}

0 commit comments

Comments
 (0)