Single indent for declarations on adding new line (KT-26954)
#KT-26954 Fixed
This commit is contained in:
@@ -244,7 +244,7 @@ abstract class KotlinCommonBlock(
|
|||||||
if (childParent != null) {
|
if (childParent != null) {
|
||||||
val parentType = childParent.elementType
|
val parentType = childParent.elementType
|
||||||
|
|
||||||
if (parentType === KtNodeTypes.VALUE_PARAMETER_LIST || parentType === KtNodeTypes.VALUE_ARGUMENT_LIST) {
|
if (parentType === VALUE_PARAMETER_LIST || parentType === KtNodeTypes.VALUE_ARGUMENT_LIST) {
|
||||||
val prev = getPrevWithoutWhitespace(child)
|
val prev = getPrevWithoutWhitespace(child)
|
||||||
if (childType === RPAR && (prev == null || prev.elementType !== TokenType.ERROR_ELEMENT)) {
|
if (childType === RPAR && (prev == null || prev.elementType !== TokenType.ERROR_ELEMENT)) {
|
||||||
return Indent.getNoneIndent()
|
return Indent.getNoneIndent()
|
||||||
@@ -305,18 +305,18 @@ abstract class KotlinCommonBlock(
|
|||||||
null
|
null
|
||||||
)
|
)
|
||||||
|
|
||||||
KtNodeTypes.TRY -> ChildAttributes(Indent.getNoneIndent(), null)
|
TRY -> ChildAttributes(Indent.getNoneIndent(), null)
|
||||||
|
|
||||||
in QUALIFIED_EXPRESSIONS -> ChildAttributes(Indent.getContinuationWithoutFirstIndent(), null)
|
in QUALIFIED_EXPRESSIONS -> ChildAttributes(Indent.getContinuationWithoutFirstIndent(), null)
|
||||||
|
|
||||||
KtNodeTypes.VALUE_PARAMETER_LIST, KtNodeTypes.VALUE_ARGUMENT_LIST -> {
|
VALUE_PARAMETER_LIST, KtNodeTypes.VALUE_ARGUMENT_LIST -> {
|
||||||
val subBlocks = getSubBlocks()
|
val subBlocks = getSubBlocks()
|
||||||
if (newChildIndex != 1 && newChildIndex != 0 && newChildIndex < subBlocks.size) {
|
if (newChildIndex != 1 && newChildIndex != 0 && newChildIndex < subBlocks.size) {
|
||||||
val block = subBlocks[newChildIndex]
|
val block = subBlocks[newChildIndex]
|
||||||
ChildAttributes(block.indent, block.alignment)
|
ChildAttributes(block.indent, block.alignment)
|
||||||
} else {
|
} else {
|
||||||
val indent =
|
val indent =
|
||||||
if ((type == KtNodeTypes.VALUE_PARAMETER_LIST && !settings.kotlinCustomSettings.CONTINUATION_INDENT_IN_PARAMETER_LISTS) ||
|
if ((type == VALUE_PARAMETER_LIST && !settings.kotlinCustomSettings.CONTINUATION_INDENT_IN_PARAMETER_LISTS) ||
|
||||||
(type == KtNodeTypes.VALUE_ARGUMENT_LIST && !settings.kotlinCustomSettings.CONTINUATION_INDENT_IN_ARGUMENT_LISTS)
|
(type == KtNodeTypes.VALUE_ARGUMENT_LIST && !settings.kotlinCustomSettings.CONTINUATION_INDENT_IN_ARGUMENT_LISTS)
|
||||||
) {
|
) {
|
||||||
Indent.getNormalIndent()
|
Indent.getNormalIndent()
|
||||||
@@ -329,13 +329,20 @@ abstract class KotlinCommonBlock(
|
|||||||
|
|
||||||
DOC_COMMENT -> ChildAttributes(Indent.getSpaceIndent(KDOC_COMMENT_INDENT), null)
|
DOC_COMMENT -> ChildAttributes(Indent.getSpaceIndent(KDOC_COMMENT_INDENT), null)
|
||||||
|
|
||||||
KtNodeTypes.PARENTHESIZED -> getSuperChildAttributes(newChildIndex)
|
PARENTHESIZED -> getSuperChildAttributes(newChildIndex)
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
val blocks = getSubBlocks()
|
val blocks = getSubBlocks()
|
||||||
if (newChildIndex != 0) {
|
if (newChildIndex != 0) {
|
||||||
val isIncomplete = if (newChildIndex < blocks.size) blocks[newChildIndex - 1].isIncomplete else isIncompleteInSuper()
|
val isIncomplete = if (newChildIndex < blocks.size) blocks[newChildIndex - 1].isIncomplete else isIncompleteInSuper()
|
||||||
if (isIncomplete) {
|
if (isIncomplete) {
|
||||||
|
if (blocks.size == newChildIndex && !settings.kotlinCustomSettings.CONTINUATION_INDENT_FOR_EXPRESSION_BODIES) {
|
||||||
|
val lastInParent = blocks.last()
|
||||||
|
if (lastInParent is ASTBlock && lastInParent.node?.elementType in ALL_ASSIGNMENTS) {
|
||||||
|
return ChildAttributes(Indent.getNormalIndent(), null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return getSuperChildAttributes(newChildIndex)
|
return getSuperChildAttributes(newChildIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -355,7 +362,7 @@ abstract class KotlinCommonBlock(
|
|||||||
val kotlinCustomSettings = settings.kotlinCustomSettings
|
val kotlinCustomSettings = settings.kotlinCustomSettings
|
||||||
val parentType = node.elementType
|
val parentType = node.elementType
|
||||||
return when {
|
return when {
|
||||||
parentType === KtNodeTypes.VALUE_PARAMETER_LIST ->
|
parentType === VALUE_PARAMETER_LIST ->
|
||||||
getAlignmentForChildInParenthesis(
|
getAlignmentForChildInParenthesis(
|
||||||
kotlinCommonSettings.ALIGN_MULTILINE_PARAMETERS, KtNodeTypes.VALUE_PARAMETER, COMMA,
|
kotlinCommonSettings.ALIGN_MULTILINE_PARAMETERS, KtNodeTypes.VALUE_PARAMETER, COMMA,
|
||||||
kotlinCommonSettings.ALIGN_MULTILINE_METHOD_BRACKETS, LPAR, RPAR
|
kotlinCommonSettings.ALIGN_MULTILINE_METHOD_BRACKETS, LPAR, RPAR
|
||||||
@@ -379,7 +386,7 @@ abstract class KotlinCommonBlock(
|
|||||||
parentType === KtNodeTypes.SUPER_TYPE_LIST ->
|
parentType === KtNodeTypes.SUPER_TYPE_LIST ->
|
||||||
createAlignmentStrategy(kotlinCommonSettings.ALIGN_MULTILINE_EXTENDS_LIST, getAlignment())
|
createAlignmentStrategy(kotlinCommonSettings.ALIGN_MULTILINE_EXTENDS_LIST, getAlignment())
|
||||||
|
|
||||||
parentType === KtNodeTypes.PARENTHESIZED ->
|
parentType === PARENTHESIZED ->
|
||||||
object : CommonAlignmentStrategy() {
|
object : CommonAlignmentStrategy() {
|
||||||
private var bracketsAlignment: Alignment? =
|
private var bracketsAlignment: Alignment? =
|
||||||
if (kotlinCommonSettings.ALIGN_MULTILINE_BINARY_OPERATION) Alignment.createAlignment() else null
|
if (kotlinCommonSettings.ALIGN_MULTILINE_BINARY_OPERATION) Alignment.createAlignment() else null
|
||||||
@@ -513,7 +520,7 @@ abstract class KotlinCommonBlock(
|
|||||||
return getWrappingStrategyForItemList(wrapSetting, KtNodeTypes.VALUE_ARGUMENT)
|
return getWrappingStrategyForItemList(wrapSetting, KtNodeTypes.VALUE_ARGUMENT)
|
||||||
}
|
}
|
||||||
|
|
||||||
elementType === KtNodeTypes.VALUE_PARAMETER_LIST -> {
|
elementType === VALUE_PARAMETER_LIST -> {
|
||||||
if (parentElementType === KtNodeTypes.FUN ||
|
if (parentElementType === KtNodeTypes.FUN ||
|
||||||
parentElementType === KtNodeTypes.PRIMARY_CONSTRUCTOR ||
|
parentElementType === KtNodeTypes.PRIMARY_CONSTRUCTOR ||
|
||||||
parentElementType === KtNodeTypes.SECONDARY_CONSTRUCTOR) {
|
parentElementType === KtNodeTypes.SECONDARY_CONSTRUCTOR) {
|
||||||
@@ -802,7 +809,7 @@ private val INDENT_RULES = arrayOf(
|
|||||||
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
||||||
|
|
||||||
strategy("Parenthesized expression")
|
strategy("Parenthesized expression")
|
||||||
.within(KtNodeTypes.PARENTHESIZED)
|
.within(PARENTHESIZED)
|
||||||
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
||||||
|
|
||||||
strategy("Opening parenthesis for conditions")
|
strategy("Opening parenthesis for conditions")
|
||||||
@@ -840,7 +847,7 @@ private val INDENT_RULES = arrayOf(
|
|||||||
.set(Indent.getNormalIndent()),
|
.set(Indent.getNormalIndent()),
|
||||||
|
|
||||||
strategy("Parameter list")
|
strategy("Parameter list")
|
||||||
.within(KtNodeTypes.VALUE_PARAMETER_LIST)
|
.within(VALUE_PARAMETER_LIST)
|
||||||
.forElement { it.elementType == KtNodeTypes.VALUE_PARAMETER && it.psi.prevSibling != null }
|
.forElement { it.elementType == KtNodeTypes.VALUE_PARAMETER && it.psi.prevSibling != null }
|
||||||
.continuationIf(KotlinCodeStyleSettings::CONTINUATION_INDENT_IN_PARAMETER_LISTS, indentFirst = true),
|
.continuationIf(KotlinCodeStyleSettings::CONTINUATION_INDENT_IN_PARAMETER_LISTS, indentFirst = true),
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import com.intellij.testFramework.LightCodeInsightTestCase
|
|||||||
import com.intellij.testFramework.LightPlatformCodeInsightTestCase
|
import com.intellij.testFramework.LightPlatformCodeInsightTestCase
|
||||||
import com.intellij.testFramework.LightPlatformTestCase
|
import com.intellij.testFramework.LightPlatformTestCase
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
|
import org.jetbrains.kotlin.idea.formatter.KotlinStyleGuideCodeStyle
|
||||||
|
import org.jetbrains.kotlin.idea.formatter.ktCodeStyleSettings
|
||||||
|
|
||||||
class TypedHandlerTest : LightCodeInsightTestCase() {
|
class TypedHandlerTest : LightCodeInsightTestCase() {
|
||||||
private val dollar = '$'
|
private val dollar = '$'
|
||||||
@@ -810,6 +812,51 @@ class TypedHandlerTest : LightCodeInsightTestCase() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testEnterInFunctionWithExpressionBody() {
|
||||||
|
doTypeTest(
|
||||||
|
'\n',
|
||||||
|
"""
|
||||||
|
|fun test() =<caret>
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|fun test() =
|
||||||
|
| <caret>
|
||||||
|
""",
|
||||||
|
ENABLE_KOTLIN_OFFICIAL_CODE_STYLE
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testEnterInMultiDeclaration() {
|
||||||
|
doTypeTest(
|
||||||
|
'\n',
|
||||||
|
"""
|
||||||
|
|fun test() {
|
||||||
|
| val (a, b) =<caret>
|
||||||
|
|}
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|fun test() {
|
||||||
|
| val (a, b) =
|
||||||
|
| <caret>
|
||||||
|
|}
|
||||||
|
""",
|
||||||
|
ENABLE_KOTLIN_OFFICIAL_CODE_STYLE
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testEnterInVariableDeclaration() {
|
||||||
|
doTypeTest(
|
||||||
|
'\n',
|
||||||
|
"""
|
||||||
|
|val test =<caret>
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|val test =
|
||||||
|
| <caret>
|
||||||
|
""",
|
||||||
|
ENABLE_KOTLIN_OFFICIAL_CODE_STYLE
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun testMoveThroughGT() {
|
fun testMoveThroughGT() {
|
||||||
LightPlatformCodeInsightTestCase.configureFromFileText("a.kt", "val a: List<Set<Int<caret>>>")
|
LightPlatformCodeInsightTestCase.configureFromFileText("a.kt", "val a: List<Set<Int<caret>>>")
|
||||||
@@ -870,4 +917,11 @@ class TypedHandlerTest : LightCodeInsightTestCase() {
|
|||||||
private fun doLtGtTest(initText: String) {
|
private fun doLtGtTest(initText: String) {
|
||||||
doLtGtTest(initText, true)
|
doLtGtTest(initText, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val ENABLE_KOTLIN_OFFICIAL_CODE_STYLE: () -> Unit = {
|
||||||
|
val settings = ktCodeStyleSettings(LightPlatformTestCase.getProject())?.all ?: error("No Settings")
|
||||||
|
KotlinStyleGuideCodeStyle.apply(settings)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user