diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index a491cc9dec06..01515cb22066 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -1906,6 +1906,12 @@ com.intellij.codeInsight.intention.impl.WrapWithUnmodifiableAction Java/Other + + com.intellij.codeInsight.intention.impl.lists.JavaChopParametersAction + + + com.intellij.codeInsight.intention.impl.lists.JavaChopArgumentsAction + 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 new file mode 100644 index 000000000000..6268047ea0d1 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractChopListAction.java @@ -0,0 +1,90 @@ +// 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.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +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.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public abstract class AbstractChopListAction extends AbstractListIntentionAction { + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) { + Context context = from(element); + return context != null; + } + + @Override + public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException { + Context context = from(element); + if (context == null) return; + Document document = editor.getDocument(); + List elements = context.elements; + int size = elements.size(); + for (int i = elements.size() - 1; i >= 0; i--) { + E el = elements.get(i); + if (!hasBreakAfter(el)) { + int offset = findPlaceForBreakAfter(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"); + } + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + documentManager.commitDocument(document); + CodeStyleManager.getInstance(project).adjustLineIndent(context.list.getContainingFile(), context.list.getParent().getTextRange()); + } + + abstract int findPlaceForBreakAfter(E element); + + protected int getOffsetOfBreakBeforeFirstElement(@NotNull E element) { + return element.getTextRange().getStartOffset(); + } + + private static class Context { + final @NotNull L list; + final @NotNull List elements; + + private Context(@NotNull L list, @NotNull List elements) { + this.list = list; + this.elements = elements; + } + } + + @Nullable + 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; + if (!hasElementsNotOnSeparateLines(elements)) return null; + return new Context<>(list, elements); + } + + @Contract(pure = true) + private boolean hasElementsNotOnSeparateLines(@NotNull List elements) { + int size = elements.size(); + for (int i = 0; i < size; i++) { + E current = elements.get(i); + if (i == 0) { + if (needHeadBreak(current) && !hasBreakBefore(current)) return true; + } + if (!hasBreakAfter(current)) { + if (i == size - 1 && !needTailBreak(current)) continue; + return true; + } + } + return false; + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJavaChopListAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJavaChopListAction.java new file mode 100644 index 000000000000..1ea0b32307cc --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractJavaChopListAction.java @@ -0,0 +1,43 @@ +// 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 static com.intellij.util.ObjectUtils.tryCast; + +public abstract class AbstractJavaChopListAction 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; + } + + @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); + } + + @Override + int findPlaceForBreakAfter(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/AbstractListIntentionAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractListIntentionAction.java new file mode 100644 index 000000000000..f774348a3e1e --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/AbstractListIntentionAction.java @@ -0,0 +1,71 @@ +// 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.codeInsight.intention.PsiElementBaseIntentionAction; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public abstract class AbstractListIntentionAction extends PsiElementBaseIntentionAction { + @Nullable("When failed") + abstract L extractList(@NotNull PsiElement element); + + @Nullable("When failed") + abstract List getElements(@NotNull L list); + + abstract boolean hasBreakBefore(@NotNull E element); + + abstract boolean hasBreakAfter(@NotNull E element); + + /** + * Min count of elements for intention to work + * Expected to be > 0 + */ + protected int minElementCount() { + return 2; + } + + + /** + * supposed to delegate to language formatter settings + * @return true if it requires line break after last element + */ + abstract boolean needTailBreak(@NotNull E last); + + /** + * supposed to delegate to language formatter settings + * @return true if it requires line break before first element + */ + abstract boolean needHeadBreak(@NotNull E first); + + //boolean hasNewlineBetween(@NotNull E left, @NotNull E right) { + // PsiElement current = left.getNextSibling(); + // while (current != null && current != right) { + // if (isWhitespaceWithBreak(current)) { + // return true; + // } + // current = current.getNextSibling(); + // } + // return false; + //} + // + //private boolean isWhitespaceWithBreak(PsiElement element) { + // return isWhitespace(element) && element.textContains('\n'); + //} + // + //boolean hasLeadingNewline(@NotNull E element) { + // PsiElement current = element.getPrevSibling(); + // while (current != null) { + // current = current.getPrevSibling(); + // if (isWhitespaceWithBreak(current)) { + // + // } + // } + //} + + //boolean hasTrailingNewline(@NotNull E element) { + // + //} +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaChopArgumentsAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaChopArgumentsAction.java new file mode 100644 index 000000000000..cb67f47a2f5a --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaChopArgumentsAction.java @@ -0,0 +1,51 @@ +// 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; + +public class JavaChopArgumentsAction extends AbstractJavaChopListAction { + @Nullable("When failed") + @Override + PsiExpressionList extractList(@NotNull PsiElement element) { + return PsiTreeUtil.getParentOfType(element, PsiExpressionList.class, false); + } + + @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_RPAREN_ON_NEXT_LINE; + } + + @Nls(capitalization = Nls.Capitalization.Sentence) + @NotNull + @Override + public String getFamilyName() { + return "Put arguments on separate lines"; + } + + @NotNull + @Override + public String getText() { + return getFamilyName(); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaChopParametersAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaChopParametersAction.java new file mode 100644 index 000000000000..ba3d54ae456b --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/lists/JavaChopParametersAction.java @@ -0,0 +1,51 @@ +// 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; + +public class JavaChopParametersAction extends AbstractJavaChopListAction { + @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 separate lines"; + } + + @NotNull + @Override + public String getText() { + return getFamilyName(); + } +} diff --git a/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/after.java.template b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/after.java.template new file mode 100644 index 000000000000..3870ffed7038 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/after.java.template @@ -0,0 +1,9 @@ +class A { + void foo(int a1, int a2, int a3) { + foo( + 1, + 2, + 3 + ) + } +} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/before.java.template b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/before.java.template new file mode 100644 index 000000000000..4d570faf2370 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/before.java.template @@ -0,0 +1,5 @@ +class A { + void foo(int a1, int a2, int a3) { + foo(1, 2, 3) + } +} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/description.html b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/description.html new file mode 100644 index 000000000000..52ad404118a5 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaChopArgumentsAction/description.html @@ -0,0 +1,6 @@ + + +

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/after.java.template b/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/after.java.template new file mode 100644 index 000000000000..9989e167eb58 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/after.java.template @@ -0,0 +1,9 @@ +class A { + void foo( + A a1, + A a2, + A a3 + ) { + + } +} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/before.java.template b/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/before.java.template new file mode 100644 index 000000000000..5b37c4ca84d7 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/before.java.template @@ -0,0 +1,6 @@ +class A { + void foo(A a1, + A a2, A a3) { + + } +} \ 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 new file mode 100644 index 000000000000..065b4a11cfd0 --- /dev/null +++ b/java/java-impl/src/intentionDescriptions/JavaChopParametersAction/description.html @@ -0,0 +1,7 @@ + + +

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-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLine.java new file mode 100644 index 000000000000..05653158b949 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLine.java @@ -0,0 +1,9 @@ +// "Put arguments on separate lines" "true" + +class A { + void foo(int a1, int a2, int a3) { + foo(1, + 2, + 3) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLineLparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLineLparen.java new file mode 100644 index 000000000000..224fe4cb9fe3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLineLparen.java @@ -0,0 +1,10 @@ +// "Put arguments on separate lines" "true" +// break after lparen + +class A { + void foo(int a1, int a2, int a3) { + foo(1, + 2, + 3) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLineLparenRparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLineLparenRparen.java new file mode 100644 index 000000000000..e63918810eb4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/afterAllOnSingleLineLparenRparen.java @@ -0,0 +1,13 @@ +// "Put arguments on separate lines" "true" +// break after lparen +// break before rparen + +class A { + void foo(int a1, int a2, int a3) { + foo( + 1, + 2, + 3 + ) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLine.java new file mode 100644 index 000000000000..76f2a8690ea4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLine.java @@ -0,0 +1,7 @@ +// "Put arguments on separate lines" "true" + +class A { + void foo(int a1, int a2, int a3) { + foo(1, 2, 3) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLineLparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLineLparen.java new file mode 100644 index 000000000000..b5d4c662005a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLineLparen.java @@ -0,0 +1,8 @@ +// "Put arguments on separate lines" "true" +// break after lparen + +class A { + void foo(int a1, int a2, int a3) { + foo(1, 2, 3) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLineLparenRparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLineLparenRparen.java new file mode 100644 index 000000000000..5fa45f25af5a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments/beforeAllOnSingleLineLparenRparen.java @@ -0,0 +1,9 @@ +// "Put arguments on separate lines" "true" +// break after lparen +// break before rparen + +class A { + void foo(int a1, int a2, int a3) { + foo(1, 2, 3) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSeparateLinesExceptLparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSeparateLinesExceptLparen.java new file mode 100644 index 000000000000..26df08fdde7a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSeparateLinesExceptLparen.java @@ -0,0 +1,11 @@ +// "Put parameters on separate lines" "true" +// 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/chopParameters/afterAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSingleLine.java new file mode 100644 index 000000000000..c65442266efc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSingleLine.java @@ -0,0 +1,9 @@ +// "Put parameters on separate lines" "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/chopParameters/afterAllOnSingleLineLparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSingleLineLparen.java new file mode 100644 index 000000000000..26df08fdde7a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSingleLineLparen.java @@ -0,0 +1,11 @@ +// "Put parameters on separate lines" "true" +// 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/chopParameters/afterAllOnSingleLineLparenRparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSingleLineLparenRparen.java new file mode 100644 index 000000000000..579b2c90a6a8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterAllOnSingleLineLparenRparen.java @@ -0,0 +1,13 @@ +// "Put parameters on separate lines" "true" +// 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/chopParameters/afterNotAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterNotAllOnSingleLine.java new file mode 100644 index 000000000000..c65442266efc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/afterNotAllOnSingleLine.java @@ -0,0 +1,9 @@ +// "Put parameters on separate lines" "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/chopParameters/beforeAllOnSeparateLines.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLines.java new file mode 100644 index 000000000000..6872fd59d882 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLines.java @@ -0,0 +1,11 @@ +// "Put parameters on separate lines" "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/chopParameters/beforeAllOnSeparateLinesExceptLparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLinesExceptLparen.java new file mode 100644 index 000000000000..13cabf91b131 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLinesExceptLparen.java @@ -0,0 +1,10 @@ +// "Put parameters on separate lines" "true" +// 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/chopParameters/beforeAllOnSeparateLinesLparenBreak.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLinesLparenBreak.java new file mode 100644 index 000000000000..fe0126828b7c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLinesLparenBreak.java @@ -0,0 +1,11 @@ +// "Put parameters on separate lines" "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/chopParameters/beforeAllOnSeparateLinesRparenBreak.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLinesRparenBreak.java new file mode 100644 index 000000000000..3e371553187b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSeparateLinesRparenBreak.java @@ -0,0 +1,11 @@ +// "Put parameters on separate lines" "false" +// 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/chopParameters/beforeAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSingleLine.java new file mode 100644 index 000000000000..426d24d2ccf8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSingleLine.java @@ -0,0 +1,7 @@ +// "Put parameters on separate lines" "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/chopParameters/beforeAllOnSingleLineLparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSingleLineLparen.java new file mode 100644 index 000000000000..560237f4466b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSingleLineLparen.java @@ -0,0 +1,8 @@ +// "Put parameters on separate lines" "true" +// 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/chopParameters/beforeAllOnSingleLineLparenRparen.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSingleLineLparenRparen.java new file mode 100644 index 000000000000..ef9e22c1c02f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeAllOnSingleLineLparenRparen.java @@ -0,0 +1,9 @@ +// "Put parameters on separate lines" "true" +// 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/chopParameters/beforeNotAllOnSingleLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeNotAllOnSingleLine.java new file mode 100644 index 000000000000..6fa854fd51e7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters/beforeNotAllOnSingleLine.java @@ -0,0 +1,8 @@ +// "Put parameters on separate lines" "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/JavaChopArgumentsActionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaChopArgumentsActionTest.java new file mode 100644 index 000000000000..67d75428f311 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaChopArgumentsActionTest.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 JavaChopArgumentsActionTest extends LightIntentionActionTestCase { + + private boolean myBreakAfterLparen; + private boolean myBreakBeforeRparen; + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopArguments"; + } + + @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/JavaChopParametersActionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaChopParametersActionTest.java new file mode 100644 index 000000000000..0f813fb324c2 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/JavaChopParametersActionTest.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 JavaChopParametersActionTest extends LightIntentionActionTestCase { + + private boolean myBreakAfterLparen; + private boolean myBreakBeforeRparen; + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/lists/chopParameters"; + } + + @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; + } +}