check method
void
check(
- 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);
});
}