visitLiteral method
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;
}