"Put arguments/parameters on separate lines": respect code style settings
#KT-20420 Fixed
This commit is contained in:
committed by
Yan Zhulanow
parent
74ee68e57b
commit
a492fe7757
@@ -5,11 +5,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.intentions
|
package org.jetbrains.kotlin.idea.intentions
|
||||||
|
|
||||||
|
import com.intellij.application.options.CodeStyle
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.psi.PsiDocumentManager
|
import com.intellij.psi.PsiDocumentManager
|
||||||
import com.intellij.psi.PsiWhiteSpace
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import com.intellij.psi.codeStyle.CodeStyleManager
|
import com.intellij.psi.codeStyle.CodeStyleManager
|
||||||
|
import com.intellij.psi.codeStyle.CommonCodeStyleSettings
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
|
import org.jetbrains.kotlin.idea.formatter.kotlinCommonSettings
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.allChildren
|
import org.jetbrains.kotlin.psi.psiUtil.allChildren
|
||||||
@@ -22,6 +25,11 @@ abstract class AbstractChopListIntention<TList : KtElement, TElement : KtElement
|
|||||||
private val elementClass: Class<TElement>,
|
private val elementClass: Class<TElement>,
|
||||||
textGetter: () -> String
|
textGetter: () -> String
|
||||||
) : SelfTargetingOffsetIndependentIntention<TList>(listClass, textGetter) {
|
) : SelfTargetingOffsetIndependentIntention<TList>(listClass, textGetter) {
|
||||||
|
|
||||||
|
open fun leftParOnNewLine(commonCodeStyleSettings: CommonCodeStyleSettings): Boolean = false
|
||||||
|
|
||||||
|
open fun rightParOnNewLine(commonCodeStyleSettings: CommonCodeStyleSettings): Boolean = false
|
||||||
|
|
||||||
override fun isApplicableTo(element: TList): Boolean {
|
override fun isApplicableTo(element: TList): Boolean {
|
||||||
val elements = element.elements()
|
val elements = element.elements()
|
||||||
if (elements.size <= 1) return false
|
if (elements.size <= 1) return false
|
||||||
@@ -34,12 +42,18 @@ abstract class AbstractChopListIntention<TList : KtElement, TElement : KtElement
|
|||||||
val document = editor?.document ?: return
|
val document = editor?.document ?: return
|
||||||
val pointer = element.createSmartPointer()
|
val pointer = element.createSmartPointer()
|
||||||
|
|
||||||
|
val commonCodeStyleSettings = CodeStyle.getSettings(project).kotlinCommonSettings
|
||||||
|
val leftParOnNewLine = leftParOnNewLine(commonCodeStyleSettings)
|
||||||
|
val rightParOnNewLine = rightParOnNewLine(commonCodeStyleSettings)
|
||||||
|
|
||||||
val elements = element.elements()
|
val elements = element.elements()
|
||||||
if (!hasLineBreakAfter(elements.last())) {
|
if (rightParOnNewLine && !hasLineBreakAfter(elements.last())) {
|
||||||
element.allChildren.lastOrNull { it.node.elementType == KtTokens.RPAR }?.startOffset?.let { document.insertString(it, "\n") }
|
element.allChildren.lastOrNull { it.node.elementType == KtTokens.RPAR }?.startOffset?.let { document.insertString(it, "\n") }
|
||||||
}
|
}
|
||||||
|
|
||||||
for (e in elements.asReversed()) {
|
val maxIndex = elements.size - 1
|
||||||
|
for ((index, e) in elements.asReversed().withIndex()) {
|
||||||
|
if (index == maxIndex && !leftParOnNewLine) break
|
||||||
if (!hasLineBreakBefore(e)) {
|
if (!hasLineBreakBefore(e)) {
|
||||||
document.insertString(e.startOffset, "\n")
|
document.insertString(e.startOffset, "\n")
|
||||||
}
|
}
|
||||||
@@ -79,10 +93,26 @@ class ChopParameterListIntention : AbstractChopListIntention<KtParameterList, Kt
|
|||||||
if (element.parent is KtFunctionLiteral) return false
|
if (element.parent is KtFunctionLiteral) return false
|
||||||
return super.isApplicableTo(element)
|
return super.isApplicableTo(element)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun leftParOnNewLine(commonCodeStyleSettings: CommonCodeStyleSettings): Boolean {
|
||||||
|
return commonCodeStyleSettings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun rightParOnNewLine(commonCodeStyleSettings: CommonCodeStyleSettings): Boolean {
|
||||||
|
return commonCodeStyleSettings.METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ChopArgumentListIntention : AbstractChopListIntention<KtValueArgumentList, KtValueArgument>(
|
class ChopArgumentListIntention : AbstractChopListIntention<KtValueArgumentList, KtValueArgument>(
|
||||||
KtValueArgumentList::class.java,
|
KtValueArgumentList::class.java,
|
||||||
KtValueArgument::class.java,
|
KtValueArgument::class.java,
|
||||||
KotlinBundle.lazyMessage("put.arguments.on.separate.lines")
|
KotlinBundle.lazyMessage("put.arguments.on.separate.lines")
|
||||||
)
|
) {
|
||||||
|
override fun leftParOnNewLine(commonCodeStyleSettings: CommonCodeStyleSettings): Boolean {
|
||||||
|
return commonCodeStyleSettings.CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun rightParOnNewLine(commonCodeStyleSettings: CommonCodeStyleSettings): Boolean {
|
||||||
|
return commonCodeStyleSettings.CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// SET_FALSE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun f() {
|
||||||
|
foo(<caret>1, "a", 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(p1: Int, p2: String, p3: Int){}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// SET_FALSE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun f() {
|
||||||
|
foo(1,
|
||||||
|
"a",
|
||||||
|
2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(p1: Int, p2: String, p3: Int){}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// SET_FALSE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun f() {
|
||||||
|
foo(<caret>1, "a", 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(p1: Int, p2: String, p3: Int){}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// SET_FALSE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun f() {
|
||||||
|
foo(1,
|
||||||
|
"a",
|
||||||
|
2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(p1: Int, p2: String, p3: Int){}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// SET_TRUE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun f() {
|
||||||
|
foo(<caret>1, "a", 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(p1: Int, p2: String, p3: Int){}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// SET_TRUE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun f() {
|
||||||
|
foo(
|
||||||
|
1,
|
||||||
|
"a",
|
||||||
|
2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(p1: Int, p2: String, p3: Int){}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// SET_TRUE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun f() {
|
fun f() {
|
||||||
foo(<caret>1, "a", 2)
|
foo(<caret>1, "a", 2)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// SET_TRUE: CALL_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: CALL_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun f() {
|
fun f() {
|
||||||
foo(
|
foo(
|
||||||
1,
|
1,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun foo(p: Int, c: Char,
|
fun foo(p: Int, c: Char,
|
||||||
b: <caret>Boolean) {
|
b: <caret>Boolean) {
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun foo(
|
fun foo(
|
||||||
p: Int,
|
p: Int,
|
||||||
c: Char,
|
c: Char,
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// SET_FALSE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun foo(p: Int, c: Char, b: <caret>Boolean) {
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// SET_FALSE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun foo(p: Int,
|
||||||
|
c: Char,
|
||||||
|
b: Boolean
|
||||||
|
) {
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// SET_FALSE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun foo(p: Int, c: Char, b: <caret>Boolean) {
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// SET_FALSE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun foo(p: Int,
|
||||||
|
c: Char,
|
||||||
|
b: Boolean) {
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun foo(p: Int, c: Char, b: <caret>Boolean) {
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_FALSE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
|
fun foo(
|
||||||
|
p: Int,
|
||||||
|
c: Char,
|
||||||
|
b: Boolean) {
|
||||||
|
}
|
||||||
@@ -1,2 +1,4 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun foo(p: Int, c: Char, b: <caret>Boolean) {
|
fun foo(p: Int, c: Char, b: <caret>Boolean) {
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun foo(
|
fun foo(
|
||||||
p: Int,
|
p: Int,
|
||||||
c: Char,
|
c: Char,
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun foo(p: Int, <caret>c: Char) {
|
fun foo(p: Int, <caret>c: Char) {
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// SET_TRUE: METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||||
|
// SET_TRUE: METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE
|
||||||
fun foo(
|
fun foo(
|
||||||
p: Int,
|
p: Int,
|
||||||
<caret> c: Char
|
<caret> c: Char
|
||||||
|
|||||||
@@ -3743,6 +3743,21 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/intentions/chop/argumentList"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/intentions/chop/argumentList"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("leftParOnSameLine.kt")
|
||||||
|
public void testLeftParOnSameLine() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/chop/argumentList/leftParOnSameLine.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("parOnSameLine.kt")
|
||||||
|
public void testParOnSameLine() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/chop/argumentList/parOnSameLine.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("rightParOnSameLine.kt")
|
||||||
|
public void testRightParOnSameLine() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/chop/argumentList/rightParOnSameLine.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("threeArgs.kt")
|
@TestMetadata("threeArgs.kt")
|
||||||
public void testThreeArgs() throws Exception {
|
public void testThreeArgs() throws Exception {
|
||||||
runTest("idea/testData/intentions/chop/argumentList/threeArgs.kt");
|
runTest("idea/testData/intentions/chop/argumentList/threeArgs.kt");
|
||||||
@@ -3786,11 +3801,26 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
runTest("idea/testData/intentions/chop/parameterList/hasSomeLineBreaks2.kt");
|
runTest("idea/testData/intentions/chop/parameterList/hasSomeLineBreaks2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("leftParOnSameLine.kt")
|
||||||
|
public void testLeftParOnSameLine() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/chop/parameterList/leftParOnSameLine.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("oneParameter.kt")
|
@TestMetadata("oneParameter.kt")
|
||||||
public void testOneParameter() throws Exception {
|
public void testOneParameter() throws Exception {
|
||||||
runTest("idea/testData/intentions/chop/parameterList/oneParameter.kt");
|
runTest("idea/testData/intentions/chop/parameterList/oneParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("parOnSameLine.kt")
|
||||||
|
public void testParOnSameLine() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/chop/parameterList/parOnSameLine.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("rightParOnSameLine.kt")
|
||||||
|
public void testRightParOnSameLine() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/chop/parameterList/rightParOnSameLine.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("threeParameters.kt")
|
@TestMetadata("threeParameters.kt")
|
||||||
public void testThreeParameters() throws Exception {
|
public void testThreeParameters() throws Exception {
|
||||||
runTest("idea/testData/intentions/chop/parameterList/threeParameters.kt");
|
runTest("idea/testData/intentions/chop/parameterList/threeParameters.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user