mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
no need to reuse GroovySpacingProcessor
This commit is contained in:
@@ -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 &&
|
||||
|
||||
+408
-479
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user