runWithReporter method

  1. @override
void runWithReporter(
  1. SaropaDiagnosticReporter reporter,
  2. SaropaContext context
)
override

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;
      }
    }
  });
}