From be89e91d04799bd5e225e3b716aefa3837fd260c Mon Sep 17 00:00:00 2001 From: xJac0b Date: Wed, 4 Jun 2025 19:53:22 +0200 Subject: [PATCH 1/2] fix: remove deprecated members --- .../excluded_identifiers_list_parameter.dart | 2 +- .../avoid_debug_print_in_release_rule.dart | 9 ++-- .../avoid_final_with_getter_visitor.dart | 10 ++-- .../visitors/getter_variable_visitor.dart | 39 ++++++++------- .../avoid_global_state_rule.dart | 2 +- .../avoid_late_keyword_rule.dart | 4 +- .../avoid_returning_widgets_rule.dart | 12 ++++- ...oid_unrelated_type_assertions_visitor.dart | 6 +-- .../avoid_unused_parameters_visitor.dart | 10 ++-- .../avoid_using_api_linter.dart | 49 ++++++++++--------- .../avoid_using_api_utils.dart | 4 +- lib/src/utils/typecast_utils.dart | 4 +- lib/src/utils/types_utils.dart | 6 +-- 13 files changed, 85 insertions(+), 72 deletions(-) diff --git a/lib/src/common/parameters/excluded_identifiers_list_parameter.dart b/lib/src/common/parameters/excluded_identifiers_list_parameter.dart index 4239106a..2f328f1e 100644 --- a/lib/src/common/parameters/excluded_identifiers_list_parameter.dart +++ b/lib/src/common/parameters/excluded_identifiers_list_parameter.dart @@ -55,7 +55,7 @@ class ExcludedIdentifiersListParameter { /// Returns whether the target node should be ignored during analysis. bool shouldIgnore(Declaration node) { - final declarationName = node.declaredElement?.name; + final declarationName = node.declaredFragment?.name2; final excludedItem = exclude.firstWhereOrNull( (e) { diff --git a/lib/src/lints/avoid_debug_print_in_release/avoid_debug_print_in_release_rule.dart b/lib/src/lints/avoid_debug_print_in_release/avoid_debug_print_in_release_rule.dart index 5c75a529..fc951135 100644 --- a/lib/src/lints/avoid_debug_print_in_release/avoid_debug_print_in_release_rule.dart +++ b/lib/src/lints/avoid_debug_print_in_release/avoid_debug_print_in_release_rule.dart @@ -159,11 +159,10 @@ your `debugPrint` call in a `!kReleaseMode` check.""", case PrefixedIdentifier(): final prefix = node.prefix.name; name = node.name.replaceAll('$prefix.', ''); - sourcePath = node.staticElement?.librarySource?.uri.toString() ?? ''; - + sourcePath = node.element?.library2?.uri.toString() ?? ''; case SimpleIdentifier(): name = node.name; - sourcePath = node.staticElement?.librarySource?.uri.toString() ?? ''; + sourcePath = node.element?.library2?.uri.toString() ?? ''; default: return false; @@ -194,10 +193,10 @@ your `debugPrint` call in a `!kReleaseMode` check.""", final prefix = node.prefix.name; name = node.name.replaceAll('$prefix.', ''); - sourcePath = node.staticElement?.librarySource?.uri.toString() ?? ''; + sourcePath = node.element?.library2?.uri.toString() ?? ''; case SimpleIdentifier(): name = node.name; - sourcePath = node.staticElement?.librarySource?.uri.toString() ?? ''; + sourcePath = node.element?.library2?.uri.toString() ?? ''; default: return false; } diff --git a/lib/src/lints/avoid_final_with_getter/visitors/avoid_final_with_getter_visitor.dart b/lib/src/lints/avoid_final_with_getter/visitors/avoid_final_with_getter_visitor.dart index f6c1980a..f8cd8e67 100644 --- a/lib/src/lints/avoid_final_with_getter/visitors/avoid_final_with_getter_visitor.dart +++ b/lib/src/lints/avoid_final_with_getter/visitors/avoid_final_with_getter_visitor.dart @@ -1,6 +1,6 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/visitor.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:solid_lints/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart'; /// A visitor that checks for final private fields with getters. @@ -16,9 +16,11 @@ class AvoidFinalWithGetterVisitor extends RecursiveAstVisitor { if (node case MethodDeclaration( isGetter: true, - declaredElement: ExecutableElement( - isAbstract: false, - isPublic: true, + declaredFragment: ExecutableFragment( + element: ExecutableElement2( + isAbstract: false, + isPublic: true, + ) ) )) { final visitor = GetterVariableVisitor(node); diff --git a/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart b/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart index 912abfde..bcc04db8 100644 --- a/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart +++ b/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart @@ -1,6 +1,6 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/visitor.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; /// A visitor that checks the association of the getter with /// the final private variable @@ -13,15 +13,16 @@ class GetterVariableVisitor extends RecursiveAstVisitor { : _getterId = getter.getterReferenceId; /// Is there a variable associated with the getter + VariableDeclaration? get variable => _variable; @override void visitVariableDeclaration(VariableDeclaration node) { - if (node - case VariableDeclaration( - isFinal: true, - declaredElement: VariableElement(id: final id, isPrivate: true) - ) when id == _getterId) { + final element = node.declaredFragment?.element; + if (element != null && + element.isPrivate && + element.isFinal && + element.id == _getterId) { _variable = node; } @@ -30,17 +31,17 @@ class GetterVariableVisitor extends RecursiveAstVisitor { } extension on MethodDeclaration { - int? get getterReferenceId => switch (body) { - ExpressionFunctionBody( - expression: SimpleIdentifier( - staticElement: Element( - declaration: PropertyAccessorElement( - variable2: PropertyInducingElement(:final id) - ) - ) - ) - ) => - id, - _ => null, - }; + int? get getterReferenceId { + if (body is! ExpressionFunctionBody) return null; + + final expression = (body as ExpressionFunctionBody).expression; + if (expression is SimpleIdentifier) { + final element = expression.element; + if (element is PropertyAccessorElement2) { + return element.variable3?.id; + } + } + + return null; + } } diff --git a/lib/src/lints/avoid_global_state/avoid_global_state_rule.dart b/lib/src/lints/avoid_global_state/avoid_global_state_rule.dart index a9ce8d1c..8c62c0ec 100644 --- a/lib/src/lints/avoid_global_state/avoid_global_state_rule.dart +++ b/lib/src/lints/avoid_global_state/avoid_global_state_rule.dart @@ -77,7 +77,7 @@ class AvoidGlobalStateRule extends SolidLintRule { extension on VariableDeclaration { bool get isMutable => !isFinal && !isConst; - bool get isPrivate => declaredElement?.isPrivate ?? false; + bool get isPrivate => declaredElement2?.isPrivate ?? false; bool get isPublicMutable => isMutable && !isPrivate; } diff --git a/lib/src/lints/avoid_late_keyword/avoid_late_keyword_rule.dart b/lib/src/lints/avoid_late_keyword/avoid_late_keyword_rule.dart index 64fe8c3d..e42c7fd6 100644 --- a/lib/src/lints/avoid_late_keyword/avoid_late_keyword_rule.dart +++ b/lib/src/lints/avoid_late_keyword/avoid_late_keyword_rule.dart @@ -82,7 +82,7 @@ class AvoidLateKeywordRule extends SolidLintRule { } bool _shouldLint(VariableDeclaration node) { - final isLateDeclaration = node.declaredElement?.isLate ?? false; + final isLateDeclaration = node.isLate; if (!isLateDeclaration) return false; final hasIgnoredType = _hasIgnoredType(node); @@ -99,7 +99,7 @@ class AvoidLateKeywordRule extends SolidLintRule { final ignoredTypes = config.parameters.ignoredTypes.toSet(); if (ignoredTypes.isEmpty) return false; - final variableType = node.declaredElement?.type; + final variableType = node.declaredFragment?.element.type; if (variableType == null) return false; return variableType.hasIgnoredType( diff --git a/lib/src/lints/avoid_returning_widgets/avoid_returning_widgets_rule.dart b/lib/src/lints/avoid_returning_widgets/avoid_returning_widgets_rule.dart index 3c113552..0e5d6b43 100644 --- a/lib/src/lints/avoid_returning_widgets/avoid_returning_widgets_rule.dart +++ b/lib/src/lints/avoid_returning_widgets/avoid_returning_widgets_rule.dart @@ -54,6 +54,7 @@ class AvoidReturningWidgetsRule /// This lint rule represents /// the error whether we return a widget. static const lintName = 'avoid_returning_widgets'; + static const _override = 'override'; AvoidReturningWidgetsRule._(super.config); @@ -97,7 +98,16 @@ class AvoidReturningWidgetsRule final isIgnored = config.parameters.exclude.shouldIgnore(node); - final isOverriden = node.declaredElement?.hasOverride ?? false; + final isOverriden = switch (node) { + FunctionDeclaration(:final functionExpression) => + functionExpression.parent is MethodDeclaration && + (functionExpression.parent! as MethodDeclaration) + .metadata + .any((m) => m.name.name == _override), + MethodDeclaration(:final metadata) => + metadata.any((m) => m.name.name == _override), + _ => false, + }; if (isWidgetReturned && !isOverriden && !isIgnored) { reporter.atNode(node, code); diff --git a/lib/src/lints/avoid_unrelated_type_assertions/visitors/avoid_unrelated_type_assertions_visitor.dart b/lib/src/lints/avoid_unrelated_type_assertions/visitors/avoid_unrelated_type_assertions_visitor.dart index e0b4aa6a..513064e3 100644 --- a/lib/src/lints/avoid_unrelated_type_assertions/visitors/avoid_unrelated_type_assertions_visitor.dart +++ b/lib/src/lints/avoid_unrelated_type_assertions/visitors/avoid_unrelated_type_assertions_visitor.dart @@ -97,7 +97,7 @@ class AvoidUnrelatedTypeAssertionsVisitor extends RecursiveAstVisitor { ? objectType.typeArguments.first : objectType; - if ((correctObjectType.element == castedType.element) || + if ((correctObjectType.element3 == castedType.element3) || castedType is DynamicType || correctObjectType is DynamicType || _isObjectAndEnum(correctObjectType, castedType)) { @@ -106,7 +106,7 @@ class AvoidUnrelatedTypeAssertionsVisitor extends RecursiveAstVisitor { if (correctObjectType is InterfaceType) { return correctObjectType.allSupertypes - .firstWhereOrNull((value) => value.element == castedType.element); + .firstWhereOrNull((value) => value.element3 == castedType.element3); } return null; @@ -144,5 +144,5 @@ class AvoidUnrelatedTypeAssertionsVisitor extends RecursiveAstVisitor { bool _isObjectAndEnum(DartType objectType, DartType castedType) => objectType.isDartCoreObject && - castedType.element?.kind == ElementKind.ENUM; + castedType.element3?.kind == ElementKind.ENUM; } diff --git a/lib/src/lints/avoid_unused_parameters/visitors/avoid_unused_parameters_visitor.dart b/lib/src/lints/avoid_unused_parameters/visitors/avoid_unused_parameters_visitor.dart index 40b19f25..ea82e04b 100644 --- a/lib/src/lints/avoid_unused_parameters/visitors/avoid_unused_parameters_visitor.dart +++ b/lib/src/lints/avoid_unused_parameters/visitors/avoid_unused_parameters_visitor.dart @@ -23,7 +23,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/visitor.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:collection/collection.dart'; import 'package:solid_lints/src/utils/node_utils.dart'; import 'package:solid_lints/src/utils/parameter_utils.dart'; @@ -129,7 +129,7 @@ class AvoidUnusedParametersVisitor extends RecursiveAstVisitor { for (final parameter in parameters) { final name = parameter.name; final isPresentInAll = allIdentifierElements.contains( - parameter.declaredElement, + parameter.declaredFragment?.element.baseElement.nonSynthetic2, ); /// Variables declared and initialized as 'Foo(this.param)' @@ -172,13 +172,13 @@ class AvoidUnusedParametersVisitor extends RecursiveAstVisitor { } class _IdentifiersVisitor extends RecursiveAstVisitor { - final elements = {}; + final elements = {}; @override void visitSimpleIdentifier(SimpleIdentifier node) { super.visitSimpleIdentifier(node); - final element = node.staticElement; + final element = node.element; if (element != null) { elements.add(element); } @@ -195,7 +195,7 @@ class _InvocationsVisitor extends RecursiveAstVisitor { @override void visitSimpleIdentifier(SimpleIdentifier node) { if (node.name == methodName && - node.staticElement is MethodElement && + node.element is MethodElement2 && node.parent is ArgumentList) { hasTearOffInvocations = true; } diff --git a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart index a89b8da0..70e74e61 100644 --- a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart +++ b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart @@ -1,5 +1,5 @@ import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/error/listener.dart'; import 'package:collection/collection.dart'; import 'package:custom_lint_builder/custom_lint_builder.dart'; @@ -94,8 +94,10 @@ class AvoidUsingApiLinter { return; } - switch (node.staticElement) { - case FunctionElement() || PropertyAccessorElement(): + switch (node.element) { + case LocalFunctionElement() || + TopLevelFunctionElement() || + PropertyAccessorElement2(): reporter.atNode(node, entryCode); } }); @@ -108,13 +110,13 @@ class AvoidUsingApiLinter { String source, ) { context.registry.addVariableDeclaration((node) { - final typeName = node.declaredElement?.type.element?.name; + final typeName = node.declaredElement2?.type.element3?.name3; if (typeName != className) { return; } final sourcePath = - node.declaredElement?.type.element?.librarySource?.uri.toString(); + node.declaredElement2?.type.element3?.library2?.uri.toString(); if (sourcePath == null || !_matchesSource(sourcePath, source)) { return; } @@ -136,25 +138,24 @@ class AvoidUsingApiLinter { case InstanceCreationExpression(:final staticType?): case SimpleIdentifier(:final staticType?): final parentSourcePath = - staticType.element?.librarySource?.uri.toString() ?? - node.sourceUrl; + staticType.element3?.library2?.uri.toString() ?? node.sourceUrl; if (parentSourcePath == null || !_matchesSource(parentSourcePath, source)) { return; } - final parentTypeName = staticType.element?.name; + final parentTypeName = staticType.element3?.name3; if (parentTypeName != className) { return; } - case SimpleIdentifier(:final staticElement?): + case SimpleIdentifier(:final element?): final parentSourcePath = - staticElement.librarySource?.uri.toString() ?? node.sourceUrl; + element.library2?.uri.toString() ?? node.sourceUrl; if (parentSourcePath == null || !_matchesSource(parentSourcePath, source)) { return; } - final parentElementName = staticElement.name; + final parentElementName = element.name3; if (parentElementName != className) { return; } @@ -214,7 +215,7 @@ class AvoidUsingApiLinter { switch (entityBeforeNode) { case InstanceCreationExpression(:final staticType?): case SimpleIdentifier(:final staticType?): - final parentTypeName = staticType.element?.name; + final parentTypeName = staticType.element3?.name3; if (parentTypeName != className) { return; } @@ -223,8 +224,8 @@ class AvoidUsingApiLinter { node.parent ?? node, entryCode, ); - case SimpleIdentifier(:final staticElement?): - final parentElementName = staticElement.name; + case SimpleIdentifier(:final element?): + final parentElementName = element.name3; if (parentElementName != className) { return; } @@ -233,8 +234,8 @@ class AvoidUsingApiLinter { node.parent ?? node, entryCode, ); - case NamedType(:final element?): - final parentTypeName = element.name; + case NamedType(:final element2?): + final parentTypeName = element2.name3; if (parentTypeName != className) { return; } @@ -250,13 +251,13 @@ class AvoidUsingApiLinter { final methodName = node.methodName.name; if (methodName != identifier) return; - final enclosingElement = node.methodName.staticElement?.enclosingElement3; - if (enclosingElement is! ExtensionElement || - enclosingElement.name != className) { + final enclosingElement = node.methodName.element?.enclosingElement2; + if (enclosingElement is! ExtensionElement2 || + enclosingElement.name3 != className) { return; } - final sourcePath = enclosingElement.librarySource.uri.toString(); + final sourcePath = enclosingElement.library2.uri.toString(); if (!_matchesSource(sourcePath, source)) { return; } @@ -268,13 +269,13 @@ class AvoidUsingApiLinter { final propertyName = node.identifier.name; if (propertyName != identifier) return; - final enclosingElement = node.identifier.staticElement?.enclosingElement3; - if (enclosingElement is! ExtensionElement || - enclosingElement.name != className) { + final enclosingElement = node.identifier.element?.enclosingElement2; + if (enclosingElement is! ExtensionElement2 || + enclosingElement.name3 != className) { return; } - final sourcePath = enclosingElement.librarySource.uri.toString(); + final sourcePath = enclosingElement.library2.uri.toString(); if (!_matchesSource(sourcePath, source)) return; reporter.atNode(node.identifier, entryCode); diff --git a/lib/src/lints/avoid_using_api/avoid_using_api_utils.dart b/lib/src/lints/avoid_using_api/avoid_using_api_utils.dart index 9bca91ec..89928935 100644 --- a/lib/src/lints/avoid_using_api/avoid_using_api_utils.dart +++ b/lib/src/lints/avoid_using_api/avoid_using_api_utils.dart @@ -4,7 +4,7 @@ import 'package:analyzer/dart/ast/ast.dart'; extension SimpleIdentifierParentSourceExtension on SimpleIdentifier { /// Returns library of the node String? get sourceUrl { - final parentSource = staticElement?.librarySource; + final parentSource = element?.library2; final parentSourceName = parentSource?.uri.toString(); return parentSourceName; } @@ -14,7 +14,7 @@ extension SimpleIdentifierParentSourceExtension on SimpleIdentifier { extension NamedTypeParentSourceExtension on NamedType { /// Returns library of the node String? get sourceUrl { - final parentSource = element?.librarySource; + final parentSource = element2?.library2; final parentSourceName = parentSource?.uri.toString(); return parentSourceName; } diff --git a/lib/src/utils/typecast_utils.dart b/lib/src/utils/typecast_utils.dart index cb0bfb12..d8ab24fe 100644 --- a/lib/src/utils/typecast_utils.dart +++ b/lib/src/utils/typecast_utils.dart @@ -36,13 +36,13 @@ class TypeCast { return false; } - if (source.element == target.element) { + if (source.element3 == target.element3) { return _areGenericsWithSameTypeArgs; } if (source is InterfaceType) { return source.allSupertypes.any( - (e) => e.element == target.element, + (e) => e.element3 == target.element3, ); } diff --git a/lib/src/utils/types_utils.dart b/lib/src/utils/types_utils.dart index bdea71e5..5d89d8bb 100644 --- a/lib/src/utils/types_utils.dart +++ b/lib/src/utils/types_utils.dart @@ -23,7 +23,7 @@ // ignore_for_file: public_member_api_docs import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:collection/collection.dart'; @@ -31,8 +31,8 @@ import 'package:solid_lints/src/utils/named_type_utils.dart'; extension Subtypes on DartType { Iterable get supertypes { - final element = this.element; - return element is InterfaceElement ? element.allSupertypes : []; + final element = element3; + return element is InterfaceElement2 ? element.allSupertypes : []; } /// Formats the type string based on nullability and presence of generics. From fe1606bad3c08b7fe28f1427717b1c2fd7379a64 Mon Sep 17 00:00:00 2001 From: xJac0b Date: Wed, 4 Jun 2025 19:56:33 +0200 Subject: [PATCH 2/2] style: remove extra spacing --- .../visitors/getter_variable_visitor.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart b/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart index bcc04db8..954e3775 100644 --- a/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart +++ b/lib/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart @@ -13,7 +13,6 @@ class GetterVariableVisitor extends RecursiveAstVisitor { : _getterId = getter.getterReferenceId; /// Is there a variable associated with the getter - VariableDeclaration? get variable => _variable; @override