diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/ChainMethodCallsBlockBuilder.java b/java/java-impl/src/com/intellij/psi/formatter/java/ChainMethodCallsBlockBuilder.java index e80774e7d312..a1d9e1ff7fed 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/ChainMethodCallsBlockBuilder.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/ChainMethodCallsBlockBuilder.java @@ -41,9 +41,6 @@ class ChainMethodCallsBlockBuilder { private final Alignment myBlockAlignment; private final Indent myBlockIndent; - private Wrap myWrap; - private Alignment myChainedCallsAlignment; - public ChainMethodCallsBlockBuilder(Alignment alignment, Wrap wrap, Indent indent, @@ -68,26 +65,28 @@ class ChainMethodCallsBlockBuilder { private List buildBlocksFrom(List nodes) { List methodCall = splitMethodCallOnChunksByDots(nodes); - myWrap = null; - myChainedCallsAlignment = null; + Wrap wrap = null; + Alignment chainedCallsAlignment = null; - List blocks = new ArrayList(); + List blocks = new ArrayList<>(); for (int i = 0; i < methodCall.size(); i++) { ChainedCallChunk currentCallChunk = methodCall.get(i); if (isMethodCall(currentCallChunk) || isComment(currentCallChunk)) { - if (myWrap == null) - myWrap = createCallChunkWrap(i, methodCall); - if (myChainedCallsAlignment == null) - myChainedCallsAlignment = createCallChunkAlignment(i, methodCall); + if (wrap == null) { + wrap = createCallChunkWrap(i, methodCall); + } + if (chainedCallsAlignment == null) { + chainedCallsAlignment = createCallChunkAlignment(i, methodCall); + } } else { - myWrap = null; - myChainedCallsAlignment = null; + wrap = null; + chainedCallsAlignment = null; } CallChunkBlockBuilder builder = new CallChunkBlockBuilder(mySettings, myJavaSettings); - blocks.add(builder.create(currentCallChunk.nodes, myWrap, myChainedCallsAlignment)); + blocks.add(builder.create(currentCallChunk.nodes, wrap, chainedCallsAlignment)); } return blocks; @@ -118,24 +117,29 @@ class ChainMethodCallsBlockBuilder { && !chunkIsFirstInChainMethodCall(currentMethodChunk, methodCall); } - private boolean chunkIsFirstInChainMethodCall(@NotNull ChainedCallChunk callChunk, @NotNull List methodCall) { + private static boolean chunkIsFirstInChainMethodCall(@NotNull ChainedCallChunk callChunk, @NotNull List methodCall) { return !methodCall.isEmpty() && callChunk == methodCall.get(0); } @NotNull - private List splitMethodCallOnChunksByDots(@NotNull List nodes) { - List result = new ArrayList(); + private static List splitMethodCallOnChunksByDots(@NotNull List nodes) { + List result = new ArrayList<>(); - List current = new ArrayList(); + List current = new ArrayList<>(); for (ASTNode node : nodes) { if (node.getElementType() == JavaTokenType.DOT || node.getPsi() instanceof PsiComment) { - result.add(new ChainedCallChunk(current)); - current = new ArrayList(); + if (!current.isEmpty()) { + result.add(new ChainedCallChunk(current)); + } + current = new ArrayList<>(); } current.add(node); } - - result.add(new ChainedCallChunk(current)); + + if (!current.isEmpty()) { + result.add(new ChainedCallChunk(current)); + } + return result; } @@ -146,7 +150,7 @@ class ChainMethodCallsBlockBuilder { : null; } - private boolean isMethodCall(@NotNull ChainedCallChunk callChunk) { + private static boolean isMethodCall(@NotNull ChainedCallChunk callChunk) { List nodes = callChunk.nodes; return nodes.size() >= 3 && nodes.get(2).getElementType() == JavaElementType.EXPRESSION_LIST; } diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/IOOBE_MovingInvalidCode.java b/java/java-tests/testData/refactoring/moveInstanceMethod/IOOBE_MovingInvalidCode.java new file mode 100644 index 000000000000..3cc511d6f1d9 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/IOOBE_MovingInvalidCode.java @@ -0,0 +1,14 @@ +class A { +} + +class B { +} + +public class Main { + void user() { + method(, new B()); + } + + void method(A a, B b) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/IOOBE_MovingInvalidCode.java.after b/java/java-tests/testData/refactoring/moveInstanceMethod/IOOBE_MovingInvalidCode.java.after new file mode 100644 index 000000000000..8c40d6da9914 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/IOOBE_MovingInvalidCode.java.after @@ -0,0 +1,14 @@ +class A { + void method(B b) { + } +} + +class B { +} + +public class Main { + void user() { + .method(new B()); + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java index c84324b6dd29..406d174934b4 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/moveMethod/MoveInstanceMethodTest.java @@ -59,6 +59,8 @@ public class MoveInstanceMethodTest extends LightRefactoringTestCase { public void testOverloadingMethods1() throws Exception { doTest(true, 0); } public void testPolyadicExpr() throws Exception { doTest(true, 0); } + + public void testIOOBE_MovingInvalidCode() throws Exception { doTest(true, 0); } public void testEscalateVisibility() throws Exception { doTest(true, 0, VisibilityUtil.ESCALATE_VISIBILITY);