visitPatternVariableDeclaration method

  1. @override
void visitPatternVariableDeclaration(
  1. PatternVariableDeclaration node
)
override

Implementation

@override
void visitPatternVariableDeclaration(PatternVariableDeclaration node) {
  final literal = node.expression;
  if (literal is! RecordLiteral) return;

  final pattern = switch (node.pattern) {
    final RecordPattern e => e,
    _ => null,
  };
  if (pattern == null) return;

  final patternFieldsLength = pattern.fields.length;
  final literalFieldsLength = literal.fields.length;
  if (patternFieldsLength != literalFieldsLength) return;

  for (var i = 0; i < patternFieldsLength; i++) {
    final patternField = pattern.fields[i];
    final literalField = literal.fields[i];

    final declaredType = switch (patternField.pattern) {
      WildcardPattern(type: final type?) => type.type,
      DeclaredVariablePattern(type: final type?) => type.type,
      _ => null,
    };
    if (declaredType == null) continue;

    final expression = switch (literalField) {
      NamedExpression(:final expression) => expression,
      _ => literalField,
    };

    if (!expression.isDotShorthand) {
      _checkAndReport(expression: expression, declaredType: declaredType);
    }
  }
}