From 47def3a33cd685ee138e7089ca7a2933b366bbaf Mon Sep 17 00:00:00 2001 From: Dmitry Zhifarsky Date: Tue, 14 Jun 2022 23:33:37 +0400 Subject: [PATCH 1/2] fix: change elements equality check to overcome incorreclt libs resolution --- .../unused_code_analyzer.dart | 24 +++++++++++++++++-- .../library/entry_point.dart | 1 + .../library/resources/app_icons.dart | 7 ++++++ .../library/resources/app_strings.dart | 7 ++++++ .../library/resources/resources.dart | 2 ++ .../library/src/usage.dart | 6 +++++ .../unused_code_analyzer_test.dart | 16 ++++++++++++- 7 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 test/resources/unused_code_analyzer/library/entry_point.dart create mode 100644 test/resources/unused_code_analyzer/library/resources/app_icons.dart create mode 100644 test/resources/unused_code_analyzer/library/resources/app_strings.dart create mode 100644 test/resources/unused_code_analyzer/library/resources/resources.dart create mode 100644 test/resources/unused_code_analyzer/library/src/usage.dart diff --git a/lib/src/analyzers/unused_code_analyzer/unused_code_analyzer.dart b/lib/src/analyzers/unused_code_analyzer/unused_code_analyzer.dart index ac2687d441..a9d0183f9c 100644 --- a/lib/src/analyzers/unused_code_analyzer/unused_code_analyzer.dart +++ b/lib/src/analyzers/unused_code_analyzer/unused_code_analyzer.dart @@ -169,8 +169,28 @@ class UnusedCodeAnalyzer { } bool _isUsed(Element usedElement, Element element) => - element == usedElement || - element is PropertyInducingElement && element.getter == usedElement; + _isEqualElements(usedElement, element) || + element is PropertyInducingElement && + _isEqualElements(usedElement, element.getter); + + bool _isEqualElements(Element left, Element? right) { + if (left == right) { + return true; + } + + final usedLibrary = left.library; + final declaredSource = right?.librarySource; + + // This is a hack to fix incorrect libraries resolution. + // Should be removed after new analyzer version is available. + // see: https://github.com/dart-lang/sdk/issues/49182 + return usedLibrary != null && + declaredSource != null && + left.name == right?.name && + usedLibrary.units + .map((unit) => unit.source.fullName) + .contains(declaredSource.fullName); + } bool _isUnused( FileElementsUsage codeUsages, diff --git a/test/resources/unused_code_analyzer/library/entry_point.dart b/test/resources/unused_code_analyzer/library/entry_point.dart new file mode 100644 index 0000000000..658ccdf374 --- /dev/null +++ b/test/resources/unused_code_analyzer/library/entry_point.dart @@ -0,0 +1 @@ +export 'src/usage.dart'; diff --git a/test/resources/unused_code_analyzer/library/resources/app_icons.dart b/test/resources/unused_code_analyzer/library/resources/app_icons.dart new file mode 100644 index 0000000000..0f35559539 --- /dev/null +++ b/test/resources/unused_code_analyzer/library/resources/app_icons.dart @@ -0,0 +1,7 @@ +part of 'resources.dart'; + +class AppIcons { + AppIcons._(); + + static const String authError = 'assets/icons/auth_error.svg'; +} diff --git a/test/resources/unused_code_analyzer/library/resources/app_strings.dart b/test/resources/unused_code_analyzer/library/resources/app_strings.dart new file mode 100644 index 0000000000..e728337280 --- /dev/null +++ b/test/resources/unused_code_analyzer/library/resources/app_strings.dart @@ -0,0 +1,7 @@ +part of 'resources.dart'; + +class AppStrings { + AppStrings._(); + + static const String title = 'Application title'; +} diff --git a/test/resources/unused_code_analyzer/library/resources/resources.dart b/test/resources/unused_code_analyzer/library/resources/resources.dart new file mode 100644 index 0000000000..480bc527bb --- /dev/null +++ b/test/resources/unused_code_analyzer/library/resources/resources.dart @@ -0,0 +1,2 @@ +part 'app_icons.dart'; +part 'app_strings.dart'; diff --git a/test/resources/unused_code_analyzer/library/src/usage.dart b/test/resources/unused_code_analyzer/library/src/usage.dart new file mode 100644 index 0000000000..d3ad8888ff --- /dev/null +++ b/test/resources/unused_code_analyzer/library/src/usage.dart @@ -0,0 +1,6 @@ +import '../resources/resources.dart'; + +/// Checks if you are awesome. Spoiler: you are. +class Awesome { + bool get isAwesome => AppStrings.title.isNotEmpty; +} diff --git a/test/src/analyzers/unused_code_analyzer/unused_code_analyzer_test.dart b/test/src/analyzers/unused_code_analyzer/unused_code_analyzer_test.dart index 66f6278f9a..b4552f16d3 100644 --- a/test/src/analyzers/unused_code_analyzer/unused_code_analyzer_test.dart +++ b/test/src/analyzers/unused_code_analyzer/unused_code_analyzer_test.dart @@ -36,7 +36,7 @@ void main() { }); test('should report 3 files and not report excluded file', () { - expect(result, hasLength(3)); + expect(result, hasLength(4)); }); test('should analyze not used files', () async { @@ -139,6 +139,20 @@ void main() { expect(eightsIssue.location.line, 171); expect(eightsIssue.location.column, 1); }); + + test('should analyze elements from incorrectly parsed library', () { + final report = result.firstWhere( + (report) => report.path.endsWith('app_icons.dart'), + ); + + expect(report.issues, hasLength(1)); + + final firstIssue = report.issues.first; + expect(firstIssue.declarationName, 'AppIcons'); + expect(firstIssue.declarationType, 'class'); + expect(firstIssue.location.line, 3); + expect(firstIssue.location.column, 1); + }); }); test('should return a reporter', () { From 4c6c3cc2b6b169e65e4c728bffb1af6937af38d3 Mon Sep 17 00:00:00 2001 From: Dmitry Zhifarsky Date: Tue, 14 Jun 2022 23:39:00 +0400 Subject: [PATCH 2/2] chore: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f766af470..e067e58a54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * fix: normalize file paths after extraction from analyzed folder. * fix: improve context root included files calculation. * fix: resolve package with imported analysis options. +* fix: change elements equality check to overcome incorrect libs resolution. ## 4.15.2