runWithReporter method
Override this method to implement your lint rule.
Use context to register callbacks for AST node types:
context.addMethodInvocation((node) {
if (condition) {
reporter.atNode(node);
}
});
Implementation
@override
void runWithReporter(
SaropaDiagnosticReporter reporter,
SaropaContext context,
) {
context.addMethodDeclaration((MethodDeclaration node) {
// Skip void returns and setters
if (node.isSetter) return;
final TypeAnnotation? returnType = node.returnType;
if (returnType == null) return;
final String typeStr = returnType.toSource();
if (typeStr == 'void' || typeStr == 'Future<void>') return;
// Skip if already has useResult annotation
for (final Annotation annotation in node.metadata) {
final String name = annotation.name.name;
if (name == 'useResult' || name == 'UseResult') return;
}
// Check for common builder/factory patterns that should use @useResult
final String methodName = node.name.lexeme;
const List<String> builderPatterns = <String>[
'build',
'create',
'make',
'generate',
'compute',
'calculate',
'parse',
'convert',
'transform',
];
for (final String pattern in builderPatterns) {
if (methodName.toLowerCase().startsWith(pattern)) {
reporter.atToken(node.name, code);
return;
}
}
});
}