diff --git a/lib/src/rules/type_init_formals.dart b/lib/src/rules/type_init_formals.dart index 931e94eae..5460efb6c 100644 --- a/lib/src/rules/type_init_formals.dart +++ b/lib/src/rules/type_init_formals.dart @@ -4,6 +4,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/visitor.dart'; +import 'package:analyzer/dart/element/element.dart'; import '../analyzer.dart'; @@ -49,6 +50,7 @@ class TypeInitFormals extends LintRule { NodeLintRegistry registry, LinterContext context) { var visitor = _Visitor(this); registry.addFieldFormalParameter(this, visitor); + registry.addSuperFormalParameter(this, visitor); } } @@ -60,17 +62,31 @@ class _Visitor extends SimpleAstVisitor { @override void visitFieldFormalParameter(FieldFormalParameter node) { var nodeType = node.type; - if (nodeType != null) { - var cls = node.thisOrAncestorOfType()?.declaredElement; - if (cls != null) { - var field = cls.getField(node.identifier.name); - // If no such field exists, the code is invalid; do not report lint. - if (field != null) { - if (nodeType.type == field.type) { - rule.reportLint(nodeType); - } - } - } + if (nodeType == null) return; + + var paramElement = node.declaredElement; + if (paramElement is! FieldFormalParameterElement) return; + + var field = paramElement.field; + // If no such field exists, the code is invalid; do not report lint. + if (field != null && nodeType.type == field.type) { + rule.reportLint(nodeType); + } + } + + @override + void visitSuperFormalParameter(SuperFormalParameter node) { + var nodeType = node.type; + if (nodeType == null) return; + + var paramElement = node.declaredElement; + if (paramElement is! SuperFormalParameterElement) return; + + var superConstructorParameter = paramElement.superConstructorParameter; + if (superConstructorParameter == null) return; + + if (superConstructorParameter.type == nodeType.type) { + rule.reportLint(nodeType); } } } diff --git a/pubspec.yaml b/pubspec.yaml index 902a28a56..087301092 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ environment: sdk: '>=2.12.0 <3.0.0' dependencies: - analyzer: ^3.0.0 + analyzer: ^3.2.0 args: ^2.0.0 collection: ^1.15.0 glob: ^2.0.0 diff --git a/test/rules/type_init_formals.dart b/test/rules/type_init_formals.dart index 9e355eb0f..636240000 100644 --- a/test/rules/type_init_formals.dart +++ b/test/rules/type_init_formals.dart @@ -9,9 +9,36 @@ import '../rule_test_support.dart'; main() { defineReflectiveSuite(() { defineReflectiveTests(TypeInitFormalsTest); + defineReflectiveTests(TypeInitFormalsSuperTest); }); } +@reflectiveTest +class TypeInitFormalsSuperTest extends LintRuleTest { + @override + List get experiments => [ + EnableString.super_parameters, + ]; + + @override + String get lintRule => 'type_init_formals'; + + test_super() async { + await assertDiagnostics(r''' +class A { + String? a; + A({this.a}); +} + +class B extends A { + B({String? super.a}); +} +''', [ + lint('type_init_formals', 66, 7), + ]); + } +} + @reflectiveTest class TypeInitFormalsTest extends LintRuleTest { @override