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.addCompilationUnit((CompilationUnit node) {
    final imports = node.directives.whereType<ImportDirective>().toList(
      growable: false,
    );
    if (imports.isEmpty) return;

    final content = context.fileContent;
    final lineInfo = context.lineInfo;

    int? lastGroup;
    for (final imp in imports) {
      final group = ImportGroup.classify(imp);

      if (group == lastGroup) continue;
      lastGroup = group;

      // First import of a new group — check for header above.
      final importLine = lineInfo.getLocation(imp.offset).lineNumber - 1;
      if (importLine == 0) {
        reporter.atNode(imp);
        continue;
      }

      final prevLineStart = lineInfo.getOffsetOfLine(importLine - 1);
      final prevLineEnd = importLine < lineInfo.lineCount
          ? lineInfo.getOffsetOfLine(importLine) - 1
          : content.length;
      final prevLine = content.substring(prevLineStart, prevLineEnd).trim();

      if (prevLine != ImportGroup.headers[group]) {
        reporter.atNode(imp);
      }
    }
  });
}