From a411f20f3779e1a79d6fb5f5bcf2780e383e6f85 Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Fri, 21 Jun 2019 20:13:31 +0700 Subject: [PATCH] intention to put args/parameters on single line: IDEA-209924 GitOrigin-RevId: d603666f0de7fb1f3be09a2f3616c6fa552102d2 --- java/java-impl/src/META-INF/JavaPlugin.xml | 10 ++ .../impl/lists/AbstractChopListAction.java | 14 +-- .../lists/AbstractJavaChopListAction.java | 33 ++---- .../lists/AbstractJavaJoinListAction.java | 20 ++++ .../impl/lists/AbstractJoinListAction.java | 108 ++++++++++++++++++ .../lists/AbstractListIntentionAction.java | 35 +----- .../impl/lists/JavaChopArgumentsAction.java | 8 +- .../impl/lists/JavaJoinArgumentsAction.java | 52 +++++++++ .../impl/lists/JavaJoinParametersAction.java | 52 +++++++++ .../intention/impl/lists/JavaListUtils.java | 45 ++++++++ .../JavaChopArgumentsAction/description.html | 3 +- .../JavaChopParametersAction/description.html | 3 +- .../after.java.template | 5 + .../before.java.template | 9 ++ .../JavaJoinArgumentsAction/description.html | 6 + .../after.java.template | 4 + .../before.java.template | 8 ++ .../JavaJoinParametersAction/description.html | 6 + .../afterAllOnSeparateLines.java | 7 ++ .../beforeAllOnSeparateLines.java | 11 ++ ...foreAllOnSingleLineExceptLparenRparen.java | 11 ++ .../afterAllOnSeparateLines.java | 7 ++ .../afterNotAllOnSingleLine.java | 7 ++ .../beforeAllOnSeparateLines.java | 11 ++ .../joinParameters/beforeAllOnSingleLine.java | 7 ++ .../beforeAllOnSingleLineExceptLparen.java | 9 ++ .../beforeAllOnSingleLineExceptRparen.java | 11 ++ .../beforeNotAllOnSingleLine.java | 8 ++ .../JavaJoinArgumentsActionTest.java | 36 ++++++ .../JavaJoinParametersActionTest.java | 36 ++++++ 30 files changed, 513 insertions(+), 69 deletions(-) create mode 100644 java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJavaJoinListAction.java create mode 100644 java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJoinListAction.java create mode 100644 java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinArgumentsAction.java create mode 100644 java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinParametersAction.java create mode 100644 java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaListUtils.java create mode 100644 java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/after.java.template create mode 100644 java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/before.java.template create mode 100644 java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/description.html create mode 100644 java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/after.java.template create mode 100644 java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/before.java.template create mode 100644 java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/description.html create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/afterAllOnSeparateLines.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSeparateLines.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSingleLineExceptLparenRparen.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterAllOnSeparateLines.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterNotAllOnSingleLine.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSeparateLines.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLine.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptLparen.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptRparen.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeNotAllOnSingleLine.java create mode 100644 java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinArgumentsActionTest.java create mode 100644 java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinParametersActionTest.java diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index 01515cb22066..4b0745ff20b0 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -1908,9 +1908,19 @@ com.intellij.codeInsight.intention.impl.lists.JavaChopParametersAction + Java/Other com.intellij.codeInsight.intention.impl.lists.JavaChopArgumentsAction + Java/Other + + + com.intellij.codeInsight.intention.impl.lists.JavaJoinParametersAction + Java/Other + + + com.intellij.codeInsight.intention.impl.lists.JavaJoinArgumentsAction + Java/Other diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractChopListAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractChopListAction.java index 6268047ea0d1..a3c96574fba4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractChopListAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractChopListAction.java @@ -30,24 +30,24 @@ public abstract class AbstractChopListAction= 0; i--) { E el = elements.get(i); - if (!hasBreakAfter(el)) { - int offset = findPlaceForBreakAfter(el); + if (nextBreak(el) == null) { + int offset = findOffsetForBreakAfter(el); if (i == size - 1 && !needTailBreak(el)) continue; document.insertString(offset, "\n"); } } E first = elements.get(0); if (needHeadBreak(first)){ - document.insertString(getOffsetOfBreakBeforeFirstElement(first), "\n"); + document.insertString(findOffsetOfBreakBeforeFirst(first), "\n"); } PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); documentManager.commitDocument(document); CodeStyleManager.getInstance(project).adjustLineIndent(context.list.getContainingFile(), context.list.getParent().getTextRange()); } - abstract int findPlaceForBreakAfter(E element); + abstract int findOffsetForBreakAfter(E element); - protected int getOffsetOfBreakBeforeFirstElement(@NotNull E element) { + protected int findOffsetOfBreakBeforeFirst(@NotNull E element) { return element.getTextRange().getStartOffset(); } @@ -78,9 +78,9 @@ public abstract class AbstractChopListAction extends AbstractChopListAction { - @Override - boolean hasBreakBefore(@NotNull E element) { - PsiElement current = element.getPrevSibling(); - while (current != null && isValidIntermediateElement(current)) { - if (current instanceof PsiWhiteSpace && current.textContains('\n')) return true; - current = current.getPrevSibling(); - } - return false; + @Nullable + PsiElement prevBreak(@NotNull PsiElement element) { + return JavaListUtils.prevBreak(element); } @Override - boolean hasBreakAfter(@NotNull E element) { - PsiElement current = element.getNextSibling(); - while (current != null && isValidIntermediateElement(current)) { - if (current instanceof PsiWhiteSpace && current.textContains('\n')) return true; - current = current.getNextSibling(); - } - return false; - } - - private static boolean isValidIntermediateElement(@NotNull PsiElement element) { - return element instanceof PsiWhiteSpace || element instanceof PsiComment || - (element instanceof PsiJavaToken && ((PsiJavaToken)element).getTokenType() == JavaTokenType.COMMA); + @Nullable + PsiElement nextBreak(@NotNull PsiElement element) { + return JavaListUtils.nextBreak(element); } @Override - int findPlaceForBreakAfter(E element) { + int findOffsetForBreakAfter(E element) { PsiJavaToken token = tryCast(PsiTreeUtil.skipWhitespacesAndCommentsForward(element), PsiJavaToken.class); if (token != null && token.getTokenType() == JavaTokenType.COMMA) return token.getTextRange().getEndOffset(); return element.getTextRange().getEndOffset(); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJavaJoinListAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJavaJoinListAction.java new file mode 100644 index 000000000000..9707a3cbe18c --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJavaJoinListAction.java @@ -0,0 +1,20 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.codeInsight.intention.impl.lists; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class AbstractJavaJoinListAction extends AbstractJoinListAction { + @Override + @Nullable + PsiElement prevBreak(@NotNull PsiElement element) { + return JavaListUtils.prevBreak(element); + } + + @Override + @Nullable + PsiElement nextBreak(@NotNull PsiElement element) { + return JavaListUtils.nextBreak(element); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJoinListAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJoinListAction.java new file mode 100644 index 000000000000..7339a0dbab91 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJoinListAction.java @@ -0,0 +1,108 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.codeInsight.intention.impl.lists; + +import com.google.common.collect.Lists; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractJoinListAction extends AbstractListIntentionAction { + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) { + return from(element) != null; + } + + @Override + public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException { + Context context = from(element); + if (context == null) return; + WhitespacesInfo info = context.myWhitespacesInfo; + List reversedBreaks = Lists.reverse(info.myBreaks); + Document document = editor.getDocument(); + deleteBreakIfPresent(document, info.myAfterLastBreak); + for (PsiElement aBreak : reversedBreaks) { + TextRange range = aBreak.getTextRange(); + document.replaceString(range.getStartOffset(), range.getEndOffset(), " "); + } + deleteBreakIfPresent(document, info.myBeforeFirstBreak); + + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + documentManager.commitDocument(document); + CodeStyleManager.getInstance(project).adjustLineIndent(context.myList.getContainingFile(), context.myList.getParent().getTextRange()); + } + + private void deleteBreakIfPresent(Document document, PsiElement aBreak) { + if (aBreak != null) { + TextRange range = aBreak.getTextRange(); + document.deleteString(range.getStartOffset(), range.getEndOffset()); + } + } + + private static class Context { + final @NotNull WhitespacesInfo myWhitespacesInfo; + final @NotNull L myList; + + + private Context(@NotNull WhitespacesInfo info, @NotNull L list) { + myWhitespacesInfo = info; + myList = list; + } + } + + private Context from(@NotNull PsiElement element) { + L list = extractList(element); + if (list == null) return null; + List elements = getElements(list); + if (elements == null) return null; + if (elements.size() < minElementCount()) return null; + WhitespacesInfo whitespacesInfo = collectBreakWhitespaces(elements); + if (whitespacesInfo == null) return null; + return new Context<>(whitespacesInfo, list); + } + + private static class WhitespacesInfo { + final @NotNull List myBreaks; + final @Nullable PsiElement myBeforeFirstBreak; + final @Nullable PsiElement myAfterLastBreak; + + private WhitespacesInfo(@NotNull List breaks, @Nullable PsiElement beforeFirstBreak, @Nullable PsiElement afterLastBreak) { + myBreaks = breaks; + myBeforeFirstBreak = beforeFirstBreak; + myAfterLastBreak = afterLastBreak; + } + } + + private WhitespacesInfo collectBreakWhitespaces(List elements) { + List breaks = new ArrayList<>(); + PsiElement beforeFirst = null; + PsiElement afterLastToDelete = null; + int size = elements.size(); + for (int i = 0; i < size; i++) { + E current = elements.get(i); + if (i == 0 && !needHeadBreak(current)) { + beforeFirst = prevBreak(current); + } + PsiElement nextBreak = nextBreak(current); + if (nextBreak == null) continue; + if (i == size - 1) { + if (!needTailBreak(current)) { + afterLastToDelete = nextBreak; + } + } else { + breaks.add(nextBreak); + } + } + if (breaks.isEmpty() && beforeFirst == null && afterLastToDelete == null) return null; + return new WhitespacesInfo(breaks, beforeFirst, afterLastToDelete); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractListIntentionAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractListIntentionAction.java index f774348a3e1e..c89b40c8cada 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractListIntentionAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractListIntentionAction.java @@ -15,9 +15,11 @@ public abstract class AbstractListIntentionAction getElements(@NotNull L list); - abstract boolean hasBreakBefore(@NotNull E element); + @Nullable + abstract PsiElement prevBreak(@NotNull PsiElement element); - abstract boolean hasBreakAfter(@NotNull E element); + @Nullable + abstract PsiElement nextBreak(@NotNull PsiElement element); /** * Min count of elements for intention to work @@ -39,33 +41,4 @@ public abstract class AbstractListIntentionAction { @Nullable("When failed") @Override PsiExpressionList extractList(@NotNull PsiElement element) { - PsiExpressionList expressionList = PsiTreeUtil.getParentOfType(element, PsiExpressionList.class, false, PsiCodeBlock.class); - if (expressionList == null) return null; - PsiElement parent = expressionList.getParent(); - if (!(parent instanceof PsiCall)) return null; - return expressionList; + return getCallArgumentsList(element); } @Nullable("When failed") diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinArgumentsAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinArgumentsAction.java new file mode 100644 index 000000000000..5330a52d7663 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinArgumentsAction.java @@ -0,0 +1,52 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.codeInsight.intention.impl.lists; + +import com.intellij.application.options.CodeStyle; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; + +import static com.intellij.codeInsight.intention.impl.lists.JavaListUtils.getCallArgumentsList; + +public class JavaJoinArgumentsAction extends AbstractJavaJoinListAction { + @Nullable("When failed") + @Override + PsiExpressionList extractList(@NotNull PsiElement element) { + return getCallArgumentsList(element); + } + + @Nullable("When failed") + @Override + List getElements(@NotNull PsiExpressionList list) { + return Arrays.asList(list.getExpressions()); + } + + @Override + boolean needTailBreak(@NotNull PsiExpression last) { + return CodeStyle.getLanguageSettings(last.getContainingFile(), JavaLanguage.INSTANCE).CALL_PARAMETERS_RPAREN_ON_NEXT_LINE; + } + + @Override + boolean needHeadBreak(@NotNull PsiExpression first) { + return CodeStyle.getLanguageSettings(first.getContainingFile(), JavaLanguage.INSTANCE).CALL_PARAMETERS_LPAREN_ON_NEXT_LINE; + } + + @Nls(capitalization = Nls.Capitalization.Sentence) + @NotNull + @Override + public String getFamilyName() { + return "Put arguments on one line"; + } + + @NotNull + @Override + public String getText() { + return getFamilyName(); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinParametersAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinParametersAction.java new file mode 100644 index 000000000000..15d8ce478a7f --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaJoinParametersAction.java @@ -0,0 +1,52 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.codeInsight.intention.impl.lists; + +import com.intellij.application.options.CodeStyle; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiParameter; +import com.intellij.psi.PsiParameterList; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; + +public class JavaJoinParametersAction extends AbstractJavaJoinListAction { + @Nullable("When failed") + @Override + PsiParameterList extractList(@NotNull PsiElement element) { + return PsiTreeUtil.getParentOfType(element, PsiParameterList.class, false); + } + + @Nullable("When failed") + @Override + List getElements(@NotNull PsiParameterList list) { + return Arrays.asList(list.getParameters()); + } + + @Override + boolean needTailBreak(@NotNull PsiParameter last) { + return CodeStyle.getLanguageSettings(last.getContainingFile(), JavaLanguage.INSTANCE).METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE; + } + + @Override + boolean needHeadBreak(@NotNull PsiParameter first) { + return CodeStyle.getLanguageSettings(first.getContainingFile(), JavaLanguage.INSTANCE).METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE; + } + + @Nls(capitalization = Nls.Capitalization.Sentence) + @NotNull + @Override + public String getFamilyName() { + return "Put parameters on one line"; + } + + @NotNull + @Override + public String getText() { + return getFamilyName(); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaListUtils.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaListUtils.java new file mode 100644 index 000000000000..525efb67f818 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaListUtils.java @@ -0,0 +1,45 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.codeInsight.intention.impl.lists; + +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +class JavaListUtils { + private JavaListUtils() { } + + @Nullable + static PsiElement prevBreak(@NotNull PsiElement element) { + PsiElement current = element.getPrevSibling(); + while (current != null && isValidIntermediateElement(current)) { + if (current instanceof PsiWhiteSpace && current.textContains('\n')) return current; + current = current.getPrevSibling(); + } + return null; + } + + @Nullable + static PsiElement nextBreak(@NotNull PsiElement element) { + PsiElement current = element.getNextSibling(); + while (current != null && isValidIntermediateElement(current)) { + if (current instanceof PsiWhiteSpace && current.textContains('\n')) return current; + current = current.getNextSibling(); + } + return null; + } + + private static boolean isValidIntermediateElement(@NotNull PsiElement element) { + return element instanceof PsiWhiteSpace || + (element instanceof PsiJavaToken && ((PsiJavaToken)element).getTokenType() == JavaTokenType.COMMA); + } + + @Nullable + static PsiExpressionList getCallArgumentsList(@NotNull PsiElement element) { + PsiExpressionList expressionList = PsiTreeUtil.getParentOfType(element, PsiExpressionList.class, false, PsiCodeBlock.class); + if (expressionList == null) return null; + PsiElement parent = expressionList.getParent(); + if (!(parent instanceof PsiCall)) return null; + return expressionList; + } +} diff --git a/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/description.html b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/description.html index 52ad404118a5..31ab13e45076 100644 --- a/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/description.html +++ b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/description.html @@ -1,6 +1,5 @@ -

Put arguments on separate lines. Tail and head breaks are set according to formatting settings. -

+Put arguments on separate lines. Tail and head breaks are set according to formatting settings. \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/description.html b/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/description.html index 065b4a11cfd0..14570032ba82 100644 --- a/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/description.html +++ b/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/description.html @@ -1,7 +1,6 @@ -

Put parameters on separate lines. Tail and head breaks are set according to formatting settings. -

+Put parameters on separate lines. Tail and head breaks are set according to formatting settings. \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/after.java.template b/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/after.java.template new file mode 100644 index 000000000000..4776cecbf4a2 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/after.java.template @@ -0,0 +1,5 @@ +class A { + void foo(int a1, int a2, int a3) { + foo(12, 23, 4); + } +} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/before.java.template b/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/before.java.template new file mode 100644 index 000000000000..46602d6d10db --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/before.java.template @@ -0,0 +1,9 @@ +class A { + void foo(int a1, int a2, int a3) { + foo( + 12, + 23, + 4 + ); + } +} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/description.html b/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/description.html new file mode 100644 index 000000000000..1f06366e7254 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaJoinArgumentsAction/description.html @@ -0,0 +1,6 @@ + + +Put arguments of the call on single line. Tail and head breaks are set according to formatting settings. + + + \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/after.java.template b/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/after.java.template new file mode 100644 index 000000000000..8512f3f6e29d --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/after.java.template @@ -0,0 +1,4 @@ +class A { + void foo(A a1, A a2, A a3) { + } +} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/before.java.template b/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/before.java.template new file mode 100644 index 000000000000..24f3b3e6c7de --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/before.java.template @@ -0,0 +1,8 @@ +class A { + void foo( + A a1, + A a2, + A a3 + ) { + } +} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/description.html b/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/description.html new file mode 100644 index 000000000000..923157072166 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaJoinParametersAction/description.html @@ -0,0 +1,6 @@ + + +Put parameters of the call on single line. Tail and head breaks are set according to formatting settings. + + + \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/afterAllOnSeparateLines.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/afterAllOnSeparateLines.java new file mode 100644 index 000000000000..c5fede9a96df --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/afterAllOnSeparateLines.java @@ -0,0 +1,7 @@ +// "Put arguments on one line" "true" + +class A { + void foo(int a1, int a2, int a3) { + foo(12, 23, 4); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSeparateLines.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSeparateLines.java new file mode 100644 index 000000000000..e88fb3c99913 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSeparateLines.java @@ -0,0 +1,11 @@ +// "Put arguments on one line" "true" + +class A { + void foo(int a1, int a2, int a3) { + foo( + 12, + 23, + 4 + ); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSingleLineExceptLparenRparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSingleLineExceptLparenRparen.java new file mode 100644 index 000000000000..efa9c072b520 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments/beforeAllOnSingleLineExceptLparenRparen.java @@ -0,0 +1,11 @@ +// "Put arguments on one line" "false" +// break after lparen +// break before rparen + +class A { + void foo(int a1, int a2, int a3) { + foo( + 12, 23, 4 + ); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterAllOnSeparateLines.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterAllOnSeparateLines.java new file mode 100644 index 000000000000..7b38809e00fc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterAllOnSeparateLines.java @@ -0,0 +1,7 @@ +// "Put parameters on one line" "true" + +class A { + void foo(A a1, A a2, A a3) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterNotAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterNotAllOnSingleLine.java new file mode 100644 index 000000000000..7b38809e00fc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/afterNotAllOnSingleLine.java @@ -0,0 +1,7 @@ +// "Put parameters on one line" "true" + +class A { + void foo(A a1, A a2, A a3) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSeparateLines.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSeparateLines.java new file mode 100644 index 000000000000..330bba45bc80 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSeparateLines.java @@ -0,0 +1,11 @@ +// "Put parameters on one line" "true" + +class A { + void foo( + A a1, + A a2, + A a3 + ) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLine.java new file mode 100644 index 000000000000..17ba2052c5b2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLine.java @@ -0,0 +1,7 @@ +// "Put parameters on one line" "false" + +class A { + void foo(A a1, A a2, A a3) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptLparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptLparen.java new file mode 100644 index 000000000000..6fb29c5fc9df --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptLparen.java @@ -0,0 +1,9 @@ +// "Put parameters on one line" "false" +// break after lparen + +class A { + void foo( + A a1, A a2, A a3) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptRparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptRparen.java new file mode 100644 index 000000000000..1f37b4cec666 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeAllOnSingleLineExceptRparen.java @@ -0,0 +1,11 @@ +// "Put parameters on one line" "false" +// break after lparen +// break before rparen + +class A { + void foo( + A a1, A a2, A a3 + ) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeNotAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeNotAllOnSingleLine.java new file mode 100644 index 000000000000..1bdfaf6e3f97 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters/beforeNotAllOnSingleLine.java @@ -0,0 +1,8 @@ +// "Put parameters on one line" "true" + +class A { + void foo(A a1, + A a2, A a3) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinArgumentsActionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinArgumentsActionTest.java new file mode 100644 index 000000000000..c01dd6d0df10 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinArgumentsActionTest.java @@ -0,0 +1,36 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.java.codeInsight.intention; + +import com.intellij.application.options.CodeStyle; +import com.intellij.codeInsight.daemon.LightIntentionActionTestCase; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.psi.codeStyle.CommonCodeStyleSettings; + +public class JavaJoinArgumentsActionTest extends LightIntentionActionTestCase { + + private boolean myBreakAfterLparen; + private boolean myBreakBeforeRparen; + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinArguments"; + } + + @Override + protected void beforeActionStarted(final String testName, final String contents) { + super.beforeActionStarted(testName, contents); + final CommonCodeStyleSettings settings = CodeStyle.getSettings(getProject()).getCommonSettings(JavaLanguage.INSTANCE); + myBreakAfterLparen = settings.CALL_PARAMETERS_LPAREN_ON_NEXT_LINE; + myBreakBeforeRparen = settings.CALL_PARAMETERS_RPAREN_ON_NEXT_LINE; + settings.CALL_PARAMETERS_LPAREN_ON_NEXT_LINE = contents.contains("break after lparen"); + settings.CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = contents.contains("break before rparen"); + } + + @Override + protected void afterActionCompleted(final String testName, final String contents) { + super.afterActionCompleted(testName, contents); + CommonCodeStyleSettings settings = CodeStyle.getSettings(getProject()).getCommonSettings(JavaLanguage.INSTANCE); + settings.CALL_PARAMETERS_LPAREN_ON_NEXT_LINE = myBreakAfterLparen; + settings.CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = myBreakBeforeRparen; + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinParametersActionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinParametersActionTest.java new file mode 100644 index 000000000000..8ec8679da12b --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaJoinParametersActionTest.java @@ -0,0 +1,36 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.java.codeInsight.intention; + +import com.intellij.application.options.CodeStyle; +import com.intellij.codeInsight.daemon.LightIntentionActionTestCase; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.psi.codeStyle.CommonCodeStyleSettings; + +public class JavaJoinParametersActionTest extends LightIntentionActionTestCase { + + private boolean myBreakAfterLparen; + private boolean myBreakBeforeRparen; + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/lists/joinParameters"; + } + + @Override + protected void beforeActionStarted(final String testName, final String contents) { + super.beforeActionStarted(testName, contents); + final CommonCodeStyleSettings settings = CodeStyle.getSettings(getProject()).getCommonSettings(JavaLanguage.INSTANCE); + myBreakAfterLparen = settings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE; + myBreakBeforeRparen = settings.METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE; + settings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE = contents.contains("break after lparen"); + settings.METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE = contents.contains("break before rparen"); + } + + @Override + protected void afterActionCompleted(final String testName, final String contents) { + super.afterActionCompleted(testName, contents); + CommonCodeStyleSettings settings = CodeStyle.getSettings(getProject()).getCommonSettings(JavaLanguage.INSTANCE); + settings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE = myBreakAfterLparen; + settings.METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE = myBreakBeforeRparen; + } +}