in lib/parser.dart [366:417]
MediaQuery? processMediaQuery() {
// Grammar: [ONLY | NOT]? S* media_type S*
// [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]*
var start = _peekToken.span;
// Is it a unary media operator?
var op = _peekToken.text;
var opLen = op.length;
var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen);
if (unaryOp != -1) {
if (isChecked) {
if (unaryOp != TokenKind.MEDIA_OP_NOT ||
unaryOp != TokenKind.MEDIA_OP_ONLY) {
_warning('Only the unary operators NOT and ONLY allowed',
_makeSpan(start));
}
}
_next();
start = _peekToken.span;
}
Identifier? type;
// Get the media type.
if (_peekIdentifier()) type = identifier();
var exprs = <MediaExpression>[];
while (true) {
// Parse AND if query has a media_type or previous expression.
var andOp = exprs.isNotEmpty || type != null;
if (andOp) {
op = _peekToken.text;
opLen = op.length;
if (TokenKind.matchMediaOperator(op, 0, opLen) !=
TokenKind.MEDIA_OP_AND) {
break;
}
_next();
}
var expr = processMediaExpression(andOp);
if (expr == null) break;
exprs.add(expr);
}
if (unaryOp != -1 || type != null || exprs.isNotEmpty) {
return MediaQuery(unaryOp, type, exprs, _makeSpan(start));
}
return null;
}