visitInvocation method

  1. @override
void visitInvocation(
  1. SqlInvocation e,
  2. void arg
)
override

Implementation

@override
void visitInvocation(SqlInvocation e, void arg) {
  final lowercaseCall = e.name.toLowerCase();
  if (options.addedFunctions.containsKey(lowercaseCall)) {
    options.addedFunctions[lowercaseCall]!.reportErrors(e, context);
  }

  final lowerCaseName = e.name.toLowerCase();
  if (lowerCaseName == 'printf' && options.version >= SqliteVersion.v3_38) {
    // `printf` was renamed to `format` in sqlite3 version 3.38
    if (options.version >= SqliteVersion.v3_38) {
      context.reportError(
        AnalysisError(
          type: AnalysisErrorType.hint,
          message: '`printf` was renamed to `format()`, consider using '
              'that function instead.',
          relevantNode: e,
        ),
      );
    }
  }

  // Warn when newer functions are used in an unsupported sqlite3 version.
  final minimumVersion = switch (lowerCaseName) {
    'format' || 'unixepoch' => SqliteVersion.v3_38,
    'unhex' => SqliteVersion.v3_41,
    'timediff' || 'octet_length' => SqliteVersion.v3_43,
    'concat' || 'concat_ws' || 'string_agg' => SqliteVersion.v3_44,
    _ => null,
  };

  if (minimumVersion != null && options.version < minimumVersion) {
    final versionStr = '${minimumVersion.major}.${minimumVersion.minor}';

    context.reportError(
      AnalysisError(
        type: AnalysisErrorType.notSupportedInDesiredVersion,
        message: '`${e.name}` requires sqlite $versionStr or later',
        relevantNode: e.nameToken ?? e,
      ),
    );
  }

  visitChildren(e, arg);
}