blob: 35020ecad2c0d5abed2923fadf3a468e21441e3c [file] [log] [blame]
// Copyright (c) 2014, 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.
import 'package:analyzer/dart/analysis/code_style_options.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/formatter_options.dart';
import 'package:analyzer/source/error_processor.dart';
import 'package:analyzer/src/analysis_rule/rule_context.dart';
import 'package:analyzer/src/lint/config.dart';
/// A set of analysis options used to control the behavior of an analysis
/// context.
///
/// Clients may not extend, implement or mix-in this class.
abstract class AnalysisOptions {
/// A flag indicating whether to run checks on AndroidManifest.xml file to
/// see if it is complaint with Chrome OS.
bool get chromeOsManifestChecks;
/// Return the options used to control the code that is generated.
CodeStyleOptions get codeStyleOptions;
/// The set of features that are globally enabled for this context.
FeatureSet get contextFeatures;
/// A list of the names of the packages for which, if they define a
/// legacy plugin, the legacy plugin should be enabled.
List<String> get enabledLegacyPluginNames;
/// Return a list of error processors that are to be used when reporting
/// errors in some analysis context.
List<ErrorProcessor> get errorProcessors;
/// Return a list of exclude patterns used to exclude some sources from
/// analysis.
List<String> get excludePatterns;
/// Return the options used to control the formatter.
FormatterOptions get formatterOptions;
/// Whether analysis is to generate lint warnings.
bool get lint;
/// A list of the lint rules that are to be run in an analysis context if
/// [lint] is `true`.
// ignore: analyzer_public_api_bad_type
List<AbstractAnalysisRule> get lintRules;
/// The plugin configurations for each plugin which is configured in analysis
/// options.
///
/// These are distinct from the legacy plugins found at
/// [enabledLegacyPluginNames].
List<PluginConfiguration> get pluginConfigurations;
/// Whether implicit casts should be reported as potential problems.
bool get strictCasts;
/// Whether inference failures are allowed, off by default.
bool get strictInference;
/// Whether raw types (types without explicit type arguments, such as `List`)
/// should be reported as potential problems.
///
/// Raw types are a common source of `dynamic` being introduced implicitly.
bool get strictRawTypes;
/// Return `true` if analysis is to generate warning results (e.g. best
/// practices and analysis based on certain annotations).
bool get warning;
/// Return `true` the lint with the given [name] is enabled.
bool isLintEnabled(String name);
}
final class GitPluginSource implements PluginSource {
final String _url;
final String? _path;
final String? _ref;
GitPluginSource({required String url, String? path, String? ref})
: _url = url,
_path = path,
_ref = ref;
@override
String toYaml({required String name}) {
var buffer =
StringBuffer()
..writeln(' $name:')
..writeln(' git:')
..writeln(' url: $_url');
if (_ref != null) {
buffer.writeln(' ref: $_ref');
}
if (_path != null) {
buffer.writeln(' path: $_path');
}
return buffer.toString();
}
}
final class PathPluginSource implements PluginSource {
final String _path;
PathPluginSource({required String path}) : _path = path;
@override
String toYaml({required String name}) => '''
$name:
path: $_path
''';
}
/// The configuration of a Dart Analysis Server plugin, as specified by
/// analysis options.
final class PluginConfiguration {
/// The name of the plugin being configured.
final String name;
/// The source of the plugin being configured.
final PluginSource source;
/// The list of specified [DiagnosticConfig]s.
// ignore: analyzer_public_api_bad_type
final Map<String, DiagnosticConfig> diagnosticConfigs;
/// Whether the plugin is enabled.
final bool isEnabled;
// ignore: analyzer_public_api_bad_type
PluginConfiguration({
required this.name,
required this.source,
this.diagnosticConfigs = const {},
this.isEnabled = true,
});
String sourceYaml() => source.toYaml(name: name);
}
/// A description of the source of a plugin.
/// We support all of the source formats documented at
/// https://dart.dev/tools/pub/dependencies.
sealed class PluginSource {
/// Returns the YAML-formatted source, using [name] as a key, for writing into
/// a pubspec 'dependencies' section.
String toYaml({required String name});
}
/// A plugin source using a version constraint, hosted either at pub.dev or
/// another host.
// TODO(srawlins): Support a different 'hosted' URL.
final class VersionedPluginSource implements PluginSource {
/// The specified version constraint.
final String _constraint;
VersionedPluginSource({required String constraint})
: _constraint = constraint;
@override
String toYaml({required String name}) => ' $name: $_constraint\n';
}