@Nullable private static PsiBuilder.Marker parseExpression(final PsiBuilder builder, final ExprType type) { switch (type) { case CONDITIONAL_OR: return parseBinary(builder, ExprType.CONDITIONAL_AND, CONDITIONAL_OR_OPS); case CONDITIONAL_AND: return parseBinary(builder, ExprType.OR, CONDITIONAL_AND_OPS); case OR: return parseBinary(builder, ExprType.XOR, OR_OPS); case XOR: return parseBinary(builder, ExprType.AND, XOR_OPS); case AND: return parseBinary(builder, ExprType.EQUALITY, AND_OPS); case EQUALITY: return parseBinary(builder, ExprType.RELATIONAL, EQUALITY_OPS); case RELATIONAL: return parseRelational(builder); case SHIFT: return parseBinary(builder, ExprType.ADDITIVE, SHIFT_OPS); case ADDITIVE: return parseBinary(builder, ExprType.MULTIPLICATIVE, ADDITIVE_OPS); case MULTIPLICATIVE: return parseBinary(builder, ExprType.UNARY, MULTIPLICATIVE_OPS); case UNARY: return parseUnary(builder); case TYPE: return ReferenceParser.parseType( builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD); default: assert false : "Unexpected type: " + type; return null; } }
@Nullable private static PsiBuilder.Marker parseClassObjectAccess(final PsiBuilder builder) { final PsiBuilder.Marker expr = builder.mark(); if (ReferenceParser.parseType(builder, 0) == null) { expr.drop(); return null; } if (builder.getTokenType() != JavaTokenType.DOT) { expr.rollbackTo(); return null; } builder.advanceLexer(); if (builder.getTokenType() != JavaTokenType.CLASS_KEYWORD) { expr.rollbackTo(); return null; } builder.advanceLexer(); expr.done(JavaElementType.CLASS_OBJECT_ACCESS_EXPRESSION); return expr; }