From 619ea3bb2ff5cbd15ca10bd86a9ed8b2d823d368 Mon Sep 17 00:00:00 2001 From: Illia Aihistov Date: Mon, 31 Aug 2026 12:42:15 +0300 Subject: [PATCH] fix: skip indexing and reporting for files located outside the analysis context root --- .../avoid_duplicate_code_visitor.dart | 6 ++++ .../avoid_duplicate_code_rule_test.dart | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/lib/src/lints/avoid_duplicate_code/visitors/avoid_duplicate_code_visitor.dart b/lib/src/lints/avoid_duplicate_code/visitors/avoid_duplicate_code_visitor.dart index e431eac9..02915bf6 100644 --- a/lib/src/lints/avoid_duplicate_code/visitors/avoid_duplicate_code_visitor.dart +++ b/lib/src/lints/avoid_duplicate_code/visitors/avoid_duplicate_code_visitor.dart @@ -16,6 +16,7 @@ import 'package:solid_lints/src/lints/avoid_duplicate_code/reporters/avoid_dupli import 'package:solid_lints/src/lints/avoid_duplicate_code/reporters/duplicate_report_context.dart'; import 'package:solid_lints/src/lints/avoid_duplicate_code/services/differing_literals_analyzer.dart'; import 'package:solid_lints/src/lints/avoid_duplicate_code/services/global_hash_registry.dart'; +import 'package:solid_lints/src/lints/avoid_duplicate_code/utils/path_utils.dart'; import 'package:solid_lints/src/lints/avoid_duplicate_code/utils/token_utils.dart'; import 'package:solid_lints/src/lints/avoid_duplicate_code/visitors/ast_structural_hash_visitor.dart'; import 'package:solid_lints/src/lints/avoid_duplicate_code/visitors/candidate_visitor.dart'; @@ -83,6 +84,11 @@ class AvoidDuplicateCodeVisitor extends RecursiveAstVisitor { if (_filePath.isEmpty) return; final filePath = _filePath; + if (_contextRoot != null && + !PathUtils.isWithinOrEqual(_contextRoot.root.path, filePath)) { + return; + } + final packageRoot = _contextRoot?.root.path ?? GlobalHashRegistry.instance.findPackageRoot( diff --git a/test/src/lints/avoid_duplicate_code/avoid_duplicate_code_rule_test.dart b/test/src/lints/avoid_duplicate_code/avoid_duplicate_code_rule_test.dart index 2f74c67d..8477cdd5 100644 --- a/test/src/lints/avoid_duplicate_code/avoid_duplicate_code_rule_test.dart +++ b/test/src/lints/avoid_duplicate_code/avoid_duplicate_code_rule_test.dart @@ -871,6 +871,42 @@ void otherMethod() { expect(GlobalHashRegistry.instance.fileCount, 0); } + Future test_does_not_index_or_report_file_outside_context_root() async { + final outsideFile = newFile('/other_package/lib/outside.dart', ''' +void outsideMethod() { + final x = 1; + if (x > 0) { + print(x); + } + print('done'); +} +'''); + + final avoidRule = rule as AvoidDuplicateCodeRule; + final resolved = await resolveFile(testFile.path); + final contextRoot = resolved.session.analysisContext.contextRoot; + + final parsed = parseString(content: outsideFile.readAsStringSync()); + + final visitor = AvoidDuplicateCodeVisitor( + avoidRule, + AvoidDuplicateCodeParameters( + minTokens: 10, + exclude: ExcludedIdentifiersListParameter(exclude: []), + ), + filePath: outsideFile.path, + modificationStamp: 1, + ignoreMatcher: avoidRule.ignoreMatcher, + contextRoot: contextRoot, + resourceProvider: resourceProvider, + analysisOptionsLoader: avoidRule.analysisOptionsLoader, + ); + + parsed.unit.accept(visitor); + + expect(GlobalHashRegistry.instance.fileCount, 0); + } + Future _indexFile( File file, { AvoidDuplicateCodeParameters? parameters,