in lib/parser.dart [1424:1478]
SimpleSelector? simpleSelector() {
// TODO(terry): Natalie makes a good point parsing of namespace and element
// are essentially the same (asterisk or identifier) other
// than the error message for element. Should consolidate the
// code.
// TODO(terry): Need to handle attribute namespace too.
dynamic first;
var start = _peekToken.span;
switch (_peek()) {
case TokenKind.ASTERISK:
// Mark as universal namespace.
var tok = _next();
first = Wildcard(_makeSpan(tok.span));
break;
case TokenKind.IDENTIFIER:
first = identifier();
break;
default:
// Expecting simple selector.
// TODO(terry): Could be a synthesized token like value, etc.
if (TokenKind.isKindIdentifier(_peek())) {
first = identifier();
} else if (_peekKind(TokenKind.SEMICOLON)) {
// Can't be a selector if we found a semi-colon.
return null;
}
break;
}
if (_maybeEat(TokenKind.NAMESPACE)) {
TreeNode? element;
switch (_peek()) {
case TokenKind.ASTERISK:
// Mark as universal element
var tok = _next();
element = Wildcard(_makeSpan(tok.span));
break;
case TokenKind.IDENTIFIER:
element = identifier();
break;
default:
_error('expected element name or universal(*), but found $_peekToken',
_peekToken.span);
break;
}
return NamespaceSelector(
first, ElementSelector(element, element!.span!), _makeSpan(start));
} else if (first != null) {
return ElementSelector(first, _makeSpan(start));
} else {
// Check for HASH | class | attrib | pseudo | negation
return simpleSelectorTail();
}
}