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

Commit 4373663

Browse files
authored
feat: pattern severity (#446)
* feat: introduce Pattern.severity * refactor: move readSeverity to lint_utlis * feat: read pattern severity from config * refactor: remove duplicate code * documentation: update changelog
1 parent accdb04 commit 4373663

File tree

44 files changed

+83
-103
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+83
-103
lines changed

CHANGELOG.md

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

55
* Add support for global rules-exclude
66
* Add `Halstead Volume` metric.
7+
* Add ability to configure anti-pattern severity
78

89
## 4.2.1
910

lib/src/analyzer_plugin/analyzer_plugin.dart

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,14 +208,9 @@ class MetricsAnalyzerPlugin extends ServerPlugin {
208208

209209
if (report != null) {
210210
result.addAll([
211-
...report.issues
212-
.map((issue) =>
213-
codeIssueToAnalysisErrorFixes(issue, analysisResult))
214-
.toList(),
215-
...report.antiPatternCases
216-
.map(designIssueToAnalysisErrorFixes)
217-
.toList(),
218-
]);
211+
...report.issues,
212+
...report.antiPatternCases,
213+
].map((issue) => codeIssueToAnalysisErrorFixes(issue, analysisResult)));
219214
}
220215

221216
// Temporary disable deprecation check

lib/src/analyzer_plugin/analyzer_plugin_utils.dart

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -58,26 +58,6 @@ plugin.AnalysisErrorFixes codeIssueToAnalysisErrorFixes(
5858
);
5959
}
6060

61-
plugin.AnalysisErrorFixes designIssueToAnalysisErrorFixes(Issue issue) =>
62-
plugin.AnalysisErrorFixes(plugin.AnalysisError(
63-
plugin.AnalysisErrorSeverity.INFO,
64-
plugin.AnalysisErrorType.HINT,
65-
plugin.Location(
66-
uriToPath(issue.location.sourceUrl) ?? '',
67-
issue.location.start.offset,
68-
issue.location.length,
69-
issue.location.start.line,
70-
issue.location.start.column,
71-
endLine: issue.location.end.line,
72-
endColumn: issue.location.end.column,
73-
),
74-
issue.message,
75-
issue.ruleId,
76-
correction: issue.verboseMessage,
77-
url: issue.documentation.toString(),
78-
hasFix: false,
79-
));
80-
8161
plugin.AnalysisErrorFixes metricReportToAnalysisErrorFixes(
8262
SourceLocation startLocation,
8363
int length,

lib/src/analyzers/lint_analyzer/anti_patterns/anti_patterns_list/long_method.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import 'package:analyzer/dart/ast/ast.dart';
22
import 'package:analyzer/dart/element/type.dart';
33

44
import '../../../../utils/node_utils.dart';
5+
import '../../lint_utils.dart';
56
import '../../metrics/metric_utils.dart';
67
import '../../metrics/metrics_list/source_lines_of_code/source_code_visitor.dart';
78
import '../../metrics/metrics_list/source_lines_of_code/source_lines_of_code_metric.dart';
89
import '../../models/entity_type.dart';
910
import '../../models/internal_resolved_unit_result.dart';
1011
import '../../models/issue.dart';
1112
import '../../models/scoped_function_declaration.dart';
13+
import '../../models/severity.dart';
1214
import '../../rules/flutter_rule_utils.dart';
1315
import '../models/obsolete_pattern.dart';
1416
import '../models/pattern_documentation.dart';
@@ -17,7 +19,7 @@ import '../pattern_utils.dart';
1719
class LongMethod extends ObsoletePattern {
1820
static const String patternId = 'long-method';
1921

20-
LongMethod()
22+
LongMethod([Map<String, Object> config = const {}])
2123
: super(
2224
id: patternId,
2325
documentation: const PatternDocumentation(
@@ -26,6 +28,7 @@ class LongMethod extends ObsoletePattern {
2628
'Long blocks of code are difficult to reuse and understand because they are usually responsible for more than one thing. Separating those to several short ones with proper names helps you reuse your code and understand it better without reading methods body.',
2729
supportedType: EntityType.methodEntity,
2830
),
31+
severity: readSeverity(config, Severity.none),
2932
);
3033

3134
@override

lib/src/analyzers/lint_analyzer/anti_patterns/anti_patterns_list/long_parameter_list.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import '../../../../utils/node_utils.dart';
2+
import '../../lint_utils.dart';
23
import '../../metrics/metric_utils.dart';
34
import '../../metrics/metrics_list/number_of_parameters_metric.dart';
45
import '../../models/entity_type.dart';
56
import '../../models/function_type.dart';
67
import '../../models/internal_resolved_unit_result.dart';
78
import '../../models/issue.dart';
89
import '../../models/scoped_function_declaration.dart';
10+
import '../../models/severity.dart';
911
import '../models/obsolete_pattern.dart';
1012
import '../models/pattern_documentation.dart';
1113
import '../pattern_utils.dart';
1214

1315
class LongParameterList extends ObsoletePattern {
1416
static const String patternId = 'long-parameter-list';
1517

16-
LongParameterList()
18+
LongParameterList([Map<String, Object> config = const {}])
1719
: super(
1820
id: patternId,
1921
documentation: const PatternDocumentation(
@@ -22,6 +24,7 @@ class LongParameterList extends ObsoletePattern {
2224
'Long parameter lists are difficult to understand and use. Wrapping them into an object allows grouping parameters and change transferred data only by the object modification.',
2325
supportedType: EntityType.methodEntity,
2426
),
27+
severity: readSeverity(config, Severity.none),
2528
);
2629

2730
@override

lib/src/analyzers/lint_analyzer/anti_patterns/models/obsolete_pattern.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ import '../../models/internal_resolved_unit_result.dart';
22
import '../../models/issue.dart';
33
import '../../models/report.dart';
44
import '../../models/scoped_function_declaration.dart';
5+
import '../../models/severity.dart';
56
import 'pattern.dart';
67
import 'pattern_documentation.dart';
78

89
abstract class ObsoletePattern extends Pattern {
910
const ObsoletePattern({
1011
required String id,
1112
required PatternDocumentation documentation,
13+
required Severity severity,
1214
}) : super(
1315
id: id,
1416
documentation: documentation,
17+
severity: severity,
1518
);
1619

1720
Iterable<Issue> legacyCheck(

lib/src/analyzers/lint_analyzer/anti_patterns/models/pattern.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import '../../models/internal_resolved_unit_result.dart';
22
import '../../models/issue.dart';
33
import '../../models/report.dart';
4+
import '../../models/severity.dart';
45
import 'pattern_documentation.dart';
56

67
/// An interface to communicate with a patterns
@@ -13,9 +14,13 @@ abstract class Pattern {
1314
/// The documentation associated with the pattern
1415
final PatternDocumentation documentation;
1516

17+
/// The severity of issues emitted by the pattern
18+
final Severity severity;
19+
1620
const Pattern({
1721
required this.id,
1822
required this.documentation,
23+
required this.severity,
1924
});
2025

2126
/// Returns [Iterable] with [Issue]'s detected while check the passed [source]

lib/src/analyzers/lint_analyzer/anti_patterns/pattern_utils.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'package:source_span/source_span.dart';
33

44
import '../models/issue.dart';
55
import '../models/scoped_function_declaration.dart';
6-
import '../models/severity.dart';
76
import 'models/pattern.dart';
87

98
Issue createIssue({
@@ -16,7 +15,7 @@ Issue createIssue({
1615
ruleId: pattern.id,
1716
documentation: documentation(pattern),
1817
location: location,
19-
severity: Severity.none,
18+
severity: pattern.severity,
2019
message: message,
2120
verboseMessage: verboseMessage,
2221
);

lib/src/analyzers/lint_analyzer/anti_patterns/patterns_factory.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import 'models/obsolete_pattern.dart';
44

55
final _implementedPatterns =
66
<String, ObsoletePattern Function(Map<String, Object>)>{
7-
LongMethod.patternId: (config) => LongMethod(),
8-
LongParameterList.patternId: (config) => LongParameterList(),
7+
LongMethod.patternId: (config) => LongMethod(config),
8+
LongParameterList.patternId: (config) => LongParameterList(config),
99
};
1010

1111
Iterable<ObsoletePattern> get allPatterns =>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'models/severity.dart';
2+
3+
/// Returns a [Severity] from map based [config] otherwise [defaultValue]
4+
Severity readSeverity(Map<String, Object?> config, Severity defaultValue) =>
5+
Severity.fromString(config['severity'] as String?) ?? defaultValue;

0 commit comments

Comments
 (0)