From b9c886ebbbe7a534a94e8d7849d48579e7a8cf71 Mon Sep 17 00:00:00 2001 From: pq Date: Fri, 4 Oct 2024 14:35:00 +0000 Subject: [PATCH] [element model] migrate `avoid_print` Bug: https://github.com/dart-lang/linter/issues/5099 Change-Id: Ia2f290d27d195f3a2857ec64a13a2387421a0bb1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/388182 Auto-Submit: Phil Quitslund Reviewed-by: Brian Wilkerson Commit-Queue: Brian Wilkerson --- pkg/linter/lib/src/extensions.dart | 4 ++++ pkg/linter/lib/src/rules/avoid_print.dart | 15 ++++++--------- pkg/linter/lib/src/util/flutter_utils.dart | 8 ++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/pkg/linter/lib/src/extensions.dart b/pkg/linter/lib/src/extensions.dart index 0f3028f68bc9..03cb544a5f34 100644 --- a/pkg/linter/lib/src/extensions.dart +++ b/pkg/linter/lib/src/extensions.dart @@ -557,6 +557,10 @@ extension InterfaceTypeExtension on InterfaceType { } } +extension LibraryElementExtension2 on LibraryElement2? { + Uri? get uri => this?.library2.firstFragment.source.uri; +} + extension LinterContextExtension on LinterContext { /// Whether the given [feature] is enabled in this linter context. bool isEnabled(Feature feature) => diff --git a/pkg/linter/lib/src/rules/avoid_print.dart b/pkg/linter/lib/src/rules/avoid_print.dart index 5d1dee8f84c5..44c3f1177c45 100644 --- a/pkg/linter/lib/src/rules/avoid_print.dart +++ b/pkg/linter/lib/src/rules/avoid_print.dart @@ -4,10 +4,9 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/visitor.dart'; -import 'package:analyzer/dart/element/element.dart'; import '../analyzer.dart'; -import '../ast.dart'; +import '../extensions.dart'; import '../linter_lint_codes.dart'; import '../util/flutter_utils.dart'; @@ -38,7 +37,8 @@ class _Visitor extends SimpleAstVisitor { @override void visitMethodInvocation(MethodInvocation node) { - if (node.methodName.staticElement.isDartCorePrint && !_isDebugOnly(node)) { + if ((node.methodName.element?.isDartCorePrint ?? false) && + !_isDebugOnly(node)) { rule.reportLint(node.methodName); } @@ -51,8 +51,7 @@ class _Visitor extends SimpleAstVisitor { var parent = node.parent; if (parent is IfStatement && node == parent.thenStatement) { var condition = parent.expression; - if (condition is SimpleIdentifier && - isKDebugMode(condition.staticElement)) { + if (condition is SimpleIdentifier && isKDebugMode2(condition.element)) { return true; } } else if (parent is FunctionBody) { @@ -65,10 +64,8 @@ class _Visitor extends SimpleAstVisitor { void _validateArgument(Expression expression) { if (expression is SimpleIdentifier) { - var element = expression.staticElement; - if (element is FunctionElement && - element.name == 'print' && - element.library.isDartCore) { + var element = expression.element; + if (element.isDartCorePrint) { rule.reportLint(expression); } } diff --git a/pkg/linter/lib/src/util/flutter_utils.dart b/pkg/linter/lib/src/util/flutter_utils.dart index f97b8dac1601..1e15408bece8 100644 --- a/pkg/linter/lib/src/util/flutter_utils.dart +++ b/pkg/linter/lib/src/util/flutter_utils.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. 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'; @@ -37,6 +38,8 @@ bool isExactWidgetTypeSizedBox(DartType? type) => bool isKDebugMode(Element? element) => _flutter.isKDebugMode(element); +bool isKDebugMode2(Element2? element) => _flutter.isKDebugMode2(element); + bool isState(InterfaceElement element) => _flutter.isState(element); bool isStatefulWidget(ClassElement? element) => @@ -127,6 +130,11 @@ class _Flutter { element.name == 'kDebugMode' && element.source?.uri == _uriFoundation; + bool isKDebugMode2(Element2? element) => + element != null && + element.name == 'kDebugMode' && + element.library2.uri == _uriFoundation; + bool isState(InterfaceElement element) => isExactly(element, _nameState, _uriFramework) || element.allSupertypes