diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt index 438ba9c78c5..d1e2d17d459 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt @@ -906,7 +906,17 @@ private val INDENT_RULES = arrayOf( strategy("Indent for block content") .within(BLOCK, CLASS_BODY, FUNCTION_LITERAL) .notForType(RBRACE, LBRACE, BLOCK) - .set(Indent.getNormalIndent(false)), + .set(Indent.getNormalIndent()), + + strategy("Indent for template content") + .within(LONG_STRING_TEMPLATE_ENTRY) + .notForType(LONG_TEMPLATE_ENTRY_START, LONG_TEMPLATE_ENTRY_END) + .set(Indent.getNormalIndent()), + + strategy("No indent for braces in template") + .within(LONG_STRING_TEMPLATE_ENTRY) + .forType(LONG_TEMPLATE_ENTRY_START, LONG_TEMPLATE_ENTRY_END) + .set(Indent.getNoneIndent()), strategy("Indent for property accessors") .within(PROPERTY).forType(PROPERTY_ACCESSOR) @@ -1006,7 +1016,7 @@ private val INDENT_RULES = arrayOf( strategy("Colon of delegation list") .within(CLASS, OBJECT_DECLARATION) .forType(COLON) - .set(Indent.getNormalIndent(false)), + .set(Indent.getNormalIndent()), strategy("Delegation list") .within(SUPER_TYPE_LIST) diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt index a4372c34154..755ceecc549 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt @@ -240,6 +240,9 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing else null } + + inPosition(parent = LONG_STRING_TEMPLATE_ENTRY, right = LONG_TEMPLATE_ENTRY_END).lineBreakIfLineBreakInParent(0) + inPosition(parent = LONG_STRING_TEMPLATE_ENTRY, left = LONG_TEMPLATE_ENTRY_START).lineBreakIfLineBreakInParent(0) } simple { @@ -396,9 +399,6 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing betweenInside(LPAR, DESTRUCTURING_DECLARATION, FOR).spaces(0) betweenInside(LOOP_RANGE, RPAR, FOR).spaces(0) - after(LONG_TEMPLATE_ENTRY_START).spaces(0) - before(LONG_TEMPLATE_ENTRY_END).spaces(0) - afterInside(ANNOTATION_ENTRY, ANNOTATED_EXPRESSION).spaces(1) before(SEMICOLON).spaces(0) diff --git a/idea/testData/formatter/MultilineStringEntry.after.kt b/idea/testData/formatter/MultilineStringEntry.after.kt new file mode 100644 index 00000000000..b6e8784754f --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry.after.kt @@ -0,0 +1,8 @@ +fun test() { + val message1 = "${ + "sd" + }" + val message2 = { + "sd" + }() +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry.kt b/idea/testData/formatter/MultilineStringEntry.kt new file mode 100644 index 00000000000..9e6da597179 --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry.kt @@ -0,0 +1,8 @@ +fun test() { + val message1 = "${ + "sd" + }" + val message2 = { + "sd" + }() +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry2.after.kt b/idea/testData/formatter/MultilineStringEntry2.after.kt new file mode 100644 index 00000000000..d84b49ea8b8 --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry2.after.kt @@ -0,0 +1,4 @@ +fun test() { + val message1 = "${"sd"}" + val message2 = { "sd" }() +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry2.kt b/idea/testData/formatter/MultilineStringEntry2.kt new file mode 100644 index 00000000000..50e7336b67a --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry2.kt @@ -0,0 +1,4 @@ +fun test() { + val message1 = "${"sd"}" + val message2 = {"sd"}() +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry3.after.kt b/idea/testData/formatter/MultilineStringEntry3.after.kt new file mode 100644 index 00000000000..c516de2d28a --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry3.after.kt @@ -0,0 +1,3 @@ +val message = "${ + "sd" +}" \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry3.kt b/idea/testData/formatter/MultilineStringEntry3.kt new file mode 100644 index 00000000000..740d2762b0f --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry3.kt @@ -0,0 +1,2 @@ +val message = "${"sd" +}" \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry4.after.kt b/idea/testData/formatter/MultilineStringEntry4.after.kt new file mode 100644 index 00000000000..e99df0cf0b0 --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry4.after.kt @@ -0,0 +1,5 @@ +fun test() { + val message = "start ${ + "sd" + } end" +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry4.kt b/idea/testData/formatter/MultilineStringEntry4.kt new file mode 100644 index 00000000000..c1276739676 --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry4.kt @@ -0,0 +1,4 @@ +fun test() { + val message = "start ${ + "sd"} end" +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry5.after.kt b/idea/testData/formatter/MultilineStringEntry5.after.kt new file mode 100644 index 00000000000..912fa8acd42 --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry5.after.kt @@ -0,0 +1,5 @@ +fun test() { + "start ${ + println("sd") + } end" +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry5.kt b/idea/testData/formatter/MultilineStringEntry5.kt new file mode 100644 index 00000000000..db6377fafcd --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry5.kt @@ -0,0 +1,4 @@ +fun test() { + "start ${ + println("sd")} end" +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry6.after.kt b/idea/testData/formatter/MultilineStringEntry6.after.kt new file mode 100644 index 00000000000..450d05f14fc --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry6.after.kt @@ -0,0 +1,7 @@ +fun test() { + "start ${ + println( + "sd" + ) + } end" +} \ No newline at end of file diff --git a/idea/testData/formatter/MultilineStringEntry6.kt b/idea/testData/formatter/MultilineStringEntry6.kt new file mode 100644 index 00000000000..1eeef156fd6 --- /dev/null +++ b/idea/testData/formatter/MultilineStringEntry6.kt @@ -0,0 +1,5 @@ +fun test() { + "start ${println( + "sd" + )} end" +} \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/lineBreakInExpression.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/lineBreakInExpression.kt.after index b71a9dc9c96..2e9f263a980 100644 --- a/idea/testData/intentions/toOrdinaryStringLiteral/lineBreakInExpression.kt.after +++ b/idea/testData/intentions/toOrdinaryStringLiteral/lineBreakInExpression.kt.after @@ -1,2 +1,4 @@ -val v = "${2 + - 2}" \ No newline at end of file +val v = "${ + 2 + + 2 +}" \ No newline at end of file diff --git a/idea/testData/refactoring/inline/inlineVariableOrProperty/stringTemplates/rawToNonRaw.kt.after b/idea/testData/refactoring/inline/inlineVariableOrProperty/stringTemplates/rawToNonRaw.kt.after index e20ba0da300..8d6cea690bc 100644 --- a/idea/testData/refactoring/inline/inlineVariableOrProperty/stringTemplates/rawToNonRaw.kt.after +++ b/idea/testData/refactoring/inline/inlineVariableOrProperty/stringTemplates/rawToNonRaw.kt.after @@ -1,4 +1,6 @@ fun foo() { - val y = "x=${"""ab - c"""}" + val y = "x=${ + """ab + c""" + }" } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java index 67f8aae42ed..3b1a059af4c 100644 --- a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java @@ -545,6 +545,36 @@ public class FormatterTestGenerated extends AbstractFormatterTest { runTest("idea/testData/formatter/MultilineFunctionLiteralWithParams.after.kt"); } + @TestMetadata("MultilineStringEntry.after.kt") + public void testMultilineStringEntry() throws Exception { + runTest("idea/testData/formatter/MultilineStringEntry.after.kt"); + } + + @TestMetadata("MultilineStringEntry2.after.kt") + public void testMultilineStringEntry2() throws Exception { + runTest("idea/testData/formatter/MultilineStringEntry2.after.kt"); + } + + @TestMetadata("MultilineStringEntry3.after.kt") + public void testMultilineStringEntry3() throws Exception { + runTest("idea/testData/formatter/MultilineStringEntry3.after.kt"); + } + + @TestMetadata("MultilineStringEntry4.after.kt") + public void testMultilineStringEntry4() throws Exception { + runTest("idea/testData/formatter/MultilineStringEntry4.after.kt"); + } + + @TestMetadata("MultilineStringEntry5.after.kt") + public void testMultilineStringEntry5() throws Exception { + runTest("idea/testData/formatter/MultilineStringEntry5.after.kt"); + } + + @TestMetadata("MultilineStringEntry6.after.kt") + public void testMultilineStringEntry6() throws Exception { + runTest("idea/testData/formatter/MultilineStringEntry6.after.kt"); + } + @TestMetadata("NewLineForRBrace.after.kt") public void testNewLineForRBrace() throws Exception { runTest("idea/testData/formatter/NewLineForRBrace.after.kt");