diff --git a/pkg/linter/lib/src/ast.dart b/pkg/linter/lib/src/ast.dart index bd9c4326ac2..78dfd617815 100644 --- a/pkg/linter/lib/src/ast.dart +++ b/pkg/linter/lib/src/ast.dart @@ -130,19 +130,6 @@ Element? getWriteOrReadElement(SimpleIdentifier node) { bool hasConstantError(Expression node) => node.computeConstantValue().errors.isNotEmpty; -/// Returns `true` if this [node] is the child of a private compilation unit -/// member. -bool inPrivateMember(AstNode node) { - var parent = node.parent; - if (parent is NamedCompilationUnitMember) { - return isPrivate(parent.name); - } - if (parent is ExtensionDeclaration) { - return parent.name == null || isPrivate(parent.name); - } - return false; -} - /// Returns `true` if this element is the `==` method declaration. bool isEquals(ClassMember element) => element is MethodDeclaration && element.name.lexeme == '=='; @@ -193,10 +180,6 @@ bool isKeyWord(String id) => Keyword.keywords.containsKey(id); /// Returns `true` if the given [ClassMember] is a method. bool isMethod(ClassMember m) => m is MethodDeclaration; -/// Check if the given identifier has a private name. -bool isPrivate(Token? name) => - name != null ? Identifier.isPrivateName(name.lexeme) : false; - /// Returns `true` if the given [ClassMember] is a public method. bool isPublicMethod(ClassMember m) { var declaredElement = m.declaredElement; diff --git a/pkg/linter/lib/src/extensions.dart b/pkg/linter/lib/src/extensions.dart index 278e6093cad..af1efa91bbe 100644 --- a/pkg/linter/lib/src/extensions.dart +++ b/pkg/linter/lib/src/extensions.dart @@ -29,6 +29,16 @@ class EnumLikeClassDescription { extension AstNodeExtension on AstNode { Iterable get childNodes => childEntities.whereType(); + /// Whether this is the child of a private compilation unit member. + bool get inPrivateMember { + var parent = this.parent; + return switch (parent) { + NamedCompilationUnitMember() => parent.name.isPrivate, + ExtensionDeclaration() => parent.name == null || parent.name.isPrivate, + _ => false, + }; + } + bool get isAugmentation { var self = this; return switch (self) { @@ -644,6 +654,12 @@ extension StringExtension on String { extension TokenExtension on Token? { bool get isFinal => this?.keyword == Keyword.FINAL; + + /// Whether the given identifier has a private name. + bool get isPrivate { + var self = this; + return self != null ? Identifier.isPrivateName(self.lexeme) : false; + } } extension TokenTypeExtension on TokenType { diff --git a/pkg/linter/lib/src/rules/diagnostic_describe_all_properties.dart b/pkg/linter/lib/src/rules/diagnostic_describe_all_properties.dart index 4826d5b312f..220a998df74 100644 --- a/pkg/linter/lib/src/rules/diagnostic_describe_all_properties.dart +++ b/pkg/linter/lib/src/rules/diagnostic_describe_all_properties.dart @@ -9,7 +9,6 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import '../analyzer.dart'; -import '../ast.dart'; import '../extensions.dart'; import '../util/flutter_utils.dart'; @@ -129,7 +128,7 @@ class _Visitor extends SimpleAstVisitor { } bool skipForDiagnostic({Element? element, DartType? type, Token? name}) => - isPrivate(name) || _isOverridingMember(element) || isWidgetProperty(type); + name.isPrivate || _isOverridingMember(element) || isWidgetProperty(type); @override void visitClassDeclaration(ClassDeclaration node) { diff --git a/pkg/linter/lib/src/rules/public_member_api_docs.dart b/pkg/linter/lib/src/rules/public_member_api_docs.dart index 0acd41ba7a8..61dc1689669 100644 --- a/pkg/linter/lib/src/rules/public_member_api_docs.dart +++ b/pkg/linter/lib/src/rules/public_member_api_docs.dart @@ -132,7 +132,7 @@ class _Visitor extends SimpleAstVisitor { // Identify getter/setter pairs. for (var member in members) { - if (member is MethodDeclaration && !isPrivate(member.name)) { + if (member is MethodDeclaration && !member.name.isPrivate) { if (member.isGetter) { getters[member.name.lexeme] = member; } else if (member.isSetter) { @@ -176,7 +176,7 @@ class _Visitor extends SimpleAstVisitor { @override void visitClassTypeAlias(ClassTypeAlias node) { - if (!isPrivate(node.name)) { + if (!node.name.isPrivate) { check(node); } } @@ -195,7 +195,7 @@ class _Visitor extends SimpleAstVisitor { for (var member in node.declarations) { if (member is FunctionDeclaration) { var name = member.name; - if (!isPrivate(name) && name.lexeme != 'main') { + if (!name.isPrivate && name.lexeme != 'main') { if (member.isGetter) { getters[member.name.lexeme] = member; } else if (member.isSetter) { @@ -231,7 +231,7 @@ class _Visitor extends SimpleAstVisitor { @override void visitConstructorDeclaration(ConstructorDeclaration node) { - if (inPrivateMember(node) || isPrivate(node.name)) return; + if (node.inPrivateMember || node.name.isPrivate) return; var parent = node.parent; if (parent is EnumDeclaration) return; if (parent != null && parent.isEffectivelyPrivate) return; @@ -244,14 +244,14 @@ class _Visitor extends SimpleAstVisitor { // TODO(pq): update this to be called from the parent (like with visitMembers) if (node.isInternal) return; - if (!inPrivateMember(node) && !isPrivate(node.name)) { + if (!node.inPrivateMember && !node.name.isPrivate) { check(node); } } @override void visitEnumDeclaration(EnumDeclaration node) { - if (isPrivate(node.name)) return; + if (node.name.isPrivate) return; if (node.isInternal) return; check(node); @@ -260,7 +260,7 @@ class _Visitor extends SimpleAstVisitor { @override void visitExtensionDeclaration(ExtensionDeclaration node) { - if (node.name == null || isPrivate(node.name)) return; + if (node.name == null || node.name.isPrivate) return; if (node.isInternal) return; check(node); @@ -278,11 +278,11 @@ class _Visitor extends SimpleAstVisitor { void visitFieldDeclaration(FieldDeclaration node) { // TODO(pq): update this to be called from the parent (like with visitMembers) if (node.isInternal) return; - if (inPrivateMember(node)) return; + if (node.inPrivateMember) return; if (node.isInvalidExtensionTypeField) return; for (var field in node.fields.variables) { - if (!isPrivate(field.name)) { + if (!field.name.isPrivate) { check(field); } } @@ -290,14 +290,14 @@ class _Visitor extends SimpleAstVisitor { @override void visitFunctionTypeAlias(FunctionTypeAlias node) { - if (!isPrivate(node.name)) { + if (!node.name.isPrivate) { check(node); } } @override void visitGenericTypeAlias(GenericTypeAlias node) { - if (!isPrivate(node.name)) { + if (!node.name.isPrivate) { check(node); } } @@ -310,15 +310,15 @@ class _Visitor extends SimpleAstVisitor { @override void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { - for (var decl in node.variables.variables) { - if (!isPrivate(decl.name)) { - check(decl); + for (var variable in node.variables.variables) { + if (!variable.name.isPrivate) { + check(variable); } } } void _visitMembers(Declaration node, Token name, List members) { - if (isPrivate(name)) return; + if (name.isPrivate) return; check(node); checkMethods(members); diff --git a/pkg/linter/lib/src/rules/type_annotate_public_apis.dart b/pkg/linter/lib/src/rules/type_annotate_public_apis.dart index 9e5acbda227..f62ddd7c8cb 100644 --- a/pkg/linter/lib/src/rules/type_annotate_public_apis.dart +++ b/pkg/linter/lib/src/rules/type_annotate_public_apis.dart @@ -7,7 +7,6 @@ import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/type.dart'; import '../analyzer.dart'; -import '../ast.dart'; import '../extensions.dart'; import '../util/ascii_utils.dart'; @@ -95,7 +94,7 @@ class _Visitor extends SimpleAstVisitor { void visitFunctionDeclaration(FunctionDeclaration node) { if (node.isAugmentation) return; - if (!isPrivate(node.name) && + if (!node.name.isPrivate && // Only report on top-level functions, not those declared within the // scope of another function. node.parent is CompilationUnit) { @@ -109,7 +108,7 @@ class _Visitor extends SimpleAstVisitor { @override void visitFunctionTypeAlias(FunctionTypeAlias node) { - if (!isPrivate(node.name)) { + if (!node.name.isPrivate) { if (node.returnType == null) { rule.reportLintForToken(node.name); } else { @@ -122,7 +121,7 @@ class _Visitor extends SimpleAstVisitor { void visitMethodDeclaration(MethodDeclaration node) { if (node.isAugmentation) return; - if (!isPrivate(node.name)) { + if (!node.name.isPrivate) { if (node.returnType == null && !node.isSetter) { rule.reportLintForToken(node.name); } else { @@ -165,7 +164,7 @@ class _VisitorHelper extends RecursiveAstVisitor { @override void visitVariableDeclaration(VariableDeclaration node) { - if (!isPrivate(node.name) && + if (!node.name.isPrivate && !node.isConst && !(node.isFinal && hasInferredType(node))) { rule.reportLintForToken(node.name);