From 5ce3fbd3a27545fe888324fd10e1f76a478bd3d2 Mon Sep 17 00:00:00 2001 From: pq Date: Thu, 17 Mar 2022 09:10:07 -0700 Subject: [PATCH 1/2] fix super.key false positive for `use_key_in_widget_constructors` --- .../rules/use_key_in_widget_constructors.dart | 20 ++++++++++++++++--- .../super_parameters/analysis_options.yaml | 3 +++ .../super_parameters/rules/.mock_packages | 1 + .../rules/use_key_in_widget_constructors.dart | 19 ++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 test_data/rules/experiments/super_parameters/analysis_options.yaml create mode 100644 test_data/rules/experiments/super_parameters/rules/.mock_packages create mode 100644 test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart diff --git a/lib/src/rules/use_key_in_widget_constructors.dart b/lib/src/rules/use_key_in_widget_constructors.dart index 53c827722..01fd23fff 100644 --- a/lib/src/rules/use_key_in_widget_constructors.dart +++ b/lib/src/rules/use_key_in_widget_constructors.dart @@ -79,6 +79,7 @@ class _Visitor extends SimpleAstVisitor { classElement.isPublic && hasWidgetAsAscendant(classElement) && !isExactWidget(classElement) && + !_hasKeySuperParameterInitializerArg(node) && !node.initializers.any((initializer) { if (initializer is SuperConstructorInvocation) { var staticElement = initializer.staticElement; @@ -98,12 +99,25 @@ class _Visitor extends SimpleAstVisitor { super.visitConstructorDeclaration(node); } - bool _defineKeyParameter(ConstructorElement element) => - element.parameters.any((e) => e.name == 'key' && _isKeyType(e.type)); - bool _defineKeyArgument(ArgumentList argumentList) => argumentList.arguments .any((a) => a.staticParameterElement?.name == 'key'); + bool _defineKeyParameter(ConstructorElement element) => + element.parameters.any((e) => e.name == 'key' && _isKeyType(e.type)); + bool _isKeyType(DartType type) => DartTypeUtilities.implementsInterface(type, 'Key', ''); + + bool _hasKeySuperParameterInitializerArg(ConstructorDeclaration node) { + for (var parameter in node.parameters.parameters) { + var element = parameter.declaredElement; + if (element is SuperFormalParameterElement && + element.name == 'key' && + _isKeyType(element.type)) { + return true; + } + } + + return false; + } } diff --git a/test_data/rules/experiments/super_parameters/analysis_options.yaml b/test_data/rules/experiments/super_parameters/analysis_options.yaml new file mode 100644 index 000000000..16dd3805f --- /dev/null +++ b/test_data/rules/experiments/super_parameters/analysis_options.yaml @@ -0,0 +1,3 @@ +analyzer: + enable-experiment: + - super-parameters diff --git a/test_data/rules/experiments/super_parameters/rules/.mock_packages b/test_data/rules/experiments/super_parameters/rules/.mock_packages new file mode 100644 index 000000000..236a8a870 --- /dev/null +++ b/test_data/rules/experiments/super_parameters/rules/.mock_packages @@ -0,0 +1 @@ +flutter:../../../../mock_packages/flutter/lib/ diff --git a/test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart b/test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart new file mode 100644 index 000000000..7fa56f920 --- /dev/null +++ b/test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart @@ -0,0 +1,19 @@ +// Copyright (c) 2022, 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. + +// test w/ `dart test -N use_key_in_widget_constructors` + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +/// https://github.com/flutter/flutter/issues/100297 +class OtherWidget extends StatelessWidget { + const OtherWidget({required super.key}); //OK + + @override + Widget build(BuildContext context) { + return Container(); + } +} + From 0702af6653438c33c466723c0725ae55069939e8 Mon Sep 17 00:00:00 2001 From: pq Date: Thu, 17 Mar 2022 09:31:28 -0700 Subject: [PATCH 2/2] - type test --- lib/src/rules/use_key_in_widget_constructors.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/src/rules/use_key_in_widget_constructors.dart b/lib/src/rules/use_key_in_widget_constructors.dart index 01fd23fff..167903908 100644 --- a/lib/src/rules/use_key_in_widget_constructors.dart +++ b/lib/src/rules/use_key_in_widget_constructors.dart @@ -111,9 +111,7 @@ class _Visitor extends SimpleAstVisitor { bool _hasKeySuperParameterInitializerArg(ConstructorDeclaration node) { for (var parameter in node.parameters.parameters) { var element = parameter.declaredElement; - if (element is SuperFormalParameterElement && - element.name == 'key' && - _isKeyType(element.type)) { + if (element is SuperFormalParameterElement && element.name == 'key') { return true; } }