run method

  1. @override
void run(
  1. CustomLintResolver resolver,
  2. ErrorReporter reporter,
  3. CustomLintContext context
)

Emits lints for a given file.

run will only be invoked with files respecting filesToAnalyze

Implementation

@override
void run(
  CustomLintResolver resolver,
  ErrorReporter reporter,
  CustomLintContext context,
) {
  context.registry.addStatement((statement) {
    if (statement is IfStatement ||
        statement is ForStatement ||
        statement is WhileStatement ||
        statement is DoStatement ||
        statement is SwitchStatement) {
      final parentBlock = statement.parent;
      if (parentBlock is! Block) return;

      final source = resolver.source;
      final fileContent = source.contents.data;
      final statementStart = statement.offset;
      final statementEnd = statement.end;

      final parentStatements = parentBlock.statements;
      final statementIndex = parentStatements.indexOf(statement);

      if (statementIndex > 0) {
        final previousStatement = parentStatements[statementIndex - 1];
        final previousEnd = previousStatement.end;
        final textBetween =
            fileContent.substring(previousEnd, statementStart);

        if (textBetween.contains('\n\n') == false) {
          final error = AnalysisError.forValues(
            source: source,
            offset: statementStart,
            length: statement.length,
            errorCode: _code,
            message: _code.problemMessage,
            correctionMessage:
                'Before the control flow statement should be an empty line',
          );

          reporter.reportError(error);
        }
      }

      if (statementIndex < parentStatements.length - 1) {
        final nextStatement = parentStatements[statementIndex + 1];
        final nextStart = nextStatement.offset;
        final textBetween = fileContent.substring(statementEnd, nextStart);

        if (textBetween.contains('\n\n') == false) {
          final error = AnalysisError.forValues(
            source: source,
            offset: statementStart,
            length: statement.length,
            errorCode: _code,
            message: _code.problemMessage,
            correctionMessage:
                'After the control flow statement should be an empty line',
          );
          reporter.reportError(error);
        }
      }
    }
  });
}