diff --git a/CHANGELOG.md b/CHANGELOG.md index 07fbeb2ebd..81482901d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * fix: improve context root included files calculation. * feat: add [`avoid-banned-imports`](https://dartcodemetrics.dev/docs/rules/common/avoid-banned-imports) rule * fix: resolve package with imported analysis options. +* fix: change elements equality check to overcome incorrect libs resolution. * 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. 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', () {