private static Indent getControlIndent(PsiElement parent, ASTNode child) { final PsiElement psi = child.getPsi(); final IElementType type = child.getElementType(); if (parent instanceof GrIfStatement) { final GrIfStatement ifStatement = (GrIfStatement) parent; if (!BLOCK_SET.contains(type)) { if (psi.equals(ifStatement.getThenBranch())) { return Indent.getNormalIndent(); } if (psi.equals(ifStatement.getElseBranch())) { if (getGroovySettings(parent).SPECIAL_ELSE_IF_TREATMENT && psi instanceof GrIfStatement) { return Indent.getNoneIndent(); } return Indent.getNormalIndent(); } } if (psi.equals(ifStatement.getCondition())) { return Indent.getContinuationWithoutFirstIndent(); } } if (parent instanceof GrWhileStatement) { if (psi.equals(((GrWhileStatement) parent).getBody()) && !BLOCK_SET.contains(type)) { return Indent.getNormalIndent(); } if (psi.equals(((GrWhileStatement) parent).getCondition())) { return Indent.getContinuationWithoutFirstIndent(); } } if (parent instanceof GrSynchronizedStatement) { if (psi.equals(((GrSynchronizedStatement) parent).getMonitor())) { return Indent.getContinuationWithoutFirstIndent(); } } if (parent instanceof GrForStatement) { if (psi.equals(((GrForStatement) parent).getBody()) && !BLOCK_SET.contains(type)) { return Indent.getNormalIndent(); } if (psi.equals(((GrForStatement) parent).getClause())) { return Indent.getContinuationWithoutFirstIndent(); } } return Indent.getNoneIndent(); }
/** * Calculates indent, based on code style, between parent block and child node * * @param parent parent block * @param child child node * @return indent */ @NotNull public static Indent getChildIndent( @NotNull final GroovyBlock parent, @NotNull final ASTNode child) { ASTNode astNode = parent.getNode(); final PsiElement psiParent = astNode.getPsi(); // For Groovy file if (psiParent instanceof GroovyFileBase) { return Indent.getNoneIndent(); } if (psiParent instanceof GrMethod && child.getPsi() instanceof GrParameterList) { return Indent.getContinuationIndent(); } if (GSTRING_TOKENS_INNER.contains(child.getElementType()) && mGSTRING_BEGIN != child.getElementType()) { return Indent.getAbsoluteNoneIndent(); } if (psiParent instanceof GrListOrMap) { if (mLBRACK.equals(child.getElementType()) || mRBRACK.equals(child.getElementType())) { return Indent.getNoneIndent(); } else { return Indent.getContinuationWithoutFirstIndent(); } } // For common code block if (BLOCK_SET.contains(astNode.getElementType()) && !BLOCK_STATEMENT.equals(astNode.getElementType())) { return indentForBlock(psiParent, child); } if (CASE_SECTION.equals(astNode.getElementType())) { return indentForCaseSection(child); } if (SWITCH_STATEMENT.equals(astNode.getElementType())) { return indentForSwitchStatement(psiParent, child); } if (psiParent instanceof GrLabeledStatement) { if (child.getPsi() instanceof GrLabel) { CommonCodeStyleSettings.IndentOptions indentOptions = parent.getSettings().getIndentOptions(); if (indentOptions.LABEL_INDENT_ABSOLUTE) { return Indent.getAbsoluteLabelIndent(); } return Indent.getLabelIndent(); } } // for control structures if (psiParent instanceof GrControlStatement) { return getControlIndent(psiParent, child); } if (psiParent instanceof GrExpression) { return getExpressionIndent(psiParent, child); } if (psiParent instanceof GrVariable && child.getPsi() == ((GrVariable) psiParent).getInitializerGroovy()) { return Indent.getNormalIndent(); } // For parameter lists if (psiParent instanceof GrParameterList || psiParent instanceof GrExtendsClause || psiParent instanceof GrThrowsClause) { if (parent.getIndent() != null) { return Indent.getContinuationWithoutFirstIndent(); } return Indent.getNoneIndent(); } // For arguments if (psiParent instanceof GrArgumentList) { if (child.getElementType() != mLPAREN && child.getElementType() != mRPAREN /*&& child.getElementType() != mCOMMA*/) { return Indent.getContinuationWithoutFirstIndent(); } } if ((psiParent instanceof GrDocComment && child.getElementType() != mGDOC_COMMENT_START) || psiParent instanceof GrDocTag && child.getElementType() != mGDOC_TAG_NAME) { return Indent.getSpaceIndent(GDOC_COMMENT_INDENT); } if (psiParent instanceof GrNamedArgument && child.getPsi() == ((GrNamedArgument) psiParent).getExpression()) { return Indent.getContinuationIndent(); } if (child.getPsi() instanceof GrVariable && psiParent instanceof GrVariableDeclaration) { return Indent.getContinuationWithoutFirstIndent(); } return Indent.getNoneIndent(); }