diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f3c665d91..07fbeb2ebd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * feat: add [`avoid-banned-imports`](https://dartcodemetrics.dev/docs/rules/common/avoid-banned-imports) rule * fix: resolve package with imported analysis options. * feat: add configuration to [`prefer-extracting-callbacks`](https://dartcodemetrics.dev/docs/rules/flutter/prefer-extracting-callbacks) +* feat: improve [`checkstyle`](https://dartcodemetrics.dev/docs/cli/analyze#checkstyle) report, added metrics entries. ## 4.15.2 diff --git a/lib/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter.dart b/lib/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter.dart index 41c86d5a38..0a69be64a7 100644 --- a/lib/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter.dart +++ b/lib/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:xml/xml.dart'; import '../../../../../reporters/models/checkstyle_reporter.dart'; +import '../../../metrics/models/metric_value_level.dart'; import '../../../models/lint_file_report.dart'; import '../../../models/severity.dart'; import '../../../models/summary_lint_report_record.dart'; @@ -39,22 +40,8 @@ class LintCheckstyleReporter extends CheckstyleReporter 0) - 'column': '${locationStart.column}', - 'severity': _severityMapping[issue.severity] ?? 'ignore', - 'message': issue.message, - 'source': issue.ruleId, - }, - ); - } + _reportIssues(builder, record); + _reportMetrics(builder, record); }, ); } @@ -63,14 +50,84 @@ class LintCheckstyleReporter extends CheckstyleReporter 0) 'column': '${locationStart.column}', + 'severity': _issueSeverityMapping[issue.severity] ?? 'ignore', + 'message': issue.message, + 'source': issue.ruleId, + }, + ); + } + } + + void _reportMetrics(XmlBuilder builder, LintFileReport record) { + for (final metric in record.file.metrics) { + if (_isMetricNeedToReport(metric.level)) { + builder.element( + 'error', + attributes: { + 'line': '0', + 'severity': _metricSeverityMapping[metric.level] ?? 'ignore', + 'message': metric.comment, + 'source': metric.metricsId, + }, + ); + } + } + + final metricRecords = + {...record.classes, ...record.functions}.entries.toList(); + for (final record in metricRecords) { + if (!_isMetricNeedToReport(record.value.metricsLevel)) { + continue; + } + + final location = record.value.location; + + for (final metricValue in record.value.metrics) { + builder.element( + 'error', + attributes: { + 'line': '${location.start.line}', + if (record.value.location.start.column > 0) + 'column': '${record.value.location.start.column}', + 'severity': _metricSeverityMapping[metricValue.level] ?? 'ignore', + 'message': metricValue.comment, + 'source': metricValue.metricsId, + }, + ); + } + } + } + bool _needToReport(LintFileReport report) => - report.issues.isNotEmpty || report.antiPatternCases.isNotEmpty; + report.issues.isNotEmpty || + report.antiPatternCases.isNotEmpty || + _isMetricNeedToReport(report.file.metricsLevel); + + bool _isMetricNeedToReport(MetricValueLevel level) => + level > MetricValueLevel.none; } -const _severityMapping = { +const _issueSeverityMapping = { Severity.error: 'error', Severity.warning: 'warning', Severity.style: 'info', Severity.performance: 'warning', Severity.none: 'ignore', }; + +const _metricSeverityMapping = { + MetricValueLevel.alarm: 'error', + MetricValueLevel.warning: 'warning', + MetricValueLevel.noted: 'info', + MetricValueLevel.none: 'ignore', +}; diff --git a/test/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter_test.dart b/test/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter_test.dart index e8fdec2f85..f568f9fae2 100644 --- a/test/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter_test.dart +++ b/test/src/analyzers/lint_analyzer/reporters/reporters_list/checkstyle/lint_checkstyle_reporter_test.dart @@ -35,22 +35,41 @@ void main() { final file = report.findAllElements('file'); expect( file.first.getAttribute('name'), + equals('test/resources/abstract_class.dart'), + ); + expect( + file.last.getAttribute('name'), equals('test/resources/class_with_factory_constructors.dart'), ); - final errors = report.findAllElements('error'); + var errors = file.first.findAllElements('error').toList(); + expect(errors.first.getAttribute('line'), equals('0')); + expect(errors.first.getAttribute('severity'), equals('warning')); + expect(errors.first.getAttribute('message'), equals('metric comment')); + expect(errors.first.getAttribute('source'), equals('file-metric-id')); + expect(errors.last.getAttribute('line'), equals('0')); + expect(errors.last.getAttribute('severity'), equals('error')); + expect(errors.last.getAttribute('message'), equals('metric comment')); + expect(errors.last.getAttribute('source'), equals('id')); + + errors = file.last.findAllElements('error').toList(); expect(errors.first.getAttribute('line'), equals('0')); expect(errors.first.getAttribute('severity'), equals('warning')); expect(errors.first.getAttribute('message'), equals('simple message')); expect(errors.first.getAttribute('source'), equals('id')); - expect(errors.last.getAttribute('line'), equals('0')); - expect(errors.last.getAttribute('severity'), equals('info')); + expect(errors[1].getAttribute('line'), equals('0')); + expect(errors[1].getAttribute('severity'), equals('info')); expect( - errors.last.getAttribute('message'), + errors[1].getAttribute('message'), equals('simple design message'), ); - expect(errors.last.getAttribute('source'), equals('designId')); + expect(errors[1].getAttribute('source'), equals('designId')); + + expect(errors.last.getAttribute('line'), equals('0')); + expect(errors.last.getAttribute('severity'), equals('warning')); + expect(errors.last.getAttribute('message'), equals('metric comment')); + expect(errors.last.getAttribute('source'), equals('id')); }); }); }