mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fixed failing test "testWrapMethodAnnotationBeforeParams"
Added possibility to specify parent block for AbstractJavaBlock. When processing method, wrap after annotation (on keyword "public, private, protected") is set to be parent of method parameters wrap. So when wrap occurs parent wrap is used instead of method parameter wrap (which is now child)
This commit is contained in:
@@ -39,6 +39,7 @@ import com.intellij.psi.impl.source.tree.java.ClassElement;
|
||||
import com.intellij.psi.jsp.JspElementType;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.text.CharArrayUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -90,6 +91,8 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
|
||||
private final JavaWrapManager myWrapManager;
|
||||
private final AlignmentInColumnsHelper myAlignmentInColumnsHelper;
|
||||
private Map<IElementType, Wrap> myPreferredWraps;
|
||||
private AbstractJavaBlock myParentBlock;
|
||||
|
||||
protected AbstractJavaBlock(@NotNull final ASTNode node,
|
||||
final Wrap wrap,
|
||||
@@ -505,12 +508,9 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
mySettings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS);
|
||||
}
|
||||
else if (childType == JavaTokenType.LPARENTH && nodeType == JavaElementType.PARAMETER_LIST) {
|
||||
// There is a possible case that particular annotated method definition is too long. We may wrap either after annotation
|
||||
// or after opening lbrace then. Our strategy is to wrap after annotation whenever possible.
|
||||
Wrap wrap = Wrap.createWrap(getWrapType(mySettings.METHOD_PARAMETERS_WRAP), false);
|
||||
child = processParenthesisBlock(result, child,
|
||||
WrappingStrategy.createDoNotWrapCommaStrategy(wrap),
|
||||
mySettings.ALIGN_MULTILINE_PARAMETERS);
|
||||
Wrap wrapToUse = getMethodParametersWrap();
|
||||
WrappingStrategy wrapStrategy = WrappingStrategy.createDoNotWrapCommaStrategy(wrapToUse);
|
||||
child = processParenthesisBlock(result, child, wrapStrategy, mySettings.ALIGN_MULTILINE_PARAMETERS);
|
||||
}
|
||||
else if (childType == JavaTokenType.LPARENTH && nodeType == JavaElementType.RESOURCE_LIST) {
|
||||
Wrap wrap = Wrap.createWrap(getWrapType(mySettings.RESOURCE_LIST_WRAP), false);
|
||||
@@ -572,6 +572,25 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
return child;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private Wrap getMethodParametersWrap() {
|
||||
Wrap preferredWrap = getModifierListWrap();
|
||||
if (preferredWrap == null) {
|
||||
return Wrap.createWrap(getWrapType(mySettings.METHOD_PARAMETERS_WRAP), false);
|
||||
} else {
|
||||
return Wrap.createChildWrap(preferredWrap, getWrapType(mySettings.METHOD_PARAMETERS_WRAP), false);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Wrap getModifierListWrap() {
|
||||
AbstractJavaBlock parentBlock = getParentBlock();
|
||||
if (parentBlock != null) {
|
||||
return parentBlock.getReservedWrap(JavaElementType.MODIFIER_LIST);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private ASTNode processField(@NotNull final List<Block> result,
|
||||
ASTNode child,
|
||||
@NotNull final AlignmentStrategy alignmentStrategy,
|
||||
@@ -1135,7 +1154,7 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
@Nullable
|
||||
@Override
|
||||
public Wrap getReservedWrap(IElementType elementType) {
|
||||
return null;
|
||||
return myPreferredWraps != null ? myPreferredWraps.get(elementType) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1150,7 +1169,11 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
* @param reservedWrap reserved wrap instance
|
||||
* @param operationType target operation type to associate with the given wrap instance
|
||||
*/
|
||||
protected void setReservedWrap(final Wrap reservedWrap, final IElementType operationType) {
|
||||
public void setReservedWrap(final Wrap reservedWrap, final IElementType operationType) {
|
||||
if (myPreferredWraps == null) {
|
||||
myPreferredWraps = ContainerUtil.newHashMap();
|
||||
}
|
||||
myPreferredWraps.put(operationType, reservedWrap);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -1262,6 +1285,14 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
return null;
|
||||
}
|
||||
|
||||
public AbstractJavaBlock getParentBlock() {
|
||||
return myParentBlock;
|
||||
}
|
||||
|
||||
public void setParentBlock(@NotNull AbstractJavaBlock parentBlock) {
|
||||
myParentBlock = parentBlock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows to answer if special 'variable declaration alignment' strategy should be used for the given node.
|
||||
* I.e. given node is supposed to be parent node of sub-nodes that should be aligned 'by-columns'.
|
||||
|
||||
@@ -61,8 +61,13 @@ public class BlockContainingJavaBlock extends AbstractJavaBlock{
|
||||
|
||||
buildChildren(result, childAlignment, childWrap);
|
||||
|
||||
return result;
|
||||
for (Block block : result) {
|
||||
if (block instanceof AbstractJavaBlock) {
|
||||
((AbstractJavaBlock)block).setParentBlock(this);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void buildChildren(final ArrayList<Block> result, final Alignment childAlignment, final Wrap childWrap) {
|
||||
|
||||
@@ -127,7 +127,7 @@ public class SimpleJavaBlock extends AbstractJavaBlock {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setReservedWrap(final Wrap reservedWrap, final IElementType operationType) {
|
||||
public void setReservedWrap(final Wrap reservedWrap, final IElementType operationType) {
|
||||
myReservedWrap.put(operationType, reservedWrap);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ import com.intellij.formatting.ASTBlock;
|
||||
import com.intellij.formatting.Block;
|
||||
import com.intellij.formatting.Wrap;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.psi.codeStyle.CodeStyleSettings;
|
||||
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
|
||||
import com.intellij.psi.formatter.java.AbstractJavaBlock;
|
||||
import com.intellij.psi.formatter.java.wrap.impl.JavaChildBlockWrapFactory;
|
||||
import com.intellij.psi.formatter.java.wrap.impl.JavaChildWrapArranger;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -79,7 +79,7 @@ public class JavaWrapManager {
|
||||
*/
|
||||
@Nullable
|
||||
public Wrap arrangeChildWrap(ASTNode child, ASTNode parent, CommonCodeStyleSettings settings, Wrap suggestedWrap,
|
||||
ReservedWrapsProvider reservedWrapsProvider)
|
||||
AbstractJavaBlock reservedWrapsProvider)
|
||||
{
|
||||
return myChildArranger.arrange(child, parent, settings, suggestedWrap, reservedWrapsProvider);
|
||||
}
|
||||
|
||||
+12
-3
@@ -22,6 +22,7 @@ import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleSettings;
|
||||
import com.intellij.psi.formatter.FormatterUtil;
|
||||
import com.intellij.psi.formatter.java.AbstractJavaBlock;
|
||||
import com.intellij.psi.formatter.java.JavaFormatterUtil;
|
||||
import com.intellij.psi.formatter.java.wrap.JavaWrapManager;
|
||||
import com.intellij.psi.formatter.java.wrap.ReservedWrapsProvider;
|
||||
@@ -70,7 +71,7 @@ public class JavaChildWrapArranger {
|
||||
ASTNode parent,
|
||||
CommonCodeStyleSettings settings,
|
||||
Wrap suggestedWrap,
|
||||
ReservedWrapsProvider reservedWrapsProvider) {
|
||||
AbstractJavaBlock reservedWrapsProvider) {
|
||||
final JavaCodeStyleSettings javaSettings = settings.getRootSettings().getCustomSettings(JavaCodeStyleSettings.class);
|
||||
ASTNode directParent = child.getTreeParent();
|
||||
int role = ((CompositeElement)directParent).getChildRole(child);
|
||||
@@ -188,8 +189,9 @@ public class JavaChildWrapArranger {
|
||||
if (javaSettings.DO_NOT_WRAP_AFTER_SINGLE_ANNOTATION && isFieldModifierListWithSingleAnnotation(parent)) {
|
||||
return Wrap.createWrap(WrapType.NONE, false);
|
||||
}
|
||||
|
||||
return Wrap.createWrap(getWrapType(getAnnotationWrapType(parent.getTreeParent(), child, settings)), true);
|
||||
Wrap wrap = Wrap.createWrap(getWrapType(getAnnotationWrapType(parent.getTreeParent(), child, settings)), true);
|
||||
putPreferredWrapInParentBlock(reservedWrapsProvider, wrap);
|
||||
return wrap;
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -263,6 +265,13 @@ public class JavaChildWrapArranger {
|
||||
return suggestedWrap;
|
||||
}
|
||||
|
||||
private static void putPreferredWrapInParentBlock(@NotNull AbstractJavaBlock block, @NotNull Wrap preferredWrap) {
|
||||
AbstractJavaBlock parentBlock = block.getParentBlock();
|
||||
if (parentBlock != null) {
|
||||
parentBlock.setReservedWrap(preferredWrap, JavaElementType.MODIFIER_LIST);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isFieldModifierListWithSingleAnnotation(@NotNull ASTNode elem) {
|
||||
ASTNode parent = elem.getTreeParent();
|
||||
if (parent != null && parent.getElementType() == JavaElementType.FIELD) {
|
||||
|
||||
@@ -260,7 +260,6 @@ public class JavaFormatterWrapTest extends AbstractJavaFormatterTest {
|
||||
);
|
||||
}
|
||||
|
||||
@Bombed(user = "Roman Shevchenko", year = 2014, month = Calendar.MARCH, day = 14)
|
||||
public void testWrapMethodAnnotationBeforeParams() {
|
||||
// Inspired by IDEA-59536
|
||||
getSettings().RIGHT_MARGIN = 90;
|
||||
|
||||
Reference in New Issue
Block a user