build method

  1. @override
String build(
  1. Context context,
  2. ParserResult? result
)
inherited

Implementation

@override
String build(Context context, ParserResult? result) {
  final parsers = _getParsers();
  if (parsers.length < 2) {
    throw StateError('The list of parsers must contain at least 2 elements');
  }

  final fast = result == null;
  final values = context.allocateLocals(['pos']);
  final results = <ParserResult>[];
  var templateParsers = '{{next}}';
  for (var i = 0; i < parsers.length; i++) {
    final parser = parsers[i];
    var useResult = !fast;
    if (!fast) {
      useResult = _useParserResult(parser, i);
    }

    final r1 = context.getResult(parser, useResult);
    if (r1 != null) {
      results.add(r1);
    }

    final index = results.length;
    final values = {
      'p1': parser.build(context, r1),
      'var1': '{{var$index}}',
    };
    final String template;
    if (i == parsers.length - 1 && !useResult && fast) {
      template = _templateParserLastFast;
    } else if (useResult) {
      template = _templateParser;
    } else {
      template = _templateParserFast;
    }

    final templateParser = render(template, values);
    values.clear();
    values.addAll({
      'next': templateParser,
    });
    templateParsers = render(templateParsers, values);
  }

  if (!fast) {
    values.addAll({
      'next': _setResult(context, results),
    });
  } else {
    values.addAll({
      'next': ' //',
    });
  }

  templateParsers = render(templateParsers, values);
  values.addAll({
    'parsers': templateParsers,
  });
  return render(_template, values, [result, ...results]);
}