private void afterConsume(PsiBuilder builder, IElementType type) { if (type.equals(SS_VAR) && markingVar) { varMarker.done(NAMED_VAR); markingVar = false; identifierMarker = null; } if (markingTheme && type.equals(SS_THEME_VAR)) { themeMarker.done(SS_THEME_DIR); } if (type.equals(SS_STRING) && markingTheme) { PsiBuilder.Marker fullTheme = themeMarker.precede(); fullTheme.done(SS_THEME_FILE_PATH); markingTheme = false; themeMarker = null; } if (type.equals(SS_IDENTIFIER)) { if (identifierMarker == null) identifierMarker = varMarker.precede(); else identifierMarker = identifierMarker.precede(); identifierMarker.done(SS_FIELD_REFERENCE); } if (type.equals(SS_COMMENT_END)) { commentMarker.done(SS_COMMENT_STATEMENT); markingComment = false; } if (markingBlock && type.equals(SS_BLOCK_END)) { blockMarker.done(blockType); markingBlock = false; if (BLOCK_STATEMENTS.contains(blockType)) { blockStack.push(Pair.create(blockMarker, blockTokenText)); statementsStack.push(builder.mark()); } else if (blockType.equals(SS_ELSE_IF_STATEMENT) || blockType.equals(SS_ELSE_STATEMENT)) { if (!statementsStack.isEmpty()) { statementsStack.pop().doneBefore(SS_STATEMENTS, blockMarker); statementsStack.push(builder.mark()); } } else if (blockType.equals(SS_BLOCK_END_STATEMENT)) { PsiBuilder.Marker statementMarker = null; if (!statementsStack.isEmpty()) { statementMarker = statementsStack.pop(); statementMarker.doneBefore(SS_STATEMENTS, blockMarker); } if (!blockStack.isEmpty()) { Pair<PsiBuilder.Marker, String> blockLevel = blockStack.peek(); String endString = "end_" + blockLevel.getSecond(); if (endString.equals(blockTokenText)) { PsiBuilder.Marker blockMarker = blockLevel.getFirst().precede(); blockMarker.done(SS_BLOCK_STATEMENT); blockStack.pop(); } else { blockStack.pop(); if (statementMarker != null) statementMarker.drop(); } } } } if (markingBlock && !blockStartTokens.contains(type)) { blockMarker.drop(); markingBlock = false; } }
@Nullable private PsiBuilder.Marker parsePrimaryExpressionStart(final PsiBuilder builder) { IElementType tokenType = builder.getTokenType(); if (LITERALS.contains(tokenType)) { final PsiBuilder.Marker literal = builder.mark(); builder.advanceLexer(); literal.done(JavaElementType.LITERAL_EXPRESSION); return literal; } if (tokenType == JavaTokenType.LBRACE) { return parseArrayInitializer(builder); } if (tokenType == JavaTokenType.NEW_KEYWORD) { return parseNew(builder, null); } if (tokenType == JavaTokenType.LPARENTH) { final PsiBuilder.Marker lambda = parseLambdaAfterParenth(builder, null); if (lambda != null) { return lambda; } final PsiBuilder.Marker parenth = builder.mark(); builder.advanceLexer(); final PsiBuilder.Marker inner = parse(builder); if (inner == null) { error(builder, JavaErrorMessages.message("expected.expression")); } if (!expect(builder, JavaTokenType.RPARENTH)) { if (inner != null) { error(builder, JavaErrorMessages.message("expected.rparen")); } } parenth.done(JavaElementType.PARENTH_EXPRESSION); return parenth; } if (TYPE_START.contains(tokenType)) { final PsiBuilder.Marker mark = builder.mark(); final ReferenceParser.TypeInfo typeInfo = myParser.getReferenceParser().parseTypeInfo(builder, 0); if (typeInfo != null) { boolean optionalClassKeyword = typeInfo.isPrimitive || typeInfo.isArray; if (optionalClassKeyword || !typeInfo.hasErrors && typeInfo.isParameterized) { final PsiBuilder.Marker result = continueClassAccessOrMethodReference(builder, mark, optionalClassKeyword); if (result != null) { return result; } } } mark.rollbackTo(); } PsiBuilder.Marker annotation = null; if (tokenType == JavaTokenType.AT) { annotation = myParser.getDeclarationParser().parseAnnotations(builder); tokenType = builder.getTokenType(); } if (tokenType == JavaTokenType.IDENTIFIER) { if (builder.lookAhead(1) == JavaTokenType.ARROW) { return parseLambdaExpression(builder, false, null); } final PsiBuilder.Marker refExpr; if (annotation != null) { final PsiBuilder.Marker refParam = annotation.precede(); refParam.doneBefore(JavaElementType.REFERENCE_PARAMETER_LIST, annotation); refExpr = refParam.precede(); } else { refExpr = builder.mark(); builder.mark().done(JavaElementType.REFERENCE_PARAMETER_LIST); } builder.advanceLexer(); refExpr.done(JavaElementType.REFERENCE_EXPRESSION); return refExpr; } if (annotation != null) { annotation.rollbackTo(); tokenType = builder.getTokenType(); } PsiBuilder.Marker expr = null; if (tokenType == JavaTokenType.LT) { expr = builder.mark(); if (!myParser.getReferenceParser().parseReferenceParameterList(builder, false, false)) { expr.rollbackTo(); return null; } tokenType = builder.getTokenType(); if (!THIS_OR_SUPER.contains(tokenType)) { expr.rollbackTo(); return null; } } if (THIS_OR_SUPER.contains(tokenType)) { if (expr == null) { expr = builder.mark(); builder.mark().done(JavaElementType.REFERENCE_PARAMETER_LIST); } builder.advanceLexer(); expr.done( builder.getTokenType() == JavaTokenType.LPARENTH ? JavaElementType.REFERENCE_EXPRESSION : tokenType == JavaTokenType.THIS_KEYWORD ? JavaElementType.THIS_EXPRESSION : JavaElementType.SUPER_EXPRESSION); return expr; } return null; }
@Nullable private static PsiBuilder.Marker parsePrimaryExpressionStart(final PsiBuilder builder) { IElementType tokenType = builder.getTokenType(); if (LITERALS.contains(tokenType)) { final PsiBuilder.Marker literal = builder.mark(); builder.advanceLexer(); literal.done(JavaElementType.LITERAL_EXPRESSION); return literal; } if (tokenType == JavaTokenType.LPARENTH) { final PsiBuilder.Marker parenth = builder.mark(); builder.advanceLexer(); final PsiBuilder.Marker inner = parse(builder); if (inner == null) { error(builder, JavaErrorMessages.message("expected.expression")); } if (!expect(builder, JavaTokenType.RPARENTH)) { if (inner != null) { error(builder, JavaErrorMessages.message("expected.rparen")); } } parenth.done(JavaElementType.PARENTH_EXPRESSION); return parenth; } if (tokenType == JavaTokenType.LBRACE) { return parseArrayInitializer(builder); } PsiBuilder.Marker annotation = null; final PsiBuilder.Marker beforeAnnotation = builder.mark(); if (tokenType == JavaTokenType.AT) { annotation = DeclarationParser.parseAnnotations(builder); tokenType = builder.getTokenType(); } if (tokenType == JavaTokenType.IDENTIFIER) { final PsiBuilder.Marker refExpr; if (annotation != null) { final PsiBuilder.Marker refParam = annotation.precede(); refParam.doneBefore(JavaElementType.REFERENCE_PARAMETER_LIST, annotation); refExpr = refParam.precede(); } else { refExpr = builder.mark(); builder.mark().done(JavaElementType.REFERENCE_PARAMETER_LIST); } builder.advanceLexer(); refExpr.done(JavaElementType.REFERENCE_EXPRESSION); beforeAnnotation.drop(); return refExpr; } if (annotation != null) { beforeAnnotation.rollbackTo(); tokenType = builder.getTokenType(); } else { beforeAnnotation.drop(); } PsiBuilder.Marker expr = null; if (tokenType == JavaTokenType.LT) { expr = builder.mark(); if (!ReferenceParser.parseReferenceParameterList(builder, false, false)) { expr.rollbackTo(); return null; } tokenType = builder.getTokenType(); if (!CONSTRUCTOR_CALL.contains(tokenType)) { expr.rollbackTo(); return null; } } if (CONSTRUCTOR_CALL.contains(tokenType)) { if (expr == null) { expr = builder.mark(); builder.mark().done(JavaElementType.REFERENCE_PARAMETER_LIST); } builder.advanceLexer(); expr.done( builder.getTokenType() == JavaTokenType.LPARENTH ? JavaElementType.REFERENCE_EXPRESSION : tokenType == JavaTokenType.THIS_KEYWORD ? JavaElementType.THIS_EXPRESSION : JavaElementType.SUPER_EXPRESSION); return expr; } if (tokenType == JavaTokenType.NEW_KEYWORD) { return parseNew(builder, null); } if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(tokenType)) { return parseClassObjectAccess(builder); } return null; }