CodeTransformer? codeTransformer()

in packages/code_excerpt_updater/lib/src/code_transformer/replace.dart [15:59]


  CodeTransformer? codeTransformer(String? replaceExp) {
    void _reportErr([String extraInfo = '']) {
      _reporter.error(
        '${'invalid replace attribute ("$replaceExp"); '}'
        '${extraInfo.isEmpty ? '' : '$extraInfo; '}'
        'supported syntax is 1 or more semi-colon-separated: /regexp/replacement/g',
      );
    }

    if (replaceExp == null) return null;
    final replaceExpParts = replaceExp
        .replaceAll(escapedSlashRE, zeroChar)
        .split('/')
        .map((s) => s.replaceAll(zeroChar, '/'))
        .toList();

    // replaceExpParts = [''] + n x [re, replacement, end] where n >= 1 and
    // end matches _endRE.

    final start = replaceExpParts[0];
    final len = replaceExpParts.length;
    if (len < 4 || len % 3 != 1) {
      _reportErr('argument has missing parts ($len)');
      return null;
    }
    if (start != '') {
      _reportErr('argument should start with "/", not  "$start"');
      return null;
    }
    final transformers = <CodeTransformer>[];
    for (var i = 1; i < replaceExpParts.length; i += 3) {
      final re = replaceExpParts[i];
      final replacement = replaceExpParts[i + 1];
      final end = replaceExpParts[i + 2];
      if (!_endRE.hasMatch(end)) {
        _reportErr(
            'expected argument end syntax of "g" or "g;" but found "$end"');
        return null;
      }
      final transformer = codeTransformerHelper(re, replacement);
      transformers.add(transformer);
    }

    return transformers.fold(null, compose);
  }