visitLiteral method

  1. @override
ExpressionGenerator visitLiteral(
  1. LiteralExpression node
)
inherited

Implementation

@override
ExpressionGenerator visitLiteral(LiteralExpression node) {
  final g = ExpressionGenerator(node);
  g.generate = (block) {
    g.allocateVariable();
    final text = node.text;
    if (text.isEmpty) {
      g.declareVariable(block);
      block.tryAssign(g.variable, () => ref(''));
      block.assign(Members.ok, true$);
    } else if (text.length == 1) {
      final recognizerGenerator = RecognizerGenerator(
          list: node.startCharacters, maxCount: 10, variable: Members.ch);
      final control = recognizerGenerator.generate();
      if (control == null) {
        throw StateError('Internal error');
      }

      g.declareVariable(block);
      block.assign(Members.ok, false$);
      block.if$(control, (block) {
        final args = [literalString(text)];
        final call = callExpression(Members.nextChar, args);
        if (g.variable == null) {
          block.addStatement(call);
        } else {
          block.assign(g.variable!, call);
        }
      });
    } else {
      g.declareVariable(block);
      final args = [literalString(text), ref(Members.pos)];
      final call =
          methodCallExpression(ref(Members.source), 'startsWith', args);
      block.assign(Members.ok, call);
      block.if$(ref(Members.ok), (block) {
        if (g.variable != null) {
          block.assign(g.variable!, literalString(text));
        }

        final pos =
            binaryExpression(ref(Members.pos), '+=', literal(text.length));
        final args = [pos];
        final call = callExpression(Members.getChar, args);
        block.assign(Members.ch, call);
      });
    }
  };

  return g;
}