no need to reuse GroovySpacingProcessor

This commit is contained in:
peter
2011-03-23 15:38:59 +01:00
parent 1d11180d63
commit 575e78a3c9
2 changed files with 411 additions and 482 deletions
@@ -111,7 +111,7 @@ public class GroovyBlock implements Block, GroovyElementTypes {
}
/**
* Returns spacing between neighrbour elements
* Returns spacing between neighbour elements
*
* @param child1 left element
* @param child2 right element
@@ -120,7 +120,7 @@ public class GroovyBlock implements Block, GroovyElementTypes {
@Nullable
public Spacing getSpacing(Block child1, Block child2) {
if ((child1 instanceof GroovyBlock) && (child2 instanceof GroovyBlock)) {
Spacing spacing = GroovySpacingProcessor.getSpacing(((GroovyBlock) child1), ((GroovyBlock) child2), mySettings);
Spacing spacing = new GroovySpacingProcessor(((GroovyBlock)child2).getNode(), mySettings).getSpacing();
return spacing != null ? spacing : GroovySpacingProcessorBasic.getSpacing(((GroovyBlock) child1), ((GroovyBlock) child2), mySettings);
}
return null;
@@ -188,7 +188,7 @@ public class GroovyBlock implements Block, GroovyElementTypes {
* @param node Tree node
* @return true if node is incomplete
*/
public boolean isIncomplete(@NotNull final ASTNode node) {
public static boolean isIncomplete(@NotNull final ASTNode node) {
if (node.getElementType() instanceof ILazyParseableElementType) return false;
ASTNode lastChild = node.getLastChildNode();
while (lastChild != null &&
@@ -18,7 +18,6 @@ package org.jetbrains.plugins.groovy.formatter.processors;
import com.intellij.formatting.Spacing;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiIdentifier;
@@ -26,12 +25,10 @@ import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.tree.CompositeElement;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.plugins.groovy.formatter.GroovyBlock;
import org.jetbrains.plugins.groovy.lang.editor.actions.GroovyEditorActionUtil;
import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.*;
import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementVisitor;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.*;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
@@ -70,519 +67,451 @@ import static org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes.mRCURL
/**
* @author ilyas
*/
public class GroovySpacingProcessor extends GroovyPsiElementVisitor {
private static final ThreadLocal<GroovySpacingProcessor> mySharedProcessorAllocator = new ThreadLocal<GroovySpacingProcessor>();
protected MyGroovySpacingVisitor myGroovyElementVisitor;
protected static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.formatter.processors.GroovySpacingProcessor");
public class GroovySpacingProcessor extends GroovyElementVisitor {
private PsiElement myParent;
private final CodeStyleSettings mySettings;
private GroovySpacingProcessor(MyGroovySpacingVisitor visitor) {
super(visitor);
myGroovyElementVisitor = visitor;
}
private Spacing myResult;
private ASTNode myChild1;
private ASTNode myChild2;
public static Spacing getSpacing(GroovyBlock child1, GroovyBlock child2, CodeStyleSettings settings) {
return getSpacing(child2.getNode(), settings);
}
public GroovySpacingProcessor(ASTNode node, CodeStyleSettings settings) {
mySettings = settings;
private static Spacing getSpacing(ASTNode node, CodeStyleSettings settings) {
GroovySpacingProcessor spacingProcessor = mySharedProcessorAllocator.get();
try {
if (spacingProcessor == null) {
spacingProcessor = new GroovySpacingProcessor(new MyGroovySpacingVisitor(node, settings));
mySharedProcessorAllocator.set(spacingProcessor);
} else {
spacingProcessor.setVisitor(new MyGroovySpacingVisitor(node, settings));
_init(node);
if (myChild1 == null || myChild2 == null) {
return;
}
PsiElement psi1 = myChild1.getPsi();
PsiElement psi2 = myChild2.getPsi();
if (psi1 == null || psi2 == null) return;
if (psi1.getLanguage() != GROOVY_LANGUAGE || psi2.getLanguage() != GROOVY_LANGUAGE) {
return;
}
if (myChild2 != null && mySettings.KEEP_FIRST_COLUMN_COMMENT && SpacingUtil.COMMENT_BIT_SET.contains(myChild2.getElementType())) {
if (myChild1.getElementType() != IMPORT_STATEMENT) {
myResult = Spacing.createKeepingFirstColumnSpacing(0, Integer.MAX_VALUE, true, 1);
}
spacingProcessor.doInit();
return spacingProcessor.getResult();
return;
}
catch (Exception e) {
LOG.error(e);
return null;
if (myChild1 != null && myChild2 != null && myChild1.getElementType() == mNLS) {
final ASTNode prev = SpacingUtil.getPrevElementType(myChild1);
if (prev != null && prev.getElementType() == mSL_COMMENT) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
return;
}
}
finally {
spacingProcessor.clear();
if (myParent instanceof GroovyPsiElement) {
((GroovyPsiElement) myParent).accept(this);
}
}
private void doInit() {
myGroovyElementVisitor.doInit();
}
private void clear() {
if (myGroovyElementVisitor != null) {
myGroovyElementVisitor.clear();
}
}
private Spacing getResult() {
return myGroovyElementVisitor.getResult();
}
public void setVisitor(MyGroovySpacingVisitor visitor) {
myGroovyElementVisitor = visitor;
}
/**
* Visitor to adjust spaces via user Code Style Settings
*/
private static class MyGroovySpacingVisitor extends GroovyElementVisitor {
private PsiElement myParent;
private final CodeStyleSettings mySettings;
private Spacing myResult;
private ASTNode myChild1;
private ASTNode myChild2;
public MyGroovySpacingVisitor(ASTNode node, CodeStyleSettings settings) {
mySettings = settings;
init(node);
}
private void init(final ASTNode child) {
if (child == null) return;
private void _init(final ASTNode child) {
if (child != null) {
ASTNode treePrev = child.getTreePrev();
while (treePrev != null && SpacingUtil.isWhiteSpace(treePrev)) {
treePrev = treePrev.getTreePrev();
}
if (treePrev == null) {
init(child.getTreeParent());
} else {
_init(child.getTreeParent());
}
else {
myChild2 = child;
myChild1 = treePrev;
final CompositeElement parent = (CompositeElement) treePrev.getTreeParent();
final CompositeElement parent = (CompositeElement)treePrev.getTreeParent();
myParent = SourceTreeToPsiMap.treeElementToPsi(parent);
}
}
}
/*
Method to start visiting
*/
private void doInit() {
if (myChild1 == null || myChild2 == null) return;
PsiElement psi1 = myChild1.getPsi();
PsiElement psi2 = myChild2.getPsi();
if (psi1 == null || psi2 == null) return;
if (psi1.getLanguage() != GROOVY_LANGUAGE ||
psi2.getLanguage() != GROOVY_LANGUAGE) {
return;
}
@Override
public void visitAnnotation(GrAnnotation annotation) {
if (myChild2.getElementType() == ANNOTATION_ARGUMENTS) {
myResult = Spacing.createSpacing(0, 0, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
if (myChild2 != null && mySettings.KEEP_FIRST_COLUMN_COMMENT && SpacingUtil.COMMENT_BIT_SET.contains(myChild2.getElementType())) {
if (myChild1.getElementType() != IMPORT_STATEMENT) {
myResult = Spacing.createKeepingFirstColumnSpacing(0, Integer.MAX_VALUE, true, 1);
}
return;
}
public void visitArgumentList(GrArgumentList list) {
if (myChild1.getElementType() == mLBRACK || myChild2.getElementType() == mRBRACK) {
createSpaceInCode(mySettings.SPACE_WITHIN_BRACKETS);
}
// todo add other cases
}
if (myChild1 != null && myChild2 != null && myChild1.getElementType() == mNLS) {
final ASTNode prev = SpacingUtil.getPrevElementType(myChild1);
if (prev != null && prev.getElementType() == mSL_COMMENT) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
return;
}
}
@Override
public void visitMethodCallExpression(GrMethodCallExpression methodCallExpression) {
if (myChild2.getElementType() == ARGUMENTS) createSpaceInCode(mySettings.SPACE_BEFORE_METHOD_CALL_PARENTHESES);
}
if (myParent instanceof GroovyPsiElement) {
((GroovyPsiElement) myParent).accept(this);
public void visitClosure(GrClosableBlock closure) {
if ((myChild1.getElementType() == mLCURLY && myChild2.getElementType() != PARAMETERS_LIST && myChild2.getElementType() != mCLOSABLE_BLOCK_OP)
|| myChild2.getElementType() == mRCURLY) {
myResult = Spacing.createDependentLFSpacing(0, Integer.MAX_VALUE, closure.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else if (myChild1.getElementType() == mCLOSABLE_BLOCK_OP) {
GrStatement[] statements = closure.getStatements();
if (statements.length > 0) {
TextRange range = new TextRange(statements[0].getTextRange().getStartOffset(), statements[statements.length - 1].getTextRange().getEndOffset());
myResult = Spacing.createDependentLFSpacing(1, Integer.MAX_VALUE, range, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}
@Override
public void visitAnnotation(GrAnnotation annotation) {
if (myChild2.getElementType() == ANNOTATION_ARGUMENTS) {
myResult = Spacing.createSpacing(0, 0, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
public void visitOpenBlock(GrOpenBlock block) {
if (myChild1.getElementType() == mLCURLY && myChild2.getElementType() == mRCURLY && block.getParent() instanceof GrBlockStatement) {
myResult = Spacing.createSpacing(1, 1, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else
if (myChild1.getElementType() == mLCURLY && !GroovyEditorActionUtil.isMultilineStringElement(myChild2) ||
myChild2.getElementType() == mRCURLY && !GroovyEditorActionUtil.isMultilineStringElement(myChild1)) {
myResult = Spacing.createDependentLFSpacing(0, 1, block.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
public void visitArgumentList(GrArgumentList list) {
if (myChild1.getElementType() == mLBRACK || myChild2.getElementType() == mRBRACK) {
createSpaceInCode(mySettings.SPACE_WITHIN_BRACKETS);
}
// todo add other cases
}
@Override
public void visitMethodCallExpression(GrMethodCallExpression methodCallExpression) {
if (myChild2.getElementType() == ARGUMENTS) createSpaceInCode(mySettings.SPACE_BEFORE_METHOD_CALL_PARENTHESES);
}
public void visitClosure(GrClosableBlock closure) {
if ((myChild1.getElementType() == mLCURLY && myChild2.getElementType() != PARAMETERS_LIST && myChild2.getElementType() != mCLOSABLE_BLOCK_OP)
|| myChild2.getElementType() == mRCURLY) {
myResult = Spacing.createDependentLFSpacing(0, Integer.MAX_VALUE, closure.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else if (myChild1.getElementType() == mCLOSABLE_BLOCK_OP) {
GrStatement[] statements = closure.getStatements();
if (statements.length > 0) {
TextRange range = new TextRange(statements[0].getTextRange().getStartOffset(), statements[statements.length - 1].getTextRange().getEndOffset());
myResult = Spacing.createDependentLFSpacing(1, Integer.MAX_VALUE, range, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}
public void visitOpenBlock(GrOpenBlock block) {
if (myChild1.getElementType() == mLCURLY && myChild2.getElementType() == mRCURLY && block.getParent() instanceof GrBlockStatement) {
myResult = Spacing.createSpacing(1, 1, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else
if (myChild1.getElementType() == mLCURLY && !GroovyEditorActionUtil.isMultilineStringElement(myChild2) ||
myChild2.getElementType() == mRCURLY && !GroovyEditorActionUtil.isMultilineStringElement(myChild1)) {
myResult = Spacing.createDependentLFSpacing(0, 1, block.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
public void visitNewExpression(GrNewExpression newExpression) {
if (myChild1.getElementType() == kNEW) {
createSpaceInCode(true);
} else if (myChild2.getElementType() == ARGUMENTS) {
createSpaceInCode(mySettings.SPACE_BEFORE_METHOD_CALL_PARENTHESES);
}
}
public void visitTypeDefinition(GrTypeDefinition typeDefinition) {
if (myChild2.getElementType() == CLASS_BODY) {
PsiIdentifier nameIdentifier = typeDefinition.getNameIdentifier();
int dependanceStart = nameIdentifier == null ? myParent.getTextRange().getStartOffset() : nameIdentifier.getTextRange().getStartOffset();
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_CLASS_LBRACE, mySettings.CLASS_BRACE_STYLE,
new TextRange(dependanceStart, myChild1.getTextRange().getEndOffset()), false);
}
}
public void visitTypeDefinitionBody(GrTypeDefinitionBody typeDefinitionBody) {
if (myChild1.getElementType() == mLCURLY && myChild2.getElementType() == mRCURLY) {
myResult = Spacing.createSpacing(0, 0, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_BEFORE_RBRACE);
} else if (myChild1.getElementType() == mLCURLY) {
myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AFTER_CLASS_HEADER + 1,
mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_DECLARATIONS);
} else if (myChild2.getElementType() == mRCURLY) {
myResult = Spacing.createSpacing(0, Integer.MAX_VALUE, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_BEFORE_RBRACE);
}
}
public void visitMethod(GrMethod method) {
if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_METHOD_PARENTHESES);
} else if (myChild2.getElementType() == mRPAREN && myChild2.getElementType() == THROW_CLAUSE) {
createSpaceInCode(true);
} else if (isOpenBlock(myChild2)) {
PsiElement methodName = method.getNameIdentifier();
int dependancyStart = methodName == null ? myParent.getTextRange().getStartOffset() : methodName.getTextRange().getStartOffset();
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_METHOD_LBRACE, mySettings.METHOD_BRACE_STYLE,
new TextRange(dependancyStart, myChild1.getTextRange().getEndOffset()), mySettings.KEEP_SIMPLE_METHODS_IN_ONE_LINE);
} else if (myChild1.getElementType() == MODIFIERS) {
processModifierList(myChild1);
} else if (COMMENT_SET.contains(myChild1.getElementType())
&& (myChild2.getElementType() == MODIFIERS || myChild2.getElementType() == REFERENCE_ELEMENT)) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, 0);
}
}
private static boolean isOpenBlock(final ASTNode node) {
return node.getElementType() == OPEN_BLOCK || node.getElementType() == CONSTRUCTOR_BODY;
}
public void visitDocMethodReference(GrDocMethodReference reference) {
visitDocMember();
}
public void visitDocFieldReference(GrDocFieldReference reference) {
visitDocMember();
}
private void visitDocMember() {
myResult = Spacing.createSpacing(0, 0, 0, false, 0);
}
public void visitDocMethodParameterList(GrDocMethodParams params) {
if (myChild1.getElementType() == mGDOC_TAG_VALUE_LPAREN || myChild2.getElementType() == mGDOC_TAG_VALUE_RPAREN) {
myResult = Spacing.createSpacing(0, 0, 0, false, 0);
return;
}
if (myChild2.getElementType() == mGDOC_TAG_VALUE_COMMA) {
myResult = Spacing.createSpacing(0, 0, 0, false, 0);
return;
}
public void visitNewExpression(GrNewExpression newExpression) {
if (myChild1.getElementType() == kNEW) {
createSpaceInCode(true);
} else if (myChild2.getElementType() == ARGUMENTS) {
createSpaceInCode(mySettings.SPACE_BEFORE_METHOD_CALL_PARENTHESES);
}
}
public void visitDocMethodParameter(GrDocMethodParameter parameter) {
if (myChild1.getTreePrev() == null) {
createSpaceInCode(true);
}
public void visitTypeDefinition(GrTypeDefinition typeDefinition) {
if (myChild2.getElementType() == CLASS_BODY) {
PsiIdentifier nameIdentifier = typeDefinition.getNameIdentifier();
int dependanceStart = nameIdentifier == null ? myParent.getTextRange().getStartOffset() : nameIdentifier.getTextRange().getStartOffset();
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_CLASS_LBRACE, mySettings.CLASS_BRACE_STYLE,
new TextRange(dependanceStart, myChild1.getTextRange().getEndOffset()), false);
}
}
public void visitWhileStatement(GrWhileStatement statement) {
if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_WHILE_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN || myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_WHILE_PARENTHESES);
} else if (myChild2.getPsi() instanceof GrBlockStatement) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_WHILE_LBRACE, mySettings.BRACE_STYLE,
new TextRange(myParent.getTextRange().getStartOffset(), myChild1.getTextRange().getEndOffset()), mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else {
createSpacingBeforeElementInsideControlStatement();
}
public void visitTypeDefinitionBody(GrTypeDefinitionBody typeDefinitionBody) {
if (myChild1.getElementType() == mLCURLY && myChild2.getElementType() == mRCURLY) {
myResult = Spacing.createSpacing(0, 0, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_BEFORE_RBRACE);
} else if (myChild1.getElementType() == mLCURLY) {
myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AFTER_CLASS_HEADER + 1,
mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_DECLARATIONS);
} else if (myChild2.getElementType() == mRCURLY) {
myResult = Spacing.createSpacing(0, Integer.MAX_VALUE, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_BEFORE_RBRACE);
}
}
public void visitCatchClause(GrCatchClause catchClause) {
if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_TRY_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
public void visitMethod(GrMethod method) {
if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_METHOD_PARENTHESES);
} else if (myChild2.getElementType() == mRPAREN && myChild2.getElementType() == THROW_CLAUSE) {
createSpaceInCode(true);
} else if (isOpenBlock(myChild2)) {
PsiElement methodName = method.getNameIdentifier();
int dependancyStart = methodName == null ? myParent.getTextRange().getStartOffset() : methodName.getTextRange().getStartOffset();
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_METHOD_LBRACE, mySettings.METHOD_BRACE_STYLE,
new TextRange(dependancyStart, myChild1.getTextRange().getEndOffset()), mySettings.KEEP_SIMPLE_METHODS_IN_ONE_LINE);
} else if (myChild1.getElementType() == MODIFIERS) {
processModifierList(myChild1);
} else if (COMMENT_SET.contains(myChild1.getElementType())
&& (myChild2.getElementType() == MODIFIERS || myChild2.getElementType() == REFERENCE_ELEMENT)) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, 0);
}
public void visitFinallyClause(GrFinallyClause catchClause) {
if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_TRY_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
}
public void visitTryStatement(GrTryCatchStatement tryCatchStatement) {
if (myChild2.getElementType() == FINALLY_CLAUSE) {
processOnNewLineCondition(mySettings.FINALLY_ON_NEW_LINE);
} else if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_TRY_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else if (myChild2.getElementType() == CATCH_CLAUSE) {
processOnNewLineCondition(mySettings.CATCH_ON_NEW_LINE);
}
}
public void visitSwitchStatement(GrSwitchStatement switchStatement) {
if (myChild1.getElementType() == kSWITCH && myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_SWITCH_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN || myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_SWITCH_PARENTHESES);
} else if (myChild2.getElementType() == mLCURLY) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_SWITCH_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
}
public void visitSynchronizedStatement(GrSynchronizedStatement synchronizedStatement) {
if (myChild1.getElementType() == kSYNCHRONIZED || myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_SYNCHRONIZED_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN || myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_SYNCHRONIZED_PARENTHESES);
} else if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_SYNCHRONIZED_LBRACE,
mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
}
public void visitDocComment(GrDocComment comment) {
if (myChild1.getElementType() == GDOC_TAG &&
myChild2.getElementType() == GDOC_TAG &&
mySettings.JD_LEADING_ASTERISKS_ARE_ENABLED) {
IElementType type = myChild1.getLastChildNode().getElementType();
if (type == mGDOC_ASTERISKS) {
myResult = Spacing.createSpacing(1, 1, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}
public void visitDocTag(GrDocTag docTag) {
if (myChild1.getElementType() == mGDOC_INLINE_TAG_START ||
myChild2.getElementType() == mGDOC_INLINE_TAG_END) {
myResult = Spacing.createSpacing(0, 0, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
public void visitIfStatement(GrIfStatement ifStatement) {
if (myChild2.getElementType() == kELSE) {
if (!isOpenBlock(myChild1) && myChild1.getElementType() != BLOCK_STATEMENT) {
myResult = Spacing.createSpacing(1, 1, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
if (mySettings.ELSE_ON_NEW_LINE) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
createSpaceProperty(true, false, 0);
}
}
} else if (myChild1.getElementType() == kELSE) {
if (myChild2.getElementType() == IF_STATEMENT) {
if (mySettings.SPECIAL_ELSE_IF_TREATMENT) {
createSpaceProperty(true, false, 0);
} else {
myResult = Spacing.createSpacing(1, 1, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
} else {
if (myChild2.getElementType() == BLOCK_STATEMENT || isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_ELSE_LBRACE, mySettings.BRACE_STYLE,
null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else {
createSpacingBeforeElementInsideControlStatement();
}
}
} else if (myChild2.getElementType() == BLOCK_STATEMENT || isOpenBlock(myChild2)) {
boolean space = myChild2.getPsi() == ((GrIfStatement) myParent).getElseBranch() ? mySettings.SPACE_BEFORE_ELSE_LBRACE : mySettings.SPACE_BEFORE_IF_LBRACE;
myResult = getSpaceBeforeLBrace(space, mySettings.BRACE_STYLE, new TextRange(myParent.getTextRange().getStartOffset(),
myChild1.getTextRange().getEndOffset()),
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_IF_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_IF_PARENTHESES);
} else if (myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_IF_PARENTHESES);
} else if (((GrIfStatement) myParent).getThenBranch() == myChild2.getPsi()) {
createSpacingBeforeElementInsideControlStatement();
}
}
public void visitForStatement(GrForStatement forStatement) {
if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_FOR_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN) {
ASTNode rparenth = findFrom(myChild2, mRPAREN, true);
if (rparenth == null) {
createSpaceInCode(mySettings.SPACE_WITHIN_FOR_PARENTHESES);
} else {
createParenSpace(mySettings.FOR_STATEMENT_LPAREN_ON_NEXT_LINE, mySettings.SPACE_WITHIN_FOR_PARENTHESES,
new TextRange(myChild1.getTextRange().getStartOffset(), rparenth.getTextRange().getEndOffset()));
}
} else if (myChild2.getElementType() == mRPAREN) {
ASTNode lparenth = findFrom(myChild2, mLPAREN, false);
if (lparenth == null) {
createSpaceInCode(mySettings.SPACE_WITHIN_FOR_PARENTHESES);
} else {
createParenSpace(mySettings.FOR_STATEMENT_RPAREN_ON_NEXT_LINE, mySettings.SPACE_WITHIN_FOR_PARENTHESES,
new TextRange(lparenth.getTextRange().getStartOffset(), myChild2.getTextRange().getEndOffset()));
}
} else if (myChild2.getElementType() == BLOCK_STATEMENT || isOpenBlock(myChild2)) {
if (myChild2.getElementType() == BLOCK_STATEMENT) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_FOR_LBRACE, mySettings.BRACE_STYLE,
new TextRange(myParent.getTextRange().getStartOffset(), myChild1.getTextRange().getEndOffset()), mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else if (mySettings.KEEP_CONTROL_STATEMENT_IN_ONE_LINE) {
myResult = Spacing.createDependentLFSpacing(1, 1, myParent.getTextRange(), false, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createSpacing(0, 0, 1, false, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}
private void createParenSpace(final boolean onNewLine, final boolean space) {
createParenSpace(onNewLine, space, myParent.getTextRange());
}
private void createParenSpace(final boolean onNewLine, final boolean space, final TextRange dependance) {
if (onNewLine) {
final int spaces = space ? 1 : 0;
myResult = Spacing
.createDependentLFSpacing(spaces, spaces, dependance, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
createSpaceInCode(space);
}
}
private static ASTNode findFrom(ASTNode current, final IElementType expected, boolean forward) {
while (current != null) {
if (current.getElementType() == expected) return current;
current = forward ? current.getTreeNext() : current.getTreePrev();
}
return null;
}
private void processOnNewLineCondition(final boolean onNewLine) {
if (onNewLine) {
if (!mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createDependentLFSpacing(0, 1, myParent.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
} else {
createSpaceProperty(true, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
private void createSpacingBeforeElementInsideControlStatement() {
if (mySettings.KEEP_CONTROL_STATEMENT_IN_ONE_LINE && myChild1.getElementType() != mSL_COMMENT) {
createSpaceProperty(true, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createSpacing(1, 1, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
private void processModifierList(ASTNode modifierList) {
if (modifierList.getLastChildNode().getElementType() == ANNOTATION && mySettings.METHOD_ANNOTATION_WRAP == CodeStyleSettings.WRAP_ALWAYS) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
else if (mySettings.MODIFIER_LIST_WRAP) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
else {
createSpaceProperty(true, false, 0);
}
}
protected void clear() {
myResult = null;
myChild2 = myChild1 = null;
myParent = null;
}
protected Spacing getResult() {
final Spacing result = myResult;
clear();
return result;
}
private void createSpaceInCode(final boolean space) {
createSpaceProperty(space, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
private void createSpaceProperty(boolean space, int keepBlankLines) {
createSpaceProperty(space, mySettings.KEEP_LINE_BREAKS, keepBlankLines);
}
private void createSpaceProperty(boolean space, boolean keepLineBreaks, final int keepBlankLines) {
final ASTNode prev = SpacingUtil.getPrevElementType(myChild2);
if (prev != null && prev.getElementType() == mSL_COMMENT) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createSpacing(space ? 1 : 0, space ? 1 : 0, 0, keepLineBreaks, keepBlankLines);
}
}
private Spacing getSpaceBeforeLBrace(final boolean spaceBeforeLbrace, int braceStyle, TextRange dependantRange, boolean keepOneLine) {
if (dependantRange != null && braceStyle == CodeStyleSettings.NEXT_LINE_IF_WRAPPED) {
int space = spaceBeforeLbrace ? 1 : 0;
return createNonLFSpace(space, dependantRange, false);
} else if (braceStyle == CodeStyleSettings.END_OF_LINE || braceStyle == CodeStyleSettings.NEXT_LINE_IF_WRAPPED) {
int space = spaceBeforeLbrace ? 1 : 0;
return createNonLFSpace(space, null, false);
} else if (keepOneLine) {
int space = spaceBeforeLbrace ? 1 : 0;
return Spacing.createDependentLFSpacing(space, space, myParent.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
return Spacing.createSpacing(0, 0, 1, false, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
private Spacing createNonLFSpace(int spaces, final TextRange dependantRange, final boolean keepLineBreaks) {
final ASTNode prev = SpacingUtil.getPrevElementType(myChild2);
if (prev != null && prev.getElementType() == mSL_COMMENT) {
return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, keepLineBreaks, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else if (dependantRange != null) {
return Spacing.createDependentLFSpacing(spaces, spaces, dependantRange, keepLineBreaks, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
return Spacing.createSpacing(spaces, spaces, 0, keepLineBreaks, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}
private static boolean isOpenBlock(final ASTNode node) {
return node.getElementType() == OPEN_BLOCK || node.getElementType() == CONSTRUCTOR_BODY;
}
public void visitDocMethodReference(GrDocMethodReference reference) {
visitDocMember();
}
public void visitDocFieldReference(GrDocFieldReference reference) {
visitDocMember();
}
private void visitDocMember() {
myResult = Spacing.createSpacing(0, 0, 0, false, 0);
}
public void visitDocMethodParameterList(GrDocMethodParams params) {
if (myChild1.getElementType() == mGDOC_TAG_VALUE_LPAREN || myChild2.getElementType() == mGDOC_TAG_VALUE_RPAREN) {
myResult = Spacing.createSpacing(0, 0, 0, false, 0);
return;
}
if (myChild2.getElementType() == mGDOC_TAG_VALUE_COMMA) {
myResult = Spacing.createSpacing(0, 0, 0, false, 0);
return;
}
createSpaceInCode(true);
}
public void visitDocMethodParameter(GrDocMethodParameter parameter) {
if (myChild1.getTreePrev() == null) {
createSpaceInCode(true);
}
}
public void visitWhileStatement(GrWhileStatement statement) {
if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_WHILE_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN || myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_WHILE_PARENTHESES);
} else if (myChild2.getPsi() instanceof GrBlockStatement) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_WHILE_LBRACE, mySettings.BRACE_STYLE,
new TextRange(myParent.getTextRange().getStartOffset(), myChild1.getTextRange().getEndOffset()), mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else {
createSpacingBeforeElementInsideControlStatement();
}
}
public void visitCatchClause(GrCatchClause catchClause) {
if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_TRY_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
}
public void visitFinallyClause(GrFinallyClause catchClause) {
if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_TRY_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
}
public void visitTryStatement(GrTryCatchStatement tryCatchStatement) {
if (myChild2.getElementType() == FINALLY_CLAUSE) {
processOnNewLineCondition(mySettings.FINALLY_ON_NEW_LINE);
} else if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_TRY_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else if (myChild2.getElementType() == CATCH_CLAUSE) {
processOnNewLineCondition(mySettings.CATCH_ON_NEW_LINE);
}
}
public void visitSwitchStatement(GrSwitchStatement switchStatement) {
if (myChild1.getElementType() == kSWITCH && myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_SWITCH_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN || myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_SWITCH_PARENTHESES);
} else if (myChild2.getElementType() == mLCURLY) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_SWITCH_LBRACE, mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
}
public void visitSynchronizedStatement(GrSynchronizedStatement synchronizedStatement) {
if (myChild1.getElementType() == kSYNCHRONIZED || myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_SYNCHRONIZED_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN || myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_SYNCHRONIZED_PARENTHESES);
} else if (isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_SYNCHRONIZED_LBRACE,
mySettings.BRACE_STYLE, null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
}
}
public void visitDocComment(GrDocComment comment) {
if (myChild1.getElementType() == GDOC_TAG &&
myChild2.getElementType() == GDOC_TAG &&
mySettings.JD_LEADING_ASTERISKS_ARE_ENABLED) {
IElementType type = myChild1.getLastChildNode().getElementType();
if (type == mGDOC_ASTERISKS) {
myResult = Spacing.createSpacing(1, 1, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}
public void visitDocTag(GrDocTag docTag) {
if (myChild1.getElementType() == mGDOC_INLINE_TAG_START ||
myChild2.getElementType() == mGDOC_INLINE_TAG_END) {
myResult = Spacing.createSpacing(0, 0, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
public void visitIfStatement(GrIfStatement ifStatement) {
if (myChild2.getElementType() == kELSE) {
if (!isOpenBlock(myChild1) && myChild1.getElementType() != BLOCK_STATEMENT) {
myResult = Spacing.createSpacing(1, 1, 0, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
if (mySettings.ELSE_ON_NEW_LINE) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
createSpaceProperty(true, false, 0);
}
}
} else if (myChild1.getElementType() == kELSE) {
if (myChild2.getElementType() == IF_STATEMENT) {
if (mySettings.SPECIAL_ELSE_IF_TREATMENT) {
createSpaceProperty(true, false, 0);
} else {
myResult = Spacing.createSpacing(1, 1, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
} else {
if (myChild2.getElementType() == BLOCK_STATEMENT || isOpenBlock(myChild2)) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_ELSE_LBRACE, mySettings.BRACE_STYLE,
null,
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else {
createSpacingBeforeElementInsideControlStatement();
}
}
} else if (myChild2.getElementType() == BLOCK_STATEMENT || isOpenBlock(myChild2)) {
boolean space = myChild2.getPsi() == ((GrIfStatement) myParent).getElseBranch() ? mySettings.SPACE_BEFORE_ELSE_LBRACE : mySettings.SPACE_BEFORE_IF_LBRACE;
myResult = getSpaceBeforeLBrace(space, mySettings.BRACE_STYLE, new TextRange(myParent.getTextRange().getStartOffset(),
myChild1.getTextRange().getEndOffset()),
mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_IF_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_IF_PARENTHESES);
} else if (myChild2.getElementType() == mRPAREN) {
createSpaceInCode(mySettings.SPACE_WITHIN_IF_PARENTHESES);
} else if (((GrIfStatement) myParent).getThenBranch() == myChild2.getPsi()) {
createSpacingBeforeElementInsideControlStatement();
}
}
public void visitForStatement(GrForStatement forStatement) {
if (myChild2.getElementType() == mLPAREN) {
createSpaceInCode(mySettings.SPACE_BEFORE_FOR_PARENTHESES);
} else if (myChild1.getElementType() == mLPAREN) {
ASTNode rparenth = findFrom(myChild2, mRPAREN, true);
if (rparenth == null) {
createSpaceInCode(mySettings.SPACE_WITHIN_FOR_PARENTHESES);
} else {
createParenSpace(mySettings.FOR_STATEMENT_LPAREN_ON_NEXT_LINE, mySettings.SPACE_WITHIN_FOR_PARENTHESES,
new TextRange(myChild1.getTextRange().getStartOffset(), rparenth.getTextRange().getEndOffset()));
}
} else if (myChild2.getElementType() == mRPAREN) {
ASTNode lparenth = findFrom(myChild2, mLPAREN, false);
if (lparenth == null) {
createSpaceInCode(mySettings.SPACE_WITHIN_FOR_PARENTHESES);
} else {
createParenSpace(mySettings.FOR_STATEMENT_RPAREN_ON_NEXT_LINE, mySettings.SPACE_WITHIN_FOR_PARENTHESES,
new TextRange(lparenth.getTextRange().getStartOffset(), myChild2.getTextRange().getEndOffset()));
}
} else if (myChild2.getElementType() == BLOCK_STATEMENT || isOpenBlock(myChild2)) {
if (myChild2.getElementType() == BLOCK_STATEMENT) {
myResult = getSpaceBeforeLBrace(mySettings.SPACE_BEFORE_FOR_LBRACE, mySettings.BRACE_STYLE,
new TextRange(myParent.getTextRange().getStartOffset(), myChild1.getTextRange().getEndOffset()), mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE);
} else if (mySettings.KEEP_CONTROL_STATEMENT_IN_ONE_LINE) {
myResult = Spacing.createDependentLFSpacing(1, 1, myParent.getTextRange(), false, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createSpacing(0, 0, 1, false, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}
private void createParenSpace(final boolean onNewLine, final boolean space) {
createParenSpace(onNewLine, space, myParent.getTextRange());
}
private void createParenSpace(final boolean onNewLine, final boolean space, final TextRange dependance) {
if (onNewLine) {
final int spaces = space ? 1 : 0;
myResult = Spacing
.createDependentLFSpacing(spaces, spaces, dependance, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
createSpaceInCode(space);
}
}
private static ASTNode findFrom(ASTNode current, final IElementType expected, boolean forward) {
while (current != null) {
if (current.getElementType() == expected) return current;
current = forward ? current.getTreeNext() : current.getTreePrev();
}
return null;
}
private void processOnNewLineCondition(final boolean onNewLine) {
if (onNewLine) {
if (!mySettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createDependentLFSpacing(0, 1, myParent.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
} else {
createSpaceProperty(true, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
private void createSpacingBeforeElementInsideControlStatement() {
if (mySettings.KEEP_CONTROL_STATEMENT_IN_ONE_LINE && myChild1.getElementType() != mSL_COMMENT) {
createSpaceProperty(true, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createSpacing(1, 1, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
private void processModifierList(ASTNode modifierList) {
if (modifierList.getLastChildNode().getElementType() == ANNOTATION && mySettings.METHOD_ANNOTATION_WRAP == CodeStyleSettings.WRAP_ALWAYS) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
else if (mySettings.MODIFIER_LIST_WRAP) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
else {
createSpaceProperty(true, false, 0);
}
}
public Spacing getSpacing() {
return myResult;
}
private void createSpaceInCode(final boolean space) {
createSpaceProperty(space, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
private void createSpaceProperty(boolean space, int keepBlankLines) {
createSpaceProperty(space, mySettings.KEEP_LINE_BREAKS, keepBlankLines);
}
private void createSpaceProperty(boolean space, boolean keepLineBreaks, final int keepBlankLines) {
final ASTNode prev = SpacingUtil.getPrevElementType(myChild2);
if (prev != null && prev.getElementType() == mSL_COMMENT) {
myResult = Spacing.createSpacing(0, 0, 1, mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
myResult = Spacing.createSpacing(space ? 1 : 0, space ? 1 : 0, 0, keepLineBreaks, keepBlankLines);
}
}
private Spacing getSpaceBeforeLBrace(final boolean spaceBeforeLbrace, int braceStyle, TextRange dependantRange, boolean keepOneLine) {
if (dependantRange != null && braceStyle == CodeStyleSettings.NEXT_LINE_IF_WRAPPED) {
int space = spaceBeforeLbrace ? 1 : 0;
return createNonLFSpace(space, dependantRange, false);
} else if (braceStyle == CodeStyleSettings.END_OF_LINE || braceStyle == CodeStyleSettings.NEXT_LINE_IF_WRAPPED) {
int space = spaceBeforeLbrace ? 1 : 0;
return createNonLFSpace(space, null, false);
} else if (keepOneLine) {
int space = spaceBeforeLbrace ? 1 : 0;
return Spacing.createDependentLFSpacing(space, space, myParent.getTextRange(), mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
return Spacing.createSpacing(0, 0, 1, false, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
private Spacing createNonLFSpace(int spaces, final TextRange dependantRange, final boolean keepLineBreaks) {
final ASTNode prev = SpacingUtil.getPrevElementType(myChild2);
if (prev != null && prev.getElementType() == mSL_COMMENT) {
return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, keepLineBreaks, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else if (dependantRange != null) {
return Spacing.createDependentLFSpacing(spaces, spaces, dependantRange, keepLineBreaks, mySettings.KEEP_BLANK_LINES_IN_CODE);
} else {
return Spacing.createSpacing(spaces, spaces, 0, keepLineBreaks, mySettings.KEEP_BLANK_LINES_IN_CODE);
}
}
}