Add indent before colon of super types list on new line (KT-13981, KT-5117)
#KT-13981 Fixed #KT-5117 Fixed (cherry picked from commit dfea3af)
This commit is contained in:
committed by
Nikolay Krasko
parent
944b9b5b6c
commit
6a72cebe88
@@ -24,13 +24,14 @@ import com.intellij.psi.tree.IElementType
|
|||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
|
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings
|
||||||
|
import org.jetbrains.kotlin.idea.formatter.NodeIndentStrategy.strategy
|
||||||
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
|
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
|
||||||
|
import org.jetbrains.kotlin.kdoc.parser.KDocElementTypes
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens.*
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import org.jetbrains.kotlin.idea.formatter.NodeIndentStrategy.strategy
|
|
||||||
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings
|
|
||||||
import org.jetbrains.kotlin.kdoc.parser.KDocElementTypes
|
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens.*
|
|
||||||
|
|
||||||
private val QUALIFIED_OPERATION = TokenSet.create(DOT, SAFE_ACCESS)
|
private val QUALIFIED_OPERATION = TokenSet.create(DOT, SAFE_ACCESS)
|
||||||
private val KDOC_COMMENT_INDENT = 1
|
private val KDOC_COMMENT_INDENT = 1
|
||||||
@@ -344,6 +345,11 @@ private val INDENT_RULES = arrayOf<NodeIndentStrategy>(
|
|||||||
.`in`(KtNodeTypes.DOT_QUALIFIED_EXPRESSION, KtNodeTypes.SAFE_ACCESS_EXPRESSION)
|
.`in`(KtNodeTypes.DOT_QUALIFIED_EXPRESSION, KtNodeTypes.SAFE_ACCESS_EXPRESSION)
|
||||||
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
||||||
|
|
||||||
|
strategy("Colon of delegation list")
|
||||||
|
.`in`(KtNodeTypes.CLASS, KtNodeTypes.OBJECT_DECLARATION)
|
||||||
|
.forType(KtTokens.COLON)
|
||||||
|
.set(Indent.getNormalIndent(false)),
|
||||||
|
|
||||||
strategy("Delegation list")
|
strategy("Delegation list")
|
||||||
.`in`(KtNodeTypes.SUPER_TYPE_LIST, KtNodeTypes.INITIALIZER_LIST)
|
.`in`(KtNodeTypes.SUPER_TYPE_LIST, KtNodeTypes.INITIALIZER_LIST)
|
||||||
.set(Indent.getContinuationIndent(false)),
|
.set(Indent.getContinuationIndent(false)),
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import com.intellij.util.text.CharArrayUtil;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.KtNodeTypes;
|
import org.jetbrains.kotlin.KtNodeTypes;
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens;
|
import org.jetbrains.kotlin.lexer.KtTokens;
|
||||||
|
import org.jetbrains.kotlin.psi.KtClassOrObject;
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
import org.jetbrains.kotlin.psi.KtFile;
|
||||||
import org.jetbrains.kotlin.psi.KtSimpleNameStringTemplateEntry;
|
import org.jetbrains.kotlin.psi.KtSimpleNameStringTemplateEntry;
|
||||||
|
|
||||||
@@ -242,6 +243,12 @@ public class KotlinTypedHandler extends TypedHandlerDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c == ':') {
|
||||||
|
if (autoIndentCase(editor, project, file)) {
|
||||||
|
return Result.STOP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Result.CONTINUE;
|
return Result.CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,4 +292,18 @@ public class KotlinTypedHandler extends TypedHandlerDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean autoIndentCase(Editor editor, Project project, PsiFile file) {
|
||||||
|
int offset = editor.getCaretModel().getOffset();
|
||||||
|
PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
|
||||||
|
PsiElement currElement = file.findElementAt(offset - 1);
|
||||||
|
if (currElement != null) {
|
||||||
|
PsiElement parent = currElement.getParent();
|
||||||
|
if (parent != null && parent instanceof KtClassOrObject) {
|
||||||
|
CodeStyleManager.getInstance(project).adjustLineIndent(file, offset - 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class D {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class E
|
class E
|
||||||
: Some
|
: Some
|
||||||
|
|
||||||
class F
|
class F
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ object Some2: A
|
|||||||
|
|
||||||
object Some3
|
object Some3
|
||||||
|
|
||||||
:
|
:
|
||||||
|
|
||||||
|
|
||||||
A
|
A
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ object Some2 :A
|
|||||||
|
|
||||||
object Some3
|
object Some3
|
||||||
|
|
||||||
:
|
:
|
||||||
|
|
||||||
|
|
||||||
A
|
A
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
interface Foo
|
||||||
|
|
||||||
|
class Bar
|
||||||
|
: Foo {
|
||||||
|
}
|
||||||
|
|
||||||
|
class Ob
|
||||||
|
: Foo
|
||||||
|
|
||||||
|
class C {
|
||||||
|
companion object
|
||||||
|
: Foo {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Unfinished1
|
||||||
|
:
|
||||||
|
|
||||||
|
class Unfinished2
|
||||||
|
: {
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
interface Foo
|
||||||
|
|
||||||
|
class Bar
|
||||||
|
: Foo {
|
||||||
|
}
|
||||||
|
|
||||||
|
class Ob
|
||||||
|
: Foo
|
||||||
|
|
||||||
|
class C {
|
||||||
|
companion object
|
||||||
|
: Foo {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Unfinished1
|
||||||
|
:
|
||||||
|
|
||||||
|
class Unfinished2
|
||||||
|
: {
|
||||||
|
}
|
||||||
@@ -607,6 +607,12 @@ public class FormatterTestGenerated extends AbstractFormatterTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("SuperListIndent.after.kt")
|
||||||
|
public void testSuperListIndent() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/SuperListIndent.after.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("TryCatchLineBreak.after.kt")
|
@TestMetadata("TryCatchLineBreak.after.kt")
|
||||||
public void testTryCatchLineBreak() throws Exception {
|
public void testTryCatchLineBreak() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/TryCatchLineBreak.after.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/TryCatchLineBreak.after.kt");
|
||||||
|
|||||||
@@ -422,6 +422,91 @@ class TypedHandlerTest : LightCodeInsightTestCase() {
|
|||||||
doLtGtTestNoAutoClose("fun some() { val a = 12; a <<caret> }")
|
doLtGtTestNoAutoClose("fun some() { val a = 12; a <<caret> }")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testColonOfSuperTypeList() {
|
||||||
|
doCharTypeTest(
|
||||||
|
':',
|
||||||
|
"""
|
||||||
|
|open class A
|
||||||
|
|class B
|
||||||
|
|<caret>
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|open class A
|
||||||
|
|class B
|
||||||
|
| :<caret>
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testColonOfSuperTypeListInObject() {
|
||||||
|
doCharTypeTest(
|
||||||
|
':',
|
||||||
|
"""
|
||||||
|
|interface A
|
||||||
|
|object B
|
||||||
|
|<caret>
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|interface A
|
||||||
|
|object B
|
||||||
|
| :<caret>
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testColonOfSuperTypeListInCompanionObject() {
|
||||||
|
doCharTypeTest(
|
||||||
|
':',
|
||||||
|
"""
|
||||||
|
|interface A
|
||||||
|
|class B {
|
||||||
|
| companion object
|
||||||
|
| <caret>
|
||||||
|
|}
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|interface A
|
||||||
|
|class B {
|
||||||
|
| companion object
|
||||||
|
| :<caret>
|
||||||
|
|}
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testColonOfSuperTypeListBeforeBody() {
|
||||||
|
doCharTypeTest(
|
||||||
|
':',
|
||||||
|
"""
|
||||||
|
|open class A
|
||||||
|
|class B
|
||||||
|
|<caret> {
|
||||||
|
|}
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|open class A
|
||||||
|
|class B
|
||||||
|
| :<caret> {
|
||||||
|
|}
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testColonOfSuperTypeListNotNullIndent() {
|
||||||
|
doCharTypeTest(
|
||||||
|
':',
|
||||||
|
"""
|
||||||
|
|fun test() {
|
||||||
|
| open class A
|
||||||
|
| class B
|
||||||
|
| <caret>
|
||||||
|
|}
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
|fun test() {
|
||||||
|
| open class A
|
||||||
|
| class B
|
||||||
|
| :<caret>
|
||||||
|
|}
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
fun testMoveThroughGT() {
|
fun testMoveThroughGT() {
|
||||||
LightPlatformCodeInsightTestCase.configureFromFileText("a.kt", "val a: List<Set<Int<caret>>>")
|
LightPlatformCodeInsightTestCase.configureFromFileText("a.kt", "val a: List<Set<Int<caret>>>")
|
||||||
EditorTestUtil.performTypingAction(LightPlatformCodeInsightTestCase.getEditor(), '>')
|
EditorTestUtil.performTypingAction(LightPlatformCodeInsightTestCase.getEditor(), '>')
|
||||||
@@ -430,9 +515,9 @@ class TypedHandlerTest : LightCodeInsightTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun doCharTypeTest(ch: Char, beforeText: String, afterText: String) {
|
private fun doCharTypeTest(ch: Char, beforeText: String, afterText: String) {
|
||||||
LightPlatformCodeInsightTestCase.configureFromFileText("a.kt", beforeText)
|
LightPlatformCodeInsightTestCase.configureFromFileText("a.kt", beforeText.trimMargin())
|
||||||
EditorTestUtil.performTypingAction(LightPlatformCodeInsightTestCase.getEditor(), ch)
|
EditorTestUtil.performTypingAction(LightPlatformCodeInsightTestCase.getEditor(), ch)
|
||||||
checkResultByText(afterText)
|
checkResultByText(afterText.trimMargin())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun doLtGtTestNoAutoClose(initText: String) {
|
private fun doLtGtTestNoAutoClose(initText: String) {
|
||||||
|
|||||||
Reference in New Issue
Block a user