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