node_modules/gulp-sass/node_modules/node-sass/src/libsass/src/parser.cpp
// a pseudo selector often starts with one or two colons
// it can contain more selectors inside parantheses
a pseudo selector often starts with one or two colons
it can contain more selectors inside parantheses
a pseudo selector often starts with one or two colons it can contain more selectors inside parantheses
Simple_Selector* Parser::parse_pseudo_selector() {
    if (lex< sequence<
          optional < pseudo_prefix >,
          sequence< identifier, optional < block_comment >, exactly<'('> >
        > >())
    {
      std::string name(lexed);
      name.erase(name.size() - 1);
      ParserState p = pstate;
      if (peek_css <
            sequence <
              alternatives <
                static_value,
                binomial
              >,
              optional_css_whitespace,
              exactly<')'>
            >
          >()
      ) {
        lex_css< alternatives < static_value, binomial > >();
        String_Constant* expr = SASS_MEMORY_NEW(ctx.mem, String_Constant, pstate, lexed);
        if (expr && lex_css< exactly<')'> >()) {
          expr->can_compress_whitespace(true);
          return SASS_MEMORY_NEW(ctx.mem, Pseudo_Selector, p, name, expr);
        }
      }
      else if (Selector* wrapped = parse_selector_list(true)) {
        if (wrapped && lex_css< exactly<')'> >()) {
          return SASS_MEMORY_NEW(ctx.mem, Wrapped_Selector, p, name, wrapped);
        }
      }
    }
    else if (lex < sequence< optional < pseudo_prefix >, identifier > >()) {
      return SASS_MEMORY_NEW(ctx.mem, Pseudo_Selector, pstate, lexed);
    }
    else if(lex < pseudo_prefix >()) {
      css_error("Invalid CSS", " after ", ": expected pseudoclass or pseudoelement, was ");
    }
    css_error("Invalid CSS", " after ", ": expected \")\", was ");
    return 0;
  }
Simple_Selector * Parser :: parse_pseudo_selector ( ) { if ( lex < sequence < optional < pseudo_prefix > , sequence < identifier , optional < block_comment > , exactly < ' ' > > > > ( ) ) { std :: string name ( lexed ) ; name . erase ( name . size ( ) - 1 ) ; ParserState p = pstate ; if ( peek_css < sequence < alternatives < static_value , binomial > , optional_css_whitespace , exactly < ' ' > > > ( ) ) { lex_css < alternatives < static_value , binomial > > ( ) ; String_Constant * expr = SASS_MEMORY_NEW ( ctx . mem , String_Constant , pstate , lexed ) ; if ( expr && lex_css < exactly < ' ' > > ( ) ) { expr -> can_compress_whitespace ( true ) ; return SASS_MEMORY_NEW ( ctx . mem , Pseudo_Selector , p , name , expr ) ; } } else if ( Selector * wrapped = parse_selector_list ( true ) ) { if ( wrapped && lex_css < exactly < ' ' > > ( ) ) { return SASS_MEMORY_NEW ( ctx . mem , Wrapped_Selector , p , name , wrapped ) ; } } } else if ( lex < sequence < optional < pseudo_prefix > , identifier > > ( ) ) { return SASS_MEMORY_NEW ( ctx . mem , Pseudo_Selector , pstate , lexed ) ; } else if ( lex < pseudo_prefix > ( ) ) { css_error ( " " , " " , " " ) ; } css_error ( " " , " " , " \" \" " ) ; return 0 ; }
a pseudo selector often starts with one or two colons
it can contain more selectors inside parantheses
a pseudo selector often starts with one or two colons it can contain more selectors inside parantheses
// we keep the space within the name, strange enough // ToDo: refactor output to schedule the space for it // or do we really want to keep the real white-space? // specially parse static stuff // ToDo: really everything static? // EO if pseudo selector // unreachable statement