in lib/src/rules/prefer_initializing_formals.dart [137:213]
void visitConstructorDeclaration(ConstructorDeclaration node) {
// Skip factory constructors.
// https://github.com/dart-lang/linter/issues/2441
if (node.factoryKeyword != null) {
return;
}
var parameters = _getParameters(node);
var parametersUsedOnce = <Element?>{};
var parametersUsedMoreThanOnce = <Element?>{};
bool isAssignmentExpressionToLint(AssignmentExpression assignment) {
var leftElement = _getLeftElement(assignment);
var rightElement = _getRightElement(assignment);
return leftElement != null &&
rightElement != null &&
leftElement.name == rightElement.name &&
!leftElement.isPrivate &&
leftElement is FieldElement &&
!leftElement.isSynthetic &&
leftElement.enclosingElement ==
node.declaredElement?.enclosingElement &&
parameters.contains(rightElement) &&
(!parametersUsedMoreThanOnce.contains(rightElement) &&
!(rightElement as ParameterElement).isNamed ||
leftElement.name == rightElement.name);
}
bool isConstructorFieldInitializerToLint(
ConstructorFieldInitializer constructorFieldInitializer) {
var expression = constructorFieldInitializer.expression;
if (expression is SimpleIdentifier) {
var fieldName = constructorFieldInitializer.fieldName;
if (fieldName.name != expression.name) {
return false;
}
var staticElement = expression.staticElement;
return staticElement is ParameterElement &&
!(constructorFieldInitializer.fieldName.staticElement?.isPrivate ??
true) &&
parameters.contains(staticElement) &&
(!parametersUsedMoreThanOnce.contains(expression.staticElement) &&
!staticElement.isNamed ||
(constructorFieldInitializer.fieldName.staticElement?.name ==
expression.staticElement?.name));
}
return false;
}
void processElement(Element? element) {
if (!parametersUsedOnce.add(element)) {
parametersUsedMoreThanOnce.add(element);
}
}
node.parameters.parameterElements
.where((p) => p != null && p.isInitializingFormal)
.forEach(processElement);
_getAssignmentExpressionsInConstructorBody(node)
.where(isAssignmentExpressionToLint)
.map(_getRightElement)
.forEach(processElement);
_getConstructorFieldInitializersInInitializers(node)
.where(isConstructorFieldInitializerToLint)
.map((e) => (e.expression as SimpleIdentifier).staticElement)
.forEach(processElement);
_getAssignmentExpressionsInConstructorBody(node)
.where(isAssignmentExpressionToLint)
.forEach(rule.reportLint);
_getConstructorFieldInitializersInInitializers(node)
.where(isConstructorFieldInitializerToLint)
.forEach(rule.reportLint);
}