From 2f4919bab40f9ec8e99665e7621f733ab1eaf689 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 13 May 2016 12:41:49 +0200 Subject: [PATCH] customize enter handler after unmatcjed brace to insert rBrace after first expression of expression list if applicable (IDEA-152395) --- .../JavaEnterAfterUnmatchedBraceHandler.java | 38 +++++++++++++++++++ .../formatter/java/JavaEnterActionTest.java | 17 ++++++++- .../EnterAfterUnmatchedBraceHandler.java | 6 ++- .../src/META-INF/LangExtensions.xml | 2 +- resources/src/META-INF/IdeaPlugin.xml | 1 + 5 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 java/java-impl/src/com/intellij/codeInsight/editorActions/JavaEnterAfterUnmatchedBraceHandler.java diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaEnterAfterUnmatchedBraceHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaEnterAfterUnmatchedBraceHandler.java new file mode 100644 index 000000000000..346f5edecad9 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaEnterAfterUnmatchedBraceHandler.java @@ -0,0 +1,38 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.editorActions; + +import com.intellij.codeInsight.editorActions.enter.EnterAfterUnmatchedBraceHandler; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiExpressionList; +import com.intellij.psi.PsiExpressionListStatement; + +public class JavaEnterAfterUnmatchedBraceHandler extends EnterAfterUnmatchedBraceHandler { + @Override + protected int calculateOffsetToInsertClosingBraceInsideElement(PsiElement element) { + if (element instanceof PsiExpressionListStatement) { + final PsiExpressionList list = ((PsiExpressionListStatement)element).getExpressionList(); + if (list != null) { + final PsiExpression[] expressions = list.getExpressions(); + if (expressions.length > 1) { + return expressions[0].getTextRange().getEndOffset(); + } + } + } + return super.calculateOffsetToInsertClosingBraceInsideElement(element); + } +} diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaEnterActionTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaEnterActionTest.java index ec8f9de21ace..af65e34e8fa3 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaEnterActionTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaEnterActionTest.java @@ -103,7 +103,22 @@ public class JavaEnterActionTest extends AbstractEnterActionTestCase { " \n" + "}"); } - + + public void testToCodeBlockLambda() throws Exception { + doTextTest("java", "class Issue {\n" + + "public static void main(String[] args) {\n" + + "Arrays.asList().stream().collect(() -> { new ArrayList<>(), ArrayList::add, ArrayList::addAll);\n" + + "}\n" + + "}", + "class Issue {\n" + + "public static void main(String[] args) {\n" + + "Arrays.asList().stream().collect(() -> {\n" + + " new ArrayList<>()\n" + + "}, ArrayList::add, ArrayList::addAll);\n" + + "}\n" + + "}"); + } + public void testEnter_BetweenChainedMethodCalls() throws IOException { doTextTest("java", "class T {\n" + diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/EnterAfterUnmatchedBraceHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/EnterAfterUnmatchedBraceHandler.java index 35293104ffdb..1ba702a945e3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/EnterAfterUnmatchedBraceHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/enter/EnterAfterUnmatchedBraceHandler.java @@ -305,7 +305,11 @@ public class EnterAfterUnmatchedBraceHandler extends EnterHandlerDelegateAdapter if (element.getTextOffset() != offset) { return Pair.create(null, CharArrayUtil.shiftForwardUntil(text, offset, "\n")); } - return Pair.create(element, element.getTextRange().getEndOffset()); + return Pair.create(element, calculateOffsetToInsertClosingBraceInsideElement(element)); + } + + protected int calculateOffsetToInsertClosingBraceInsideElement(PsiElement element) { + return element.getTextRange().getEndOffset(); } public static boolean isAfterUnmatchedLBrace(Editor editor, int offset, FileType fileType) { diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index d447bc0a7764..ecca468dad78 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -626,7 +626,7 @@ - + diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index dabe507e466b..a23cf7f74de8 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1133,6 +1133,7 @@ +