linter: add isEnabled to LinterContext directly
This was previously available as an extension on this class, but we
control the class quite directly. Seems like it should just be an API
of LinterContext.
Change-Id: I9fb61ab4471e859c39d9fa963eed2a3839fca617
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428925
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 665c94c..780176d 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -2,6 +2,7 @@
// 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/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
@@ -247,6 +248,9 @@
TypeSystem get typeSystem;
+ /// Whether the given [feature] is enabled in this linter context.
+ bool isFeatureEnabled(Feature feature);
+
static bool _isInLibDir(String? filePath, WorkspacePackage? package) {
if (package == null) return false;
if (filePath == null) return false;
@@ -298,6 +302,12 @@
throw UnsupportedError(
'LinterContext with parsed results does not include a TypeSystem',
);
+
+ @override
+ bool isFeatureEnabled(Feature feature) =>
+ throw UnsupportedError(
+ 'LinterContext with parsed results does not include a LibraryElement',
+ );
}
/// A [LinterContext] for a library, resolved into [ResolvedUnitResult]s.
@@ -347,6 +357,10 @@
@override
LibraryElement get libraryElement2 =>
definingUnit.unit.declaredFragment!.element;
+
+ @override
+ bool isFeatureEnabled(Feature feature) =>
+ libraryElement2.featureSet.isEnabled(feature);
}
/// Provides access to information needed by lint rules that is not available
diff --git a/pkg/linter/lib/src/extensions.dart b/pkg/linter/lib/src/extensions.dart
index 3517833..0b26d1c 100644
--- a/pkg/linter/lib/src/extensions.dart
+++ b/pkg/linter/lib/src/extensions.dart
@@ -2,7 +2,6 @@
// 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/features.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/constant/value.dart';
@@ -16,7 +15,6 @@
show InvalidTypeImpl;
import 'package:collection/collection.dart';
-import 'analyzer.dart';
import 'util/dart_type_utilities.dart';
class EnumLikeClassDescription {
@@ -584,12 +582,6 @@
setters.firstWhereOrNull((s) => s.canonicalName == name);
}
-extension LinterContextExtension on LinterContext {
- /// Whether the given [feature] is enabled in this linter context.
- bool isEnabled(Feature feature) =>
- libraryElement2!.featureSet.isEnabled(feature);
-}
-
extension MethodDeclarationExtension on MethodDeclaration {
bool get hasInheritedMethod => lookUpInheritedMethod() != null;
diff --git a/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart b/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart
index f9eeda1..ef19f97 100644
--- a/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart
@@ -45,7 +45,9 @@
final LintRule rule;
_Visitor(this.rule, LinterContext context)
- : _wildCardVariablesEnabled = context.isEnabled(Feature.wildcard_variables);
+ : _wildCardVariablesEnabled = context.isFeatureEnabled(
+ Feature.wildcard_variables,
+ );
bool isWildcardIdentifier(String lexeme) =>
_wildCardVariablesEnabled && lexeme == '_';
diff --git a/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart b/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart
index f62d622..4823006 100644
--- a/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_shadowing_type_parameters.dart
@@ -8,7 +8,6 @@
import 'package:analyzer/error/error.dart';
import '../analyzer.dart';
-import '../extensions.dart';
const _desc = r'Avoid shadowing type parameters.';
@@ -42,7 +41,9 @@
final LintRule rule;
_Visitor(this.rule, LinterContext context)
- : _wildCardVariablesEnabled = context.isEnabled(Feature.wildcard_variables);
+ : _wildCardVariablesEnabled = context.isFeatureEnabled(
+ Feature.wildcard_variables,
+ );
@override
void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
diff --git a/pkg/linter/lib/src/rules/invalid_case_patterns.dart b/pkg/linter/lib/src/rules/invalid_case_patterns.dart
index f03a8a6..3a3f93c 100644
--- a/pkg/linter/lib/src/rules/invalid_case_patterns.dart
+++ b/pkg/linter/lib/src/rules/invalid_case_patterns.dart
@@ -10,7 +10,6 @@
import 'package:analyzer/src/dart/ast/token.dart'; // ignore: implementation_imports
import '../analyzer.dart';
-import '../extensions.dart';
const _desc = r'Use case expressions that are valid in Dart 3.0.';
@@ -34,7 +33,7 @@
) {
// This lint rule is only meant for code which does not have 'patterns'
// enabled.
- if (context.isEnabled(Feature.patterns)) return;
+ if (context.isFeatureEnabled(Feature.patterns)) return;
var visitor = _Visitor(this);
registry.addSwitchCase(this, visitor);
diff --git a/pkg/linter/lib/src/rules/library_prefixes.dart b/pkg/linter/lib/src/rules/library_prefixes.dart
index 1b55bbe..db39503 100644
--- a/pkg/linter/lib/src/rules/library_prefixes.dart
+++ b/pkg/linter/lib/src/rules/library_prefixes.dart
@@ -8,7 +8,6 @@
import 'package:analyzer/error/error.dart';
import '../analyzer.dart';
-import '../extensions.dart';
import '../utils.dart';
const _desc =
@@ -38,7 +37,9 @@
final LintRule rule;
_Visitor(this.rule, LinterContext context)
- : _wildCardVariablesEnabled = context.isEnabled(Feature.wildcard_variables);
+ : _wildCardVariablesEnabled = context.isFeatureEnabled(
+ Feature.wildcard_variables,
+ );
@override
void visitImportDirective(ImportDirective node) {
diff --git a/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart b/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart
index ce3ca53..bdeabe5 100644
--- a/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart
+++ b/pkg/linter/lib/src/rules/no_leading_underscores_for_library_prefixes.dart
@@ -8,7 +8,6 @@
import 'package:analyzer/error/error.dart';
import '../analyzer.dart';
-import '../extensions.dart';
import '../util/ascii_utils.dart';
const _desc = r'Avoid leading underscores for library prefixes.';
@@ -41,7 +40,9 @@
final LintRule rule;
_Visitor(this.rule, LinterContext context)
- : _wildCardVariablesEnabled = context.isEnabled(Feature.wildcard_variables);
+ : _wildCardVariablesEnabled = context.isFeatureEnabled(
+ Feature.wildcard_variables,
+ );
void checkIdentifier(SimpleIdentifier? id) {
if (id == null) return;
diff --git a/pkg/linter/lib/src/rules/strict_top_level_inference.dart b/pkg/linter/lib/src/rules/strict_top_level_inference.dart
index 609106a..d524108 100644
--- a/pkg/linter/lib/src/rules/strict_top_level_inference.dart
+++ b/pkg/linter/lib/src/rules/strict_top_level_inference.dart
@@ -49,7 +49,9 @@
final LinterContext context;
_Visitor(this.rule, this.context)
- : _wildCardVariablesEnabled = context.isEnabled(Feature.wildcard_variables);
+ : _wildCardVariablesEnabled = context.isFeatureEnabled(
+ Feature.wildcard_variables,
+ );
bool isWildcardIdentifier(String lexeme) =>
_wildCardVariablesEnabled && lexeme == '_';
diff --git a/pkg/linter/lib/src/rules/switch_on_type.dart b/pkg/linter/lib/src/rules/switch_on_type.dart
index c9f4b74..6070525 100644
--- a/pkg/linter/lib/src/rules/switch_on_type.dart
+++ b/pkg/linter/lib/src/rules/switch_on_type.dart
@@ -11,7 +11,6 @@
import 'package:analyzer/error/error.dart';
import '../analyzer.dart';
-import '../extensions.dart';
const _desc = "Avoid switch statements on a 'Type'.";
@@ -31,7 +30,7 @@
NodeLintRegistry registry,
LinterContext context,
) {
- if (!context.isEnabled(Feature.patterns)) return;
+ if (!context.isFeatureEnabled(Feature.patterns)) return;
var visitor = _Visitor(this, context);
registry.addSwitchExpression(this, visitor);
registry.addSwitchStatement(this, visitor);
diff --git a/pkg/linter/lib/src/rules/unnecessary_breaks.dart b/pkg/linter/lib/src/rules/unnecessary_breaks.dart
index 403999a..282c014 100644
--- a/pkg/linter/lib/src/rules/unnecessary_breaks.dart
+++ b/pkg/linter/lib/src/rules/unnecessary_breaks.dart
@@ -8,7 +8,6 @@
import 'package:analyzer/error/error.dart';
import '../analyzer.dart';
-import '../extensions.dart';
const _desc = r"Don't use explicit `break`s when a break is implied.";
@@ -24,7 +23,7 @@
NodeLintRegistry registry,
LinterContext context,
) {
- if (!context.isEnabled(Feature.patterns)) return;
+ if (!context.isFeatureEnabled(Feature.patterns)) return;
var visitor = _Visitor(this);
registry.addBreakStatement(this, visitor);
diff --git a/pkg/linter/lib/src/rules/unnecessary_lambdas.dart b/pkg/linter/lib/src/rules/unnecessary_lambdas.dart
index 474ed6b..1b3d263 100644
--- a/pkg/linter/lib/src/rules/unnecessary_lambdas.dart
+++ b/pkg/linter/lib/src/rules/unnecessary_lambdas.dart
@@ -94,7 +94,7 @@
final TypeSystem typeSystem;
_Visitor(this.rule, LinterContext context)
- : constructorTearOffsEnabled = context.isEnabled(
+ : constructorTearOffsEnabled = context.isFeatureEnabled(
Feature.constructor_tearoffs,
),
typeSystem = context.typeSystem;
diff --git a/pkg/linter/lib/src/rules/unnecessary_library_name.dart b/pkg/linter/lib/src/rules/unnecessary_library_name.dart
index 67ff371..6b19cb3 100644
--- a/pkg/linter/lib/src/rules/unnecessary_library_name.dart
+++ b/pkg/linter/lib/src/rules/unnecessary_library_name.dart
@@ -8,7 +8,6 @@
import 'package:analyzer/error/error.dart';
import '../analyzer.dart';
-import '../extensions.dart';
const _desc = r"Don't have a library name in a `library` declaration.";
@@ -24,7 +23,7 @@
NodeLintRegistry registry,
LinterContext context,
) {
- if (!context.isEnabled(Feature.unnamedLibraries)) return;
+ if (!context.isFeatureEnabled(Feature.unnamedLibraries)) return;
var visitor = _Visitor(this);
registry.addLibraryDirective(this, visitor);
diff --git a/pkg/linter/lib/src/rules/unnecessary_underscores.dart b/pkg/linter/lib/src/rules/unnecessary_underscores.dart
index bbc12e7..8483dd7 100644
--- a/pkg/linter/lib/src/rules/unnecessary_underscores.dart
+++ b/pkg/linter/lib/src/rules/unnecessary_underscores.dart
@@ -11,7 +11,6 @@
import 'package:analyzer/src/utilities/extensions/collection.dart';
import '../analyzer.dart';
-import '../extensions.dart';
import '../util/ascii_utils.dart';
const _desc = r'Unnecessary underscores can be removed.';
@@ -28,7 +27,7 @@
NodeLintRegistry registry,
LinterContext context,
) {
- if (!context.isEnabled(Feature.wildcard_variables)) return;
+ if (!context.isFeatureEnabled(Feature.wildcard_variables)) return;
var visitor = _Visitor(this);
registry.addFormalParameterList(this, visitor);
registry.addVariableDeclaration(this, visitor);
diff --git a/pkg/linter/lib/src/rules/use_enums.dart b/pkg/linter/lib/src/rules/use_enums.dart
index 5d82101..a7bab30 100644
--- a/pkg/linter/lib/src/rules/use_enums.dart
+++ b/pkg/linter/lib/src/rules/use_enums.dart
@@ -25,7 +25,7 @@
NodeLintRegistry registry,
LinterContext context,
) {
- if (!context.isEnabled(Feature.enhanced_enums)) return;
+ if (!context.isFeatureEnabled(Feature.enhanced_enums)) return;
var visitor = _Visitor(this, context);
registry.addClassDeclaration(this, visitor);
diff --git a/pkg/linter/lib/src/rules/use_null_aware_elements.dart b/pkg/linter/lib/src/rules/use_null_aware_elements.dart
index 29b16c8..0d93ab3 100644
--- a/pkg/linter/lib/src/rules/use_null_aware_elements.dart
+++ b/pkg/linter/lib/src/rules/use_null_aware_elements.dart
@@ -28,7 +28,7 @@
NodeLintRegistry registry,
LinterContext context,
) {
- if (!context.isEnabled(Feature.null_aware_elements)) return;
+ if (!context.isFeatureEnabled(Feature.null_aware_elements)) return;
var visitor = _Visitor(this);
registry.addIfElement(this, visitor);
}
diff --git a/pkg/linter/lib/src/rules/use_string_in_part_of_directives.dart b/pkg/linter/lib/src/rules/use_string_in_part_of_directives.dart
index 35f5716..f1185ab 100644
--- a/pkg/linter/lib/src/rules/use_string_in_part_of_directives.dart
+++ b/pkg/linter/lib/src/rules/use_string_in_part_of_directives.dart
@@ -9,7 +9,6 @@
import 'package:analyzer/src/lint/linter.dart'; //ignore: implementation_imports
import '../analyzer.dart';
-import '../extensions.dart';
const _desc = r'Use string in part of directives.';
@@ -52,5 +51,5 @@
extension on LinterContext {
bool get hasEnancedPartsFeatureEnabled =>
this is LinterContextWithResolvedResults &&
- isEnabled(Feature.enhanced_parts);
+ isFeatureEnabled(Feature.enhanced_parts);
}
diff --git a/pkg/linter/lib/src/rules/use_super_parameters.dart b/pkg/linter/lib/src/rules/use_super_parameters.dart
index 31e1726..034203f 100644
--- a/pkg/linter/lib/src/rules/use_super_parameters.dart
+++ b/pkg/linter/lib/src/rules/use_super_parameters.dart
@@ -10,7 +10,6 @@
import 'package:analyzer/src/utilities/extensions/string.dart'; // ignore: implementation_imports
import '../analyzer.dart';
-import '../extensions.dart';
const _desc = r'Use super-initializer parameters where possible.';
@@ -43,7 +42,7 @@
NodeLintRegistry registry,
LinterContext context,
) {
- if (!context.isEnabled(Feature.super_parameters)) return;
+ if (!context.isFeatureEnabled(Feature.super_parameters)) return;
var visitor = _Visitor(this, context);
registry.addConstructorDeclaration(this, visitor);