check method

  1. @override
void check(
  1. DcqRegistry registry
)

Implementation

@override
void check(DcqRegistry registry) {
  registry.addExpressionStatement((node) {
    final expr = node.expression;

    // Calls, assignments, increments, await, throw, yield are all useful.
    if (expr is MethodInvocation) return;
    if (expr is FunctionExpressionInvocation) return;
    if (expr is AssignmentExpression) return;
    if (expr is PrefixExpression) return;
    if (expr is PostfixExpression) return;
    if (expr is AwaitExpression) return;
    if (expr is ThrowExpression) return;
    if (expr is RethrowExpression) return;
    if (expr is CascadeExpression) return;
    if (expr is InstanceCreationExpression) return;

    // Type references used as export verification in tests are intentional.
    if (expr is SimpleIdentifier) {
      final element = expr.element;
      if (element is ClassElement ||
          element is TypeAliasElement ||
          element is EnumElement) {
        return;
      }
    }

    // Property access on a type or import prefix (e.g. SomeClass.someField,
    // math.pi) can be a compile-time check pattern — but accessing a field
    // on a variable instance (e.g. myObj.field;) is an unnecessary statement.
    if (expr is PrefixedIdentifier) {
      final prefixElement = expr.prefix.element;
      if (prefixElement is PrefixElement ||
          prefixElement is ClassElement ||
          prefixElement is TypeAliasElement ||
          prefixElement is EnumElement ||
          prefixElement is ExtensionElement ||
          prefixElement is LibraryElement) {
        return;
      }
    }

    // Bare string/int/bool literals are no-ops.
    // Simple identifiers referencing variables are no-ops.
    reportAtNode(node);
  });
}