in postcss/src/org/intellij/plugins/postcss/parser/PostCssParser.java [214:294]
protected boolean tryToParseRuleset() {
if (!isRulesetStart()) {
return false;
}
if (getTokenType() == PostCssTokenTypes.AMPERSAND) {
return parseRuleset();
}
//// Lookahead
final PsiBuilder.Marker position = myBuilder.mark();
IElementType prevTokenType = null;
boolean first = true;
final String tokenText = getTokenText();
boolean filterProperty = getTokenType() == CssElementTypes.CSS_IDENT && tokenText != null && tokenText.endsWith("filter");
while (!isDone() && (first ||
getTokenType() == CssElementTypes.CSS_HASH ||
getTokenType() == PostCssTokenTypes.HASH_SIGN ||
getTokenType() == CssElementTypes.CSS_IDENT ||
getTokenType() == CssElementTypes.CSS_PERIOD ||
getTokenType() == CssElementTypes.CSS_COLON ||
getTokenType() == CssElementTypes.CSS_COMMA ||
getTokenType() == CssElementTypes.CSS_PIPE ||
SELECTORS_HIERARCHY_TOKENS.contains(getTokenType()) ||
getTokenType() == PostCssTokenTypes.AMPERSAND ||
getTokenType() == CssElementTypes.CSS_BAD_CHARACTER ||
getTokenType() == CssElementTypes.CSS_RBRACKET ||
getTokenType() == CssElementTypes.CSS_EQ ||
getTokenType() == CssElementTypes.CSS_ASTERISK ||
getTokenType() == CssElementTypes.CSS_FUNCTION_TOKEN ||
getTokenType() == CssElementTypes.CSS_CONTAINS ||
getTokenType() == CssElementTypes.CSS_STRING_TOKEN)) {
IElementType rawLookup1 = myBuilder.rawLookup(1);
if (getTokenType() == CssElementTypes.CSS_COLON) {
if ((rawLookup1 == CssElementTypes.CSS_FUNCTION_TOKEN ||
rawLookup1 == CssElementTypes.CSS_IDENT ||
rawLookup1 == PostCssTokenTypes.AMPERSAND ||
rawLookup1 == CssElementTypes.CSS_COLON)
&& parsePseudo()) {
if (first) {
position.rollbackTo();
return parseRuleset();
}
first = false;
continue;
}
else {
position.rollbackTo();
return false;
}
}
if (first && getTokenType() == CssElementTypes.CSS_HASH) {
position.rollbackTo();
return parseRuleset();
}
first = false;
if (getTokenType() == CssElementTypes.CSS_GT || getTokenType() == PostCssTokenTypes.AMPERSAND
|| (getTokenType() == CssElementTypes.CSS_PERIOD && !filterProperty)) {
position.rollbackTo();
return parseRuleset();
}
if (getTokenType() == CssElementTypes.CSS_TILDA && prevTokenType == CssElementTypes.CSS_LPAREN) {
position.rollbackTo();
return parseRuleset();
}
prevTokenType = getTokenType();
addSingleToken();
}
if ((getTokenType() == CssElementTypes.CSS_LBRACE || getTokenType() == CssElementTypes.CSS_LBRACKET)
&& prevTokenType != CssElementTypes.CSS_COLON) {
position.rollbackTo();
return parseRuleset();
}
if (prevTokenType == CssElementTypes.CSS_LPAREN && getTokenType() == CssElementTypes.CSS_TILDA) {
position.rollbackTo();
return parseRuleset();
}
position.rollbackTo();
return false;
}