diff --git a/packages/custom_lint/lib/src/workspace.dart b/packages/custom_lint/lib/src/workspace.dart index 2d5bfd82..3d8539cc 100644 --- a/packages/custom_lint/lib/src/workspace.dart +++ b/packages/custom_lint/lib/src/workspace.dart @@ -330,11 +330,9 @@ Stream visitAnalysisOptionAndIncludes( File analysisOptionsFile, ) async* { final visited = {}; - late final packageConfigFuture = loadPackageConfig( - File( - join(analysisOptionsFile.parent.path, '.dart_tool/package_config.json'), - ), - ).then( + late final packageConfigFuture = + loadPackageConfig(analysisOptionsFile.parent.packageConfig) + .then( (value) => value, // On error, return null to not throw. The function later handles the null onError: (e, s) => null, @@ -418,7 +416,14 @@ String? _findOptionsForPubspec(String pubspecPath) { Iterable _findRoots(String path) sync* { final directory = Directory(path); - yield* directory.listSync(recursive: true).whereType().where((file) { + yield* directory + .listSync( + recursive: true, + // Do not follow symbolic links (can be problematic in flutter platform folders) + followLinks: false, + ) + .whereType() + .where((file) { final fileName = basename(file.path); if (fileName != 'pubspec.yaml' && fileName != 'analysis_options.yaml') { return false; diff --git a/packages/custom_lint_core/lib/src/package_utils.dart b/packages/custom_lint_core/lib/src/package_utils.dart index d7372de9..b0b5eedf 100644 --- a/packages/custom_lint_core/lib/src/package_utils.dart +++ b/packages/custom_lint_core/lib/src/package_utils.dart @@ -40,10 +40,24 @@ extension PackageIOUtils on Directory { File get pubspecOverrides => file('pubspec_overrides.yaml'); /// The `.dart_tool/package_config.json` file. - File get packageConfig => file('.dart_tool', 'package_config.json'); + File get _packageConfig => file('.dart_tool', 'package_config.json'); - /// The `.dart_tool/pub/workspace_ref.json` file. - File get workspaceRef => file('.dart_tool', 'pub', 'workspace_ref.json'); + /// The `.dart_tool/package_config.json` file. Either from the current + /// directory or the workspace root. + File get packageConfig { + if (_packageConfig.existsSync()) return _packageConfig; + + final workspaceRefFile = file('.dart_tool', 'pub', 'workspace_ref.json'); + if (!workspaceRefFile.existsSync()) return _packageConfig; + + final content = workspaceRefFile.readAsStringSync(); + final json = jsonDecode(content) as Map; + final workspaceRoot = json['workspaceRoot'] as String; + final workspacePath = + normalize(join(workspaceRefFile.parent.path, workspaceRoot)); + final workspaceDir = Directory(workspacePath); + return workspaceDir._packageConfig; + } /// Returns a path relative to the given [other]. String relativeTo(FileSystemEntity other) { @@ -136,17 +150,7 @@ Future tryParsePackageConfig(Directory directory) async { /// Throws if the parsing fails, such as if the file is badly formatted or /// does not exists. Future parsePackageConfig(Directory directory) async { - var packageConfigFile = directory.packageConfig; - if (!packageConfigFile.existsSync()) { - final workspaceRefFile = directory.workspaceRef; - final content = workspaceRefFile.readAsStringSync(); - final json = jsonDecode(content) as Map; - final workspaceRoot = json['workspaceRoot'] as String; - final workspacePath = - normalize(join(workspaceRefFile.parent.path, workspaceRoot)); - final workspaceDir = Directory(workspacePath); - packageConfigFile = workspaceDir.packageConfig; - } + final packageConfigFile = directory.packageConfig; return PackageConfig.parseBytes( await packageConfigFile.readAsBytes(),