Added option to wrap first method call in method call chain (IDEA-105971)

This commit is contained in:
Yaroslav Lepenkin
2015-05-06 17:39:47 +03:00
parent e0ce6fb5ef
commit 9eb2ba1e8c
7 changed files with 41 additions and 7 deletions
@@ -153,7 +153,8 @@ public class JavaLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSett
"INDENT_CASE_FROM_SWITCH",
"SPECIAL_ELSE_IF_TREATMENT",
"ENUM_CONSTANTS_WRAP",
"ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS");
"ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS",
"WRAP_FIRST_METHOD_IN_CALL_CHAIN");
consumer.showCustomOption(JavaCodeStyleSettings.class,
"ANNOTATION_PARAMETER_WRAP",
@@ -58,9 +58,6 @@ class ChainMethodCallsBlockBuilder {
}
public Block build(List<ASTNode> nodes) {
myWrap = getNewWrap();
myChainedCallsAlignment = getNewAlignment();
List<Block> blocks = buildBlocksFrom(nodes);
Indent indent = myBlockIndent != null ? myBlockIndent : Indent.getContinuationWithoutFirstIndent(myIndentSettings.USE_RELATIVE_INDENTS);
@@ -69,6 +66,10 @@ class ChainMethodCallsBlockBuilder {
private List<Block> buildBlocksFrom(List<ASTNode> nodes) {
List<ChainedCallChunk> methodCall = splitMethodCallOnChunksByDots(nodes);
myWrap = getNewWrap(mySettings.WRAP_FIRST_METHOD_IN_CALL_CHAIN);
myChainedCallsAlignment = getNewAlignment();
Wrap wrapToUse = null;
Alignment alignmentToUse = null;
@@ -84,7 +85,7 @@ class ChainMethodCallsBlockBuilder {
alignmentToUse = null;
myChainedCallsAlignment = getNewAlignment();
myWrap = getNewWrap();
myWrap = getNewWrap(mySettings.WRAP_FIRST_METHOD_IN_CALL_CHAIN);
}
SyntheticBlockBuilder builder = new SyntheticBlockBuilder(mySettings, myJavaSettings);
@@ -125,8 +126,8 @@ class ChainMethodCallsBlockBuilder {
return AbstractJavaBlock.createAlignment(mySettings.ALIGN_MULTILINE_CHAINED_METHODS, null);
}
private Wrap getNewWrap() {
return Wrap.createWrap(getWrapType(mySettings.METHOD_CALL_CHAIN_WRAP), false);
private Wrap getNewWrap(boolean wrapFirst) {
return Wrap.createWrap(getWrapType(mySettings.METHOD_CALL_CHAIN_WRAP), wrapFirst);
}
private boolean isMethodCall(@NotNull ChainedCallChunk callChunk) {
@@ -590,5 +590,33 @@ public class JavaFormatterWrapTest extends AbstractJavaFormatterTest {
}
public void test_ChainedCalls_FirstOnNewLine() {
getSettings().METHOD_CALL_CHAIN_WRAP = CommonCodeStyleSettings.WRAP_ALWAYS;
getSettings().WRAP_FIRST_METHOD_IN_CALL_CHAIN = true;
doMethodTest(
"obj.call().call().call().call();",
"obj\n" +
" .call()\n" +
" .call()\n" +
" .call()\n" +
" .call();"
);
doMethodTest(
"call().call().call().call();",
"call()\n" +
" .call()\n" +
" .call()\n" +
" .call();"
);
doMethodTest(
"nestedCall(call().call().call().call());",
"nestedCall(call()\n" +
" .call()\n" +
" .call()\n" +
" .call());"
);
}
}
@@ -167,6 +167,7 @@ public interface CodeStyleSettingsCustomizable {
PARAMETER_ANNOTATION_WRAP,
VARIABLE_ANNOTATION_WRAP,
ALIGN_MULTILINE_CHAINED_METHODS,
WRAP_FIRST_METHOD_IN_CALL_CHAIN,
ALIGN_MULTILINE_PARAMETERS,
ALIGN_MULTILINE_PARAMETERS_IN_CALLS,
ALIGN_MULTILINE_RESOURCES,
@@ -812,6 +812,7 @@ public class CommonCodeStyleSettings {
public int THROWS_KEYWORD_WRAP = DO_NOT_WRAP;
public int METHOD_CALL_CHAIN_WRAP = DO_NOT_WRAP;
public boolean WRAP_FIRST_METHOD_IN_CALL_CHAIN = false;
public boolean PARENTHESES_EXPRESSION_LPAREN_WRAP = false;
public boolean PARENTHESES_EXPRESSION_RPAREN_WRAP = false;
@@ -101,6 +101,7 @@ public class WrappingAndBracesPanel extends OptionTableWithPreviewPanel {
addOption("ALIGN_MULTILINE_METHOD_BRACKETS", ApplicationBundle.message("wrapping.align.when.multiline"), WRAPPING_METHOD_PARENTHESES);
addOption("METHOD_CALL_CHAIN_WRAP", WRAPPING_CALL_CHAIN, WRAP_OPTIONS, WRAP_VALUES);
addOption("WRAP_FIRST_METHOD_IN_CALL_CHAIN", ApplicationBundle.message("wrapping.chained.method.call.first.on.new.line"), WRAPPING_CALL_CHAIN);
addOption("ALIGN_MULTILINE_CHAINED_METHODS", ApplicationBundle.message("wrapping.align.when.multiline"), WRAPPING_CALL_CHAIN);
addOption("IF_BRACE_FORCE", ApplicationBundle.message("wrapping.force.braces"), WRAPPING_IF_STATEMENT, BRACE_OPTIONS, BRACE_VALUES);
@@ -181,6 +181,7 @@ wrapping.force.braces=Force braces
wrapping.method.parameters=Method declaration parameters
wrapping.method.arguments=Method call arguments
wrapping.chained.method.calls=Chained method calls
wrapping.chained.method.call.first.on.new.line=Wrap first call
wrapping.for.statement='for()' statement
wrapping.if.statement='if()' statement
wrapping.while.statement='while()' statement