@Override @NotNull public ChildAttributes getChildAttributes(final int newChildIndex) { if (myNode.getElementType() == JavaElementType.CONDITIONAL_EXPRESSION && mySettings.ALIGN_MULTILINE_TERNARY_OPERATION) { final Alignment usedAlignment = getUsedAlignment(newChildIndex); if (usedAlignment != null) { return new ChildAttributes(null, usedAlignment); } else { return super.getChildAttributes(newChildIndex); } } else if (myNode.getElementType() == JavaElementType.SWITCH_LABEL_STATEMENT) { return new ChildAttributes(Indent.getNormalIndent(), null); } else { return super.getChildAttributes(newChildIndex); } }
@NotNull private PsiBuilder.Marker parseForEachFromColon(PsiBuilder builder, PsiBuilder.Marker statement) { builder.advanceLexer(); final PsiBuilder.Marker expr = myParser.getExpressionParser().parse(builder); if (expr == null) { error(builder, JavaErrorMessages.message("expected.expression")); } if (expect(builder, JavaTokenType.RPARENTH)) { final PsiBuilder.Marker bodyStatement = parseStatement(builder); if (bodyStatement == null) { error(builder, JavaErrorMessages.message("expected.statement")); } } else { error(builder, JavaErrorMessages.message("expected.rparen")); } done(statement, JavaElementType.FOREACH_STATEMENT); return statement; }
@NotNull private PsiBuilder.Marker parseDoWhileStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); final PsiBuilder.Marker body = parseStatement(builder); if (body == null) { error(builder, JavaErrorMessages.message("expected.statement")); done(statement, JavaElementType.DO_WHILE_STATEMENT); return statement; } if (!expect(builder, JavaTokenType.WHILE_KEYWORD)) { error(builder, JavaErrorMessages.message("expected.while")); done(statement, JavaElementType.DO_WHILE_STATEMENT); return statement; } if (parseExpressionInParenth(builder)) { semicolon(builder); } done(statement, JavaElementType.DO_WHILE_STATEMENT); return statement; }
@NotNull private PsiBuilder.Marker parseThrowStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); final PsiBuilder.Marker expr = myParser.getExpressionParser().parse(builder); if (expr == null) { error(builder, JavaErrorMessages.message("expected.expression")); done(statement, JavaElementType.THROW_STATEMENT); return statement; } semicolon(builder); done(statement, JavaElementType.THROW_STATEMENT); return statement; }
@NotNull private PsiBuilder.Marker parseSynchronizedStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); if (!parseExpressionInParenth(builder)) { done(statement, JavaElementType.SYNCHRONIZED_STATEMENT); return statement; } final PsiBuilder.Marker body = parseCodeBlock(builder, true); if (body == null) { error(builder, JavaErrorMessages.message("expected.lbrace")); } done(statement, JavaElementType.SYNCHRONIZED_STATEMENT); return statement; }
@Nullable private PsiBuilder.Marker parseAssignment(final PsiBuilder builder) { final PsiBuilder.Marker left = parseConditional(builder); if (left == null) return null; final IElementType tokenType = getGtTokenType(builder); if (ASSIGNMENT_OPS.contains(tokenType) && tokenType != null) { final PsiBuilder.Marker assignment = left.precede(); advanceGtToken(builder, tokenType); final PsiBuilder.Marker right = parse(builder); if (right == null) { error(builder, JavaErrorMessages.message("expected.expression")); } assignment.done(JavaElementType.ASSIGNMENT_EXPRESSION); return assignment; } return left; }
/** * There is a possible case that 'implements' section is incomplete (e.g. ends with comma). We may want to align lbrace * to the comma then. * * @param alignment block alignment * @param baseNode base AST node * @return alignment strategy to use for the given node */ private static AlignmentStrategy getAlignmentStrategy(Alignment alignment, ASTNode baseNode, @NotNull CommonCodeStyleSettings settings) { if (baseNode.getElementType() != JavaElementType.CLASS || !settings.ALIGN_MULTILINE_EXTENDS_LIST) { return AlignmentStrategy.wrap(alignment); } for (ASTNode node = baseNode.getLastChildNode(); node != null; node = FormatterUtil.getPreviousNonWhitespaceSibling(node)) { if (node.getElementType() != JavaElementType.IMPLEMENTS_LIST) { continue; } ASTNode lastChildNode = node.getLastChildNode(); if (lastChildNode != null && lastChildNode.getElementType() == TokenType.ERROR_ELEMENT) { Alignment alignmentToUse = alignment; if (alignment == null) { alignmentToUse = Alignment.createAlignment(); } return AlignmentStrategy.wrap( alignmentToUse, false, JavaTokenType.LBRACE, JavaElementType.JAVA_CODE_REFERENCE, node.getElementType() ); } break; } return AlignmentStrategy.wrap(alignment); }
@Nullable private static PsiBuilder.Marker parseClassObjectAccess(PsiBuilder builder, PsiBuilder.Marker expr, boolean optionalClassKeyword) { final PsiBuilder.Marker mark = builder.mark(); builder.advanceLexer(); if (builder.getTokenType() == JavaTokenType.CLASS_KEYWORD) { mark.drop(); builder.advanceLexer(); } else { if (!optionalClassKeyword) return null; mark.rollbackTo(); builder.error(".class expected"); } expr.done(JavaElementType.CLASS_OBJECT_ACCESS_EXPRESSION); return expr; }
@Nullable private PsiBuilder.Marker parseLambdaExpression(final PsiBuilder builder, final boolean typed, @Nullable final PsiBuilder.Marker typeList) { final PsiBuilder.Marker start = typeList != null ? typeList.precede() : builder.mark(); myParser.getDeclarationParser().parseLambdaParameterList(builder, typed); if (!expect(builder, JavaTokenType.ARROW)) { start.rollbackTo(); return null; } final PsiBuilder.Marker body; if (builder.getTokenType() == JavaTokenType.LBRACE) { body = myParser.getStatementParser().parseCodeBlock(builder); } else { body = parse(builder); } if (body == null) { builder.error(JavaErrorMessages.message("expected.lbrace")); } start.done(JavaElementType.LAMBDA_EXPRESSION); return start; }
@Nullable public PsiBuilder.Marker parseTypeParameter(final PsiBuilder builder) { final PsiBuilder.Marker param = builder.mark(); myParser.getDeclarationParser().parseAnnotations(builder); if (isKeywordAny(builder)) { dummy(builder); } final boolean wild = expect(builder, JavaTokenType.QUEST); if (!wild && !expect(builder, JavaTokenType.IDENTIFIER)) { param.rollbackTo(); return null; } parseReferenceList(builder, JavaTokenType.EXTENDS_KEYWORD, JavaElementType.EXTENDS_BOUND_LIST, JavaTokenType.AND); if (!wild) { param.done(JavaElementType.TYPE_PARAMETER); } else { param.error(JavaErrorMessages.message("wildcard.not.expected")); } return param; }
private boolean parseAnnotationParameter(final PsiBuilder builder, final boolean mayBeSimple) { PsiBuilder.Marker pair = builder.mark(); if (mayBeSimple) { parseAnnotationValue(builder); if (builder.getTokenType() != JavaTokenType.EQ) { done(pair, JavaElementType.NAME_VALUE_PAIR); return false; } pair.rollbackTo(); pair = builder.mark(); } final boolean hasName = expectOrError(builder, JavaTokenType.IDENTIFIER, "expected.identifier"); expectOrError(builder, JavaTokenType.EQ, "expected.eq"); parseAnnotationValue(builder); done(pair, JavaElementType.NAME_VALUE_PAIR); return hasName; }
private static int calcNewState(final ASTNode child, final int state) { if (state == BEFORE_FIRST) { if (child.getElementType() == JavaTokenType.ELSE_KEYWORD) { return AFTER_ELSE; } if (StdTokenSets.COMMENT_BIT_SET.contains(child.getElementType())) { return BEFORE_FIRST; } if (child.getElementType() == JavaElementType.CATCH_SECTION) { return BEFORE_FIRST; } } else if (state == BEFORE_BLOCK){ if (child.getElementType() == JavaTokenType.ELSE_KEYWORD) { return AFTER_ELSE; } if (child.getElementType() == JavaElementType.BLOCK_STATEMENT) { return BEFORE_FIRST; } if (child.getElementType() == JavaElementType.CODE_BLOCK) { return BEFORE_FIRST; } } return BEFORE_BLOCK; }
@Override public ASTNode findChildByRole(int role) { final ASTNode result = super.findChildByRole(role); if (result != null) return result; switch (role) { default: return null; case ChildRole.IMPORT_REFERENCE: final ASTNode importStaticReference = findChildByType(JavaElementType.IMPORT_STATIC_REFERENCE); if (importStaticReference != null) { return importStaticReference; } else { return findChildByType(JavaElementType.JAVA_CODE_REFERENCE); } } }
@NonNull private static Statement toVariableDeclaration(@NonNull PsiDeclarationStatement statement) { PsiElement[] declaredElements = statement.getDeclaredElements(); if (declaredElements.length == 1 && declaredElements[0].getNode().getElementType() == JavaElementType.CLASS) { // Class declaration inside method TypeDeclaration typeDeclaration = toTypeDeclaration((PsiClass)declaredElements[0]); if (typeDeclaration instanceof Statement) { return (Statement)typeDeclaration; } throw new UnsupportedOperationException("Non-statement type declaration: " + statement); } VariableDeclaration declaration = new VariableDeclaration(); bind(declaration, statement); VariableDefinition definition = toVariableDefinition(statement, declaredElements); declaration.astDefinition(definition); return declaration; }
@Override public int getChildRole(ASTNode child) { LOG.assertTrue(child.getTreeParent() == this); IElementType i = child.getElementType(); if (i == JavaElementType.PACKAGE_STATEMENT) { return ChildRole.PACKAGE_STATEMENT; } else if (i == JavaElementType.IMPORT_LIST) { return ChildRole.IMPORT_LIST; } else if (i == JavaElementType.CLASS) { return ChildRole.CLASS; } else { return ChildRoleBase.NONE; } }
public void testProgramWithSingleKeyword() throws Exception { myBuilder = createBuilder("package"); final PsiBuilder.Marker fileMarker = myBuilder.mark(); assertEquals("package", myBuilder.getTokenText()); assertEquals(JavaTokenType.PACKAGE_KEYWORD, myBuilder.getTokenType()); final PsiBuilder.Marker packageStatementMarker = myBuilder.mark(); myBuilder.advanceLexer(); assertTrue(myBuilder.eof()); packageStatementMarker.done(JavaElementType.PACKAGE_STATEMENT); fileMarker.done(JavaStubElementTypes.JAVA_FILE); ASTNode fileNode = myBuilder.getTreeBuilt(); assertNotNull(fileNode); assertEquals("package", fileNode.getText()); assertSame(fileNode.getFirstChildNode(), fileNode.getLastChildNode()); ASTNode packageNode = fileNode.getFirstChildNode(); assertNotNull(packageNode); assertEquals("package", packageNode.getText()); assertEquals(JavaElementType.PACKAGE_STATEMENT, packageNode.getElementType()); ASTNode leaf = packageNode.getFirstChildNode(); assertNotNull(leaf); assertEquals(JavaTokenType.PACKAGE_KEYWORD, leaf.getElementType()); }
@Override public int getChildRole(ASTNode child) { LOG.assertTrue(child.getTreeParent() == this); IElementType i = child.getElementType(); if (i == JavaElementType.MODIFIER_LIST) { return ChildRole.MODIFIER_LIST; } else if (i == JavaElementType.TYPE) { return getChildRole(child, ChildRole.TYPE); } else if (i == JavaTokenType.IDENTIFIER) { return getChildRole(child, ChildRole.NAME); } else { return ChildRoleBase.NONE; } }
@Override public Role getRole() { IElementType type = getElementType(); if (type == JavaElementType.EXTENDS_LIST) { return Role.EXTENDS_LIST; } else if (type == JavaElementType.IMPLEMENTS_LIST) { return Role.IMPLEMENTS_LIST; } else if (type == JavaElementType.THROWS_LIST) { return Role.THROWS_LIST; } else if (type == JavaElementType.EXTENDS_BOUND_LIST) { return Role.EXTENDS_BOUNDS_LIST; } LOG.error("Unknown element type:" + type); return null; }
@Override public int getChildRole(ASTNode child) { LOG.assertTrue(child.getTreeParent() == this); IElementType i = child.getElementType(); if (i == JavaTokenType.IMPLEMENTS_KEYWORD) { return ChildRole.IMPLEMENTS_KEYWORD; } else if (i == JavaTokenType.COMMA) { return ChildRole.COMMA; } else if (i == JavaElementType.JAVA_CODE_REFERENCE) { return ChildRole.REFERENCE_IN_LIST; } else { return ChildRoleBase.NONE; } }
@Override public int getChildRole(ASTNode child) { LOG.assertTrue(child.getTreeParent() == this); IElementType i = child.getElementType(); if (i == JavaTokenType.IMPORT_KEYWORD) { return ChildRole.IMPORT_KEYWORD; } else if (i == JavaElementType.JAVA_CODE_REFERENCE) { return ChildRole.IMPORT_REFERENCE; } else if (i == JavaTokenType.DOT) { return ChildRole.IMPORT_ON_DEMAND_DOT; } else if (i == JavaTokenType.ASTERISK) { return ChildRole.IMPORT_ON_DEMAND_ASTERISK; } else if (i == JavaTokenType.SEMICOLON) { return ChildRole.CLOSING_SEMICOLON; } else { return ChildRoleBase.NONE; } }
@Override protected boolean isCustomFoldingRoot(ASTNode node) { IElementType nodeType = node.getElementType(); if (nodeType == JavaElementType.CLASS) { ASTNode parent = node.getTreeParent(); return parent == null || parent.getElementType() != JavaElementType.CLASS; } return nodeType == JavaElementType.CODE_BLOCK; }
@NotNull private PsiBuilder.Marker parseIfStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); if (!parseExpressionInParenth(builder)) { done(statement, JavaElementType.IF_STATEMENT); return statement; } final PsiBuilder.Marker thenStatement = parseStatement(builder); if (thenStatement == null) { error(builder, JavaErrorMessages.message("expected.statement")); done(statement, JavaElementType.IF_STATEMENT); return statement; } if (!expect(builder, JavaTokenType.ELSE_KEYWORD)) { done(statement, JavaElementType.IF_STATEMENT); return statement; } final PsiBuilder.Marker elseStatement = parseStatement(builder); if (elseStatement == null) { error(builder, JavaErrorMessages.message("expected.statement")); } done(statement, JavaElementType.IF_STATEMENT); return statement; }
@Nullable private ASTNode processCaseAndStatementAfter(final ArrayList<Block> result, ASTNode child, final Alignment childAlignment, final Wrap childWrap, final Indent indent) { final ArrayList<Block> localResult = new ArrayList<Block>(); processChild(localResult, child, AlignmentStrategy.getNullStrategy(), null, Indent.getNoneIndent()); child = child.getTreeNext(); Indent childIndent = Indent.getNormalIndent(); while (child != null) { if (child.getElementType() == JavaElementType.SWITCH_LABEL_STATEMENT || isRBrace(child)) { result.add(createCaseSectionBlock(localResult, childAlignment, indent, childWrap)); return child.getTreePrev(); } if (!FormatterUtil.containsWhiteSpacesOnly(child)) { if (child.getElementType() == JavaElementType.BLOCK_STATEMENT) { childIndent = Indent.getNoneIndent(); } boolean breakOrReturn = isBreakOrReturn(child); processChild(localResult, child, AlignmentStrategy.getNullStrategy(), null, childIndent); if (breakOrReturn) { result.add(createCaseSectionBlock(localResult, childAlignment, indent, childWrap)); return child; } } child = child.getTreeNext(); } result.add(createCaseSectionBlock(localResult, childAlignment, indent, childWrap)); return null; }
@NotNull private static PsiBuilder.Marker parseBreakStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); expect(builder, JavaTokenType.IDENTIFIER); semicolon(builder); done(statement, JavaElementType.BREAK_STATEMENT); return statement; }
@NotNull private static PsiBuilder.Marker parseContinueStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); expect(builder, JavaTokenType.IDENTIFIER); semicolon(builder); done(statement, JavaElementType.CONTINUE_STATEMENT); return statement; }
@NotNull private PsiBuilder.Marker parseReturnStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); myParser.getExpressionParser().parse(builder); semicolon(builder); done(statement, JavaElementType.RETURN_STATEMENT); return statement; }
@NotNull private PsiBuilder.Marker parseTryStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); builder.advanceLexer(); final boolean hasResourceList = builder.getTokenType() == JavaTokenType.LPARENTH; if (hasResourceList) { myParser.getDeclarationParser().parseResourceList(builder); } final PsiBuilder.Marker tryBlock = parseCodeBlock(builder, true); if (tryBlock == null) { error(builder, JavaErrorMessages.message("expected.lbrace")); done(statement, JavaElementType.TRY_STATEMENT); return statement; } if (!hasResourceList && !TRY_CLOSERS_SET.contains(builder.getTokenType())) { error(builder, JavaErrorMessages.message("expected.catch.or.finally")); done(statement, JavaElementType.TRY_STATEMENT); return statement; } while (builder.getTokenType() == JavaTokenType.CATCH_KEYWORD) { if (!parseCatchBlock(builder)) break; } if (expect(builder, JavaTokenType.FINALLY_KEYWORD)) { final PsiBuilder.Marker finallyBlock = parseCodeBlock(builder, true); if (finallyBlock == null) { error(builder, JavaErrorMessages.message("expected.lbrace")); } } done(statement, JavaElementType.TRY_STATEMENT); return statement; }
@NotNull private PsiBuilder.Marker parseBlockStatement(final PsiBuilder builder) { final PsiBuilder.Marker statement = builder.mark(); parseCodeBlock(builder, true); done(statement, JavaElementType.BLOCK_STATEMENT); return statement; }
@Override public int getChildRole(ASTNode child) { final IElementType elType = child.getElementType(); if (elType == JavaTokenType.ARROW) { return ChildRole.ARROW; } else if (elType == JavaElementType.PARAMETER_LIST) { return ChildRole.PARAMETER_LIST; } else if (elType == JavaElementType.CODE_BLOCK) { return ChildRole.LBRACE; } else { return ChildRole.EXPRESSION; } }
private void buildChildren(final ArrayList<Block> result, final Alignment childAlignment, final Wrap childWrap) { ASTNode child = myNode.getFirstChildNode(); ASTNode prevChild = null; int state = BEFORE_FIRST; while (child != null) { if (!FormatterUtil.containsWhiteSpacesOnly(child) && child.getTextLength() > 0){ final Indent indent = calcIndent(child, state); myIndentsBefore.add(calcIndentBefore(child, state)); state = calcNewState(child, state); // The general idea is that it's possible that there are comment lines before method declaration line and that they have // different indents. Example: // // // This is comment before method // void foo() {} // // We want to have the comment and method as distinct blocks then in order to correctly process indentation for inner method // elements. See IDEA-53778 for example of situation when it is significant. if (prevChild != null && myNode.getElementType() == JavaElementType.METHOD && ElementType.JAVA_COMMENT_BIT_SET.contains(prevChild.getElementType()) && !ElementType.JAVA_COMMENT_BIT_SET.contains(child.getElementType())) { prevChild = child; child = composeCodeBlock(result, child, Indent.getNoneIndent(), 0, null); } else { prevChild = child; child = processChild(result, child, childAlignment, childWrap, indent); } for (int i = myIndentsBefore.size(); i < result.size(); i++) { myIndentsBefore.add(Indent.getContinuationIndent(myIndentSettings.USE_RELATIVE_INDENTS)); } } if (child != null) { child = child.getTreeNext(); } } }
@Nullable public PsiBuilder.Marker parseConditional(final PsiBuilder builder) { final PsiBuilder.Marker condition = parseExpression(builder, ExprType.CONDITIONAL_OR); if (condition == null) return null; if (builder.getTokenType() != JavaTokenType.QUEST) return condition; final PsiBuilder.Marker ternary = condition.precede(); builder.advanceLexer(); final PsiBuilder.Marker truePart = parse(builder); if (truePart == null) { error(builder, JavaErrorMessages.message("expected.expression")); ternary.done(JavaElementType.CONDITIONAL_EXPRESSION); return ternary; } if (builder.getTokenType() != JavaTokenType.COLON) { error(builder, JavaErrorMessages.message("expected.colon")); ternary.done(JavaElementType.CONDITIONAL_EXPRESSION); return ternary; } builder.advanceLexer(); final PsiBuilder.Marker falsePart = parseConditional(builder); if (falsePart == null) { error(builder, JavaErrorMessages.message("expected.expression")); ternary.done(JavaElementType.CONDITIONAL_EXPRESSION); return ternary; } ternary.done(JavaElementType.CONDITIONAL_EXPRESSION); return ternary; }
@Nullable private PsiBuilder.Marker parseBinary(final PsiBuilder builder, final ExprType type, final TokenSet ops) { PsiBuilder.Marker result = parseExpression(builder, type); if (result == null) return null; int operandCount = 1; IElementType tokenType = getGtTokenType(builder); IElementType currentExprTokenType = tokenType; while (true) { if (tokenType == null || !ops.contains(tokenType)) break; advanceGtToken(builder, tokenType); final PsiBuilder.Marker right = parseExpression(builder, type); operandCount++; tokenType = getGtTokenType(builder); if (tokenType == null || !ops.contains(tokenType) || tokenType != currentExprTokenType || right == null) { // save result = result.precede(); if (right == null) { error(builder, JavaErrorMessages.message("expected.expression")); } result.done(operandCount > 2 ? JavaElementType.POLYADIC_EXPRESSION : JavaElementType.BINARY_EXPRESSION); if (right == null) break; currentExprTokenType = tokenType; operandCount = 1; } } return result; }
@Nullable private PsiBuilder.Marker parseRelational(final PsiBuilder builder) { PsiBuilder.Marker left = parseExpression(builder, ExprType.SHIFT); if (left == null) return null; IElementType tokenType; while ((tokenType = getGtTokenType(builder)) != null) { final IElementType toCreate; final ExprType toParse; if (RELATIONAL_OPS.contains(tokenType)) { toCreate = JavaElementType.BINARY_EXPRESSION; toParse = ExprType.SHIFT; } else if (tokenType == JavaTokenType.INSTANCEOF_KEYWORD) { toCreate = JavaElementType.INSTANCE_OF_EXPRESSION; toParse = ExprType.TYPE; } else { break; } final PsiBuilder.Marker expression = left.precede(); advanceGtToken(builder, tokenType); final PsiBuilder.Marker right = parseExpression(builder, toParse); if (right == null) { error(builder, toParse == ExprType.TYPE ? JavaErrorMessages.message("expected.type") : JavaErrorMessages.message("expected.expression")); expression.done(toCreate); return expression; } expression.done(toCreate); left = expression; } return left; }
private SyntheticCodeBlock createCaseSectionBlock(final ArrayList<Block> localResult, final Alignment childAlignment, final Indent indent, final Wrap childWrap) { final SyntheticCodeBlock result = new SyntheticCodeBlock(localResult, childAlignment, getSettings(), myJavaSettings, indent, childWrap) { @Override @NotNull public ChildAttributes getChildAttributes(final int newChildIndex) { IElementType prevElementType = null; if (newChildIndex > 0) { final Block previousBlock = getSubBlocks().get(newChildIndex - 1); if (previousBlock instanceof AbstractBlock) { prevElementType = ((AbstractBlock)previousBlock).getNode().getElementType(); } } if (prevElementType == JavaElementType.BLOCK_STATEMENT || prevElementType == JavaElementType.BREAK_STATEMENT || prevElementType == JavaElementType.RETURN_STATEMENT) { return new ChildAttributes(Indent.getNoneIndent(), null); } else { return super.getChildAttributes(newChildIndex); } } }; result.setChildAttributes(new ChildAttributes(Indent.getNormalIndent(), null)); result.setIsIncomplete(true); return result; }
@NotNull private PsiBuilder.Marker parseMethodReference(final PsiBuilder builder, final PsiBuilder.Marker start) { builder.advanceLexer(); myParser.getReferenceParser().parseReferenceParameterList(builder, false, false); if (!expect(builder, JavaTokenType.IDENTIFIER) && !expect(builder, JavaTokenType.NEW_KEYWORD)) { error(builder, JavaErrorMessages.message("expected.identifier")); } start.done(JavaElementType.METHOD_REF_EXPRESSION); return start; }
@Override public int getChildRole(ASTNode child) { final int role = super.getChildRole(child); if (role != ChildRoleBase.NONE) return role; if (child.getElementType() == JavaElementType.IMPORT_STATIC_REFERENCE) { return ChildRole.IMPORT_REFERENCE; } else { return ChildRoleBase.NONE; } }
private void completeWildcardType(PsiBuilder builder, boolean wildcard, PsiBuilder.Marker type) { if (expect(builder, WILDCARD_KEYWORD_SET)) { if (parseTypeInfo(builder, EAT_LAST_DOT) == null) { error(builder, JavaErrorMessages.message("expected.type")); } } if (wildcard) { type.done(JavaElementType.TYPE); } else { type.error(JavaErrorMessages.message("wildcard.not.expected")); } }
public boolean parseReferenceParameterList(final PsiBuilder builder, final boolean wildcard, final boolean diamonds) { final PsiBuilder.Marker list = builder.mark(); if (!expect(builder, JavaTokenType.LT)) { list.done(JavaElementType.REFERENCE_PARAMETER_LIST); return false; } int flags = set(set(EAT_LAST_DOT, WILDCARD, wildcard), DIAMONDS, diamonds); boolean isOk = true; while (true) { if (parseTypeInfo(builder, flags, true) == null) { error(builder, JavaErrorMessages.message("expected.identifier")); } else { IElementType tokenType = builder.getTokenType(); if (WILDCARD_KEYWORD_SET.contains(tokenType)) { parseReferenceList(builder, tokenType, null, JavaTokenType.AND); } } if (expect(builder, JavaTokenType.GT)) { break; } else if (!expectOrError(builder, JavaTokenType.COMMA, "expected.gt.or.comma")) { isOk = false; break; } flags = set(flags, DIAMONDS, false); } list.done(JavaElementType.REFERENCE_PARAMETER_LIST); return isOk; }
@NotNull public PsiBuilder.Marker parseTypeParameters(final PsiBuilder builder) { final PsiBuilder.Marker list = builder.mark(); if (!expect(builder, JavaTokenType.LT)) { list.done(JavaElementType.TYPE_PARAMETER_LIST); return list; } while (true) { final PsiBuilder.Marker param = parseTypeParameter(builder); if (param == null) { error(builder, JavaErrorMessages.message("expected.type.parameter")); } if (!expect(builder, JavaTokenType.COMMA)) { break; } } if (!expect(builder, JavaTokenType.GT)) { // hack for completion if (builder.getTokenType() == JavaTokenType.IDENTIFIER) { if (builder.lookAhead(1) == JavaTokenType.GT) { final PsiBuilder.Marker errorElement = builder.mark(); builder.advanceLexer(); errorElement.error(JavaErrorMessages.message("unexpected.identifier")); builder.advanceLexer(); } else { error(builder, JavaErrorMessages.message("expected.gt")); } } else { error(builder, JavaErrorMessages.message("expected.gt")); } } list.done(JavaElementType.TYPE_PARAMETER_LIST); return list; }
@Nullable public PsiBuilder.Marker parseEnumConstant(final PsiBuilder builder) { final PsiBuilder.Marker constant = builder.mark(); parseModifierList(builder); if (expect(builder, JavaTokenType.IDENTIFIER)) { if (builder.getTokenType() == JavaTokenType.LPARENTH) { myParser.getExpressionParser().parseArgumentList(builder); } else { emptyElement(builder, JavaElementType.EXPRESSION_LIST); } if (builder.getTokenType() == JavaTokenType.LBRACE) { final PsiBuilder.Marker constantInit = builder.mark(); parseClassBodyWithBraces(builder, false, false); done(constantInit, JavaElementType.ENUM_CONSTANT_INITIALIZER); } done(constant, JavaElementType.ENUM_CONSTANT); return constant; } else { constant.rollbackTo(); return null; } }