| // Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| /// @docImport 'package:analyzer/dart/analysis/analysis_options.dart'; | |
| library; | |
| import 'dart:collection'; | |
| import 'package:analyzer/file_system/file_system.dart'; | |
| import 'package:analyzer/src/analysis_options/analysis_options.dart'; | |
| /// Instances of the class [AnalysisOptionsMap] map [File]s under analysis to | |
| /// their corresponding [AnalysisOptions]. | |
| class AnalysisOptionsMap { | |
| /// Default options, shared by files with no associated analysis options file | |
| /// folder entry. | |
| final AnalysisOptionsImpl _defaultOptions; | |
| final Map<Folder, AnalysisOptionsImpl> _map; | |
| /// Create an empty [AnalysisOptionsMap] instance. | |
| AnalysisOptionsMap() | |
| : _defaultOptions = AnalysisOptionsImpl(), | |
| // Sort entries by (reverse) containment (for now). | |
| _map = SplayTreeMap((a, b) => b.path.compareTo(a.path)); | |
| /// Create an [AnalysisOptionsMap] that holds one set of [sharedOptions] for | |
| /// all associated files. | |
| AnalysisOptionsMap.forSharedOptions(AnalysisOptionsImpl sharedOptions) | |
| : _defaultOptions = sharedOptions, | |
| _map = SplayTreeMap.of({ | |
| // If there's an associated file, create an entry so that we can display | |
| // it in the diagnostics page. | |
| ?sharedOptions.file?.parent: sharedOptions, | |
| }, (a, b) => b.path.compareTo(a.path)); | |
| /// All [Folder]s in the options map. | |
| List<Folder> get folders => _map.keys.toList(); | |
| /// All [AnalysisOptionsImpl]s in the options map, falling back to the | |
| /// [_defaultOptions] object if the options map is empty. | |
| List<AnalysisOptionsImpl> get options { | |
| var allOptions = _map.values.toList(); | |
| return switch (allOptions) { | |
| ([]) => [_defaultOptions], | |
| _ => allOptions, | |
| }; | |
| } | |
| /// Gets the [AnalysisOptions] instance for the given [file] (or a shared empty | |
| /// default options object if there is no entry for a containing folder). | |
| AnalysisOptionsImpl operator [](File file) { | |
| for (var MapEntry(key: folder, value: options) in _map.entries) { | |
| if (folder.contains(file.path)) return options; | |
| } | |
| return _defaultOptions; | |
| } | |
| /// Maps this [folder] to the given [options]. | |
| void operator []=(Folder folder, AnalysisOptionsImpl options) { | |
| _map[folder] = options; | |
| } | |
| } |