in lib/parser.dart [1612:1666]
TreeNode /* SelectorExpression | LiteralTerm */ processSelectorExpression() {
var start = _peekToken.span;
var expressions = <Expression>[];
Token? termToken;
dynamic value;
var keepParsing = true;
while (keepParsing) {
switch (_peek()) {
case TokenKind.PLUS:
start = _peekToken.span;
termToken = _next();
expressions.add(OperatorPlus(_makeSpan(start)));
break;
case TokenKind.MINUS:
start = _peekToken.span;
termToken = _next();
expressions.add(OperatorMinus(_makeSpan(start)));
break;
case TokenKind.INTEGER:
termToken = _next();
value = int.parse(termToken.text);
break;
case TokenKind.DOUBLE:
termToken = _next();
value = double.parse(termToken.text);
break;
case TokenKind.SINGLE_QUOTE:
value = processQuotedString(false);
value = "'${_escapeString(value as String, single: true)}'";
return LiteralTerm(value, value, _makeSpan(start));
case TokenKind.DOUBLE_QUOTE:
value = processQuotedString(false);
value = '"${_escapeString(value as String)}"';
return LiteralTerm(value, value, _makeSpan(start));
case TokenKind.IDENTIFIER:
value = identifier(); // Snarf up the ident we'll remap, maybe.
break;
default:
keepParsing = false;
}
if (keepParsing && value != null) {
var unitTerm =
processDimension(termToken, value as Object, _makeSpan(start));
expressions.add(unitTerm);
value = null;
}
}
return SelectorExpression(expressions, _makeSpan(start));
}