Skip to content

Commit

Permalink
super_parameter support for type_init_formals (#3165)
Browse files Browse the repository at this point in the history
* super_parameter support for `type_init_formals`

* unused import

* whoops

* sort

* whoops

* fixes

* formatting tweaks
  • Loading branch information
pq authored Jan 20, 2022
1 parent 29b2651 commit 5acea57
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 12 deletions.
38 changes: 27 additions & 11 deletions lib/src/rules/type_init_formals.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -49,6 +50,7 @@ class TypeInitFormals extends LintRule {
NodeLintRegistry registry, LinterContext context) {
var visitor = _Visitor(this);
registry.addFieldFormalParameter(this, visitor);
registry.addSuperFormalParameter(this, visitor);
}
}

Expand All @@ -60,17 +62,31 @@ class _Visitor extends SimpleAstVisitor<void> {
@override
void visitFieldFormalParameter(FieldFormalParameter node) {
var nodeType = node.type;
if (nodeType != null) {
var cls = node.thisOrAncestorOfType<ClassDeclaration>()?.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);
}
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
27 changes: 27 additions & 0 deletions test/rules/type_init_formals.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,36 @@ import '../rule_test_support.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(TypeInitFormalsTest);
defineReflectiveTests(TypeInitFormalsSuperTest);
});
}

@reflectiveTest
class TypeInitFormalsSuperTest extends LintRuleTest {
@override
List<String> 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
Expand Down

0 comments on commit 5acea57

Please sign in to comment.