From 85cd168dc0c1158282c83f7423086cfd37bf0749 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 10 Jan 2023 15:33:13 +0100 Subject: [PATCH] [kotlin][editor] indent provider: support indent after '->' ^KTIJ-24220 Fixed ^FL-12651 GitOrigin-RevId: a7391fb029df9da3783e1aafe4db40c4ae2527c9 --- .../formatter/EnterHandlerTestGenerated.java | 10 ++++++++ .../AutoIndentInWhenClause.after.kt | 4 +--- .../enterHandler/AutoIndentInWhenClause.kt | 4 +--- ...ndentInWhenClauseWithoutCondition.after.kt | 6 +++++ .../AutoIndentInWhenClauseWithoutCondition.kt | 5 ++++ .../InMultilineLambdaAfterArrow.after.kt | 2 -- .../InMultilineLambdaAfterArrow.kt | 2 -- .../InMultilineLambdaAfterArrow2.after.kt | 11 +++++++++ .../InMultilineLambdaAfterArrow2.kt | 10 ++++++++ .../KotlinLangLineIndentProvider.kt | 24 +++++++++++++++++++ ...ormanceTypingIndentationTestGenerated.java | 10 ++++++++ 11 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.after.kt create mode 100644 plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.kt create mode 100644 plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.after.kt create mode 100644 plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.kt diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/formatter/EnterHandlerTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/formatter/EnterHandlerTestGenerated.java index 790e1f7244d7..a062f56db677 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/formatter/EnterHandlerTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/formatter/EnterHandlerTestGenerated.java @@ -1819,6 +1819,11 @@ public abstract class EnterHandlerTestGenerated extends AbstractEnterHandlerTest runTest("testData/editor/enterHandler/AutoIndentInWhenClause.after.kt"); } + @TestMetadata("AutoIndentInWhenClauseWithoutCondition.after.kt") + public void testAutoIndentInWhenClauseWithoutCondition() throws Exception { + runTest("testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.after.kt"); + } + @TestMetadata("BeforePropertyGetter.after.kt") public void testBeforePropertyGetter() throws Exception { runTest("testData/editor/enterHandler/BeforePropertyGetter.after.kt"); @@ -1989,6 +1994,11 @@ public abstract class EnterHandlerTestGenerated extends AbstractEnterHandlerTest runTest("testData/editor/enterHandler/InMultilineLambdaAfterArrow.after.kt"); } + @TestMetadata("InMultilineLambdaAfterArrow2.after.kt") + public void testInMultilineLambdaAfterArrow2() throws Exception { + runTest("testData/editor/enterHandler/InMultilineLambdaAfterArrow2.after.kt"); + } + @TestMetadata("IndentBeforeElseWithBlock.after.kt") public void testIndentBeforeElseWithBlock() throws Exception { runTest("testData/editor/enterHandler/IndentBeforeElseWithBlock.after.kt"); diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.after.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.after.kt index 1300263b6af8..30ef8d69be8b 100644 --- a/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.after.kt +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.after.kt @@ -1,8 +1,6 @@ -// WITHOUT_CUSTOM_LINE_INDENT_PROVIDER - fun test() { when (2) { is Int -> } -} \ No newline at end of file +} diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.kt index b1350cb9e647..822f77cb4486 100644 --- a/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.kt +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.kt @@ -1,7 +1,5 @@ -// WITHOUT_CUSTOM_LINE_INDENT_PROVIDER - fun test() { when (2) { is Int -> } -} \ No newline at end of file +} diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.after.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.after.kt new file mode 100644 index 000000000000..bc02b4172245 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.after.kt @@ -0,0 +1,6 @@ +fun test() { + when { + is Int -> + + } +} diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.kt new file mode 100644 index 000000000000..eb9f503d218c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.kt @@ -0,0 +1,5 @@ +fun test() { + when { + is Int -> + } +} diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.after.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.after.kt index f0f7f49a8e7d..76583c2cfdb4 100644 --- a/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.after.kt +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.after.kt @@ -2,5 +2,3 @@ val a: (String) -> String = { some -> } - -// WITHOUT_CUSTOM_LINE_INDENT_PROVIDER \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.kt index 9ffcfb6ed792..c56cfc67a575 100644 --- a/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.kt +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.kt @@ -1,5 +1,3 @@ val a: (String) -> String = { some -> } - -// WITHOUT_CUSTOM_LINE_INDENT_PROVIDER \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.after.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.after.kt new file mode 100644 index 000000000000..af0fde3561e6 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.after.kt @@ -0,0 +1,11 @@ +fun foo(a: String, b: String, l: (String) -> Unit) {} + +fun testIndent() { + foo(a = "a", + b = "b") { aaa -> + + println() + } +} + +// SET_INT: INDENT_SIZE=2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.kt b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.kt new file mode 100644 index 000000000000..704170c1ef54 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.kt @@ -0,0 +1,10 @@ +fun foo(a: String, b: String, l: (String) -> Unit) {} + +fun testIndent() { + foo(a = "a", + b = "b") { aaa -> + println() + } +} + +// SET_INT: INDENT_SIZE=2 \ No newline at end of file diff --git a/plugins/kotlin/line-indent-provider/src/org/jetbrains/kotlin/idea/formatter/lineIndent/KotlinLangLineIndentProvider.kt b/plugins/kotlin/line-indent-provider/src/org/jetbrains/kotlin/idea/formatter/lineIndent/KotlinLangLineIndentProvider.kt index 75ee830d92b5..b6f625228b6b 100644 --- a/plugins/kotlin/line-indent-provider/src/org/jetbrains/kotlin/idea/formatter/lineIndent/KotlinLangLineIndentProvider.kt +++ b/plugins/kotlin/line-indent-provider/src/org/jetbrains/kotlin/idea/formatter/lineIndent/KotlinLangLineIndentProvider.kt @@ -50,6 +50,10 @@ abstract class KotlinLangLineIndentProvider : JavaLikeLangLineIndentProvider() { before.isAt(BlockOpeningBrace) -> return factory.createIndentCalculatorForBrace(before, after, BlockOpeningBrace, BlockClosingBrace, Indent.getNormalIndent()) + before.isAt(Arrow) -> { + return factory.createIndentCalculatorForArrow(before, after) + } + after.isAt(ArrayClosingBracket) && !currentPosition.hasLineBreaksAfter(offset) -> return factory.createIndentCalculatorForBrace( before, @@ -247,6 +251,26 @@ abstract class KotlinLangLineIndentProvider : JavaLikeLangLineIndentProvider() { ArrayOpeningBracket to ArrayClosingBracket, ) + private fun IndentCalculatorFactory.createIndentCalculatorForArrow( + arrowPosition: SemanticEditorPosition, + after: SemanticEditorPosition, + ): IndentCalculator? { + val leftBrace = arrowPosition.copyAnd { + it.moveToLeftParenthesisBackwardsSkippingNested(BlockOpeningBrace, BlockClosingBrace) + } + + if (leftBrace.isAtEnd) { + return null + } + + val normalIndent = Indent.getNormalIndent() + return if (leftBrace.controlFlowStatementBefore() != null) { + createIndentCalculator(normalIndent, arrowPosition.startOffset) + } else { + createIndentCalculatorForBrace(leftBrace, after, BlockOpeningBrace, BlockClosingBrace, normalIndent) + } + } + private fun IndentCalculatorFactory.createIndentCalculatorForBrace( before: SemanticEditorPosition, after: SemanticEditorPosition, diff --git a/plugins/kotlin/performance-tests/test/org/jetbrains/kotlin/idea/perf/synthetic/PerformanceTypingIndentationTestGenerated.java b/plugins/kotlin/performance-tests/test/org/jetbrains/kotlin/idea/perf/synthetic/PerformanceTypingIndentationTestGenerated.java index e5168a458e70..0ffb32b3717a 100644 --- a/plugins/kotlin/performance-tests/test/org/jetbrains/kotlin/idea/perf/synthetic/PerformanceTypingIndentationTestGenerated.java +++ b/plugins/kotlin/performance-tests/test/org/jetbrains/kotlin/idea/perf/synthetic/PerformanceTypingIndentationTestGenerated.java @@ -1819,6 +1819,11 @@ public abstract class PerformanceTypingIndentationTestGenerated extends Abstract runTest("../idea/tests/testData/editor/enterHandler/AutoIndentInWhenClause.after.kt"); } + @TestMetadata("AutoIndentInWhenClauseWithoutCondition.after.kt") + public void testAutoIndentInWhenClauseWithoutCondition() throws Exception { + runTest("../idea/tests/testData/editor/enterHandler/AutoIndentInWhenClauseWithoutCondition.after.kt"); + } + @TestMetadata("BeforePropertyGetter.after.kt") public void testBeforePropertyGetter() throws Exception { runTest("../idea/tests/testData/editor/enterHandler/BeforePropertyGetter.after.kt"); @@ -1989,6 +1994,11 @@ public abstract class PerformanceTypingIndentationTestGenerated extends Abstract runTest("../idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow.after.kt"); } + @TestMetadata("InMultilineLambdaAfterArrow2.after.kt") + public void testInMultilineLambdaAfterArrow2() throws Exception { + runTest("../idea/tests/testData/editor/enterHandler/InMultilineLambdaAfterArrow2.after.kt"); + } + @TestMetadata("IndentBeforeElseWithBlock.after.kt") public void testIndentBeforeElseWithBlock() throws Exception { runTest("../idea/tests/testData/editor/enterHandler/IndentBeforeElseWithBlock.after.kt");