[MethodImpl(MethodImplOptions.AggressiveInlining)]// Private static function called in loops, inline it static CssAtRule Consume_AtRule(DataConsumer <CssToken> Stream) { if (Stream is null) { throw new CssParserException(CssErrors.STREAM_IS_NULL); } var name = (Stream.Next as ValuedTokenBase).Value; CssAtRule Rule = new CssAtRule(name); CssToken Token; do { Token = Stream.Consume(); switch (Token.Type) { case ECssTokenType.Semicolon: case ECssTokenType.EOF: return(Rule); case ECssTokenType.Bracket_Open: Rule.Block = Consume_SimpleBlock(Stream); break; default: { Stream.Reconsume(); Rule.Prelude.Add(Consume_ComponentValue(Stream)); } break; } }while (Token.Type != ECssTokenType.EOF); return(Rule); }
public override Value ReadStartValue(CssLexer lexer) { // Read off the at: lexer.Read(); // Read the name now: string name = lexer.ReadString(); // Skip any junk: lexer.SkipJunk(); // Map to an at rule: CssAtRule rule = CssAtRules.GetLocal(name); if (rule == null) { // Unrecognised - enter error recovery mode: lexer.ErrorRecovery(); // Done: return(null); } // Create the representitive unit: AtRuleUnit at = new AtRuleUnit(); at.AtRule = rule; // Now in @ mode: rule.SetupParsing(lexer); return(at); }