LineIndentProvider: support string templates
Part of #KT-22211 Relates to #KT-38248 Relates to #KT-35244
This commit is contained in:
+42
-3
@@ -5,14 +5,18 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.formatter.lineIndent
|
package org.jetbrains.kotlin.idea.formatter.lineIndent
|
||||||
|
|
||||||
|
import com.intellij.formatting.Indent
|
||||||
import com.intellij.lang.Language
|
import com.intellij.lang.Language
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.impl.source.codeStyle.SemanticEditorPosition
|
import com.intellij.psi.impl.source.codeStyle.SemanticEditorPosition
|
||||||
import com.intellij.psi.impl.source.codeStyle.lineIndent.IndentCalculator
|
import com.intellij.psi.impl.source.codeStyle.lineIndent.IndentCalculator
|
||||||
import com.intellij.psi.impl.source.codeStyle.lineIndent.JavaLikeLangLineIndentProvider
|
import com.intellij.psi.impl.source.codeStyle.lineIndent.JavaLikeLangLineIndentProvider
|
||||||
|
import com.intellij.psi.impl.source.codeStyle.lineIndent.JavaLikeLangLineIndentProvider.JavaLikeElement.*
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
|
import org.jetbrains.kotlin.idea.formatter.lineIndent.KotlinLikeLangLineIndentProvider.KotlinElement.*
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
|
|
||||||
abstract class KotlinLikeLangLineIndentProvider : JavaLikeLangLineIndentProvider() {
|
abstract class KotlinLikeLangLineIndentProvider : JavaLikeLangLineIndentProvider() {
|
||||||
abstract fun indentionSettings(project: Project): KotlinIndentationAdjuster
|
abstract fun indentionSettings(project: Project): KotlinIndentationAdjuster
|
||||||
@@ -21,11 +25,46 @@ abstract class KotlinLikeLangLineIndentProvider : JavaLikeLangLineIndentProvider
|
|||||||
|
|
||||||
override fun isSuitableForLanguage(language: Language): Boolean = language.isKindOf(KotlinLanguage.INSTANCE)
|
override fun isSuitableForLanguage(language: Language): Boolean = language.isKindOf(KotlinLanguage.INSTANCE)
|
||||||
|
|
||||||
override fun getIndent(project: Project, editor: Editor, language: Language?, offset: Int): IndentCalculator? = null
|
override fun getIndent(project: Project, editor: Editor, language: Language?, offset: Int): IndentCalculator? {
|
||||||
|
val factory = IndentCalculatorFactory(project, editor)
|
||||||
|
val currentPosition = getPosition(editor, offset)
|
||||||
|
|
||||||
|
currentPosition.beforeOptionalMix(Whitespace, LineComment)
|
||||||
|
.takeIf { it.isAt(TemplateEntryOpen) }
|
||||||
|
?.let { templateEntryPosition ->
|
||||||
|
val baseLineOffset = templateEntryPosition.startOffset
|
||||||
|
return factory.createIndentCalculator(Indent.getNormalIndent()) { baseLineOffset }
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPosition.afterOptionalMix(Whitespace, LineComment)
|
||||||
|
.takeIf { it.isAt(TemplateEntryClose) }
|
||||||
|
?.let { templateEntryPosition ->
|
||||||
|
val baseLineOffset = templateEntryPosition.beforeParentheses(TemplateEntryOpen, TemplateEntryClose).startOffset
|
||||||
|
val indent = if (currentPosition.hasEmptyLineAfter(offset)) Indent.getNormalIndent() else Indent.getNoneIndent()
|
||||||
|
return factory.createIndentCalculator(indent) { baseLineOffset }
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class KotlinElement : SemanticEditorPosition.SyntaxElement {
|
||||||
|
TemplateEntryOpen,
|
||||||
|
TemplateEntryClose,
|
||||||
|
Arrow,
|
||||||
|
WhenKeyword,
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val SYNTAX_MAP = linkedMapOf<IElementType, SemanticEditorPosition.SyntaxElement>(
|
private val SYNTAX_MAP: LinkedHashMap<IElementType, SemanticEditorPosition.SyntaxElement> = linkedMapOf(
|
||||||
|
KtTokens.WHITE_SPACE to Whitespace,
|
||||||
|
KtTokens.LONG_TEMPLATE_ENTRY_START to TemplateEntryOpen,
|
||||||
|
KtTokens.LONG_TEMPLATE_ENTRY_END to TemplateEntryClose,
|
||||||
|
KtTokens.EOL_COMMENT to LineComment,
|
||||||
|
KtTokens.ARROW to Arrow,
|
||||||
|
KtTokens.LBRACE to BlockOpeningBrace,
|
||||||
|
KtTokens.RBRACE to BlockClosingBrace,
|
||||||
|
KtTokens.ELSE_KEYWORD to ElseKeyword,
|
||||||
|
KtTokens.WHEN_KEYWORD to WhenKeyword,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+115
@@ -238,6 +238,11 @@ public class PerformanceTypingIndentationTestGenerated extends AbstractPerforman
|
|||||||
runTest("idea/testData/indentationOnNewline/LargeFile.kt");
|
runTest("idea/testData/indentationOnNewline/LargeFile.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LargeFileWithStringTemplate.kt")
|
||||||
|
public void testLargeFileWithStringTemplate() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/LargeFileWithStringTemplate.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ModifierListInUnfinishedDeclaration.kt")
|
@TestMetadata("ModifierListInUnfinishedDeclaration.kt")
|
||||||
public void testModifierListInUnfinishedDeclaration() throws Exception {
|
public void testModifierListInUnfinishedDeclaration() throws Exception {
|
||||||
runTest("idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.kt");
|
runTest("idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.kt");
|
||||||
@@ -283,6 +288,116 @@ public class PerformanceTypingIndentationTestGenerated extends AbstractPerforman
|
|||||||
runTest("idea/testData/indentationOnNewline/SettingAlignMultilineParametersInCalls.kt");
|
runTest("idea/testData/indentationOnNewline/SettingAlignMultilineParametersInCalls.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose.kt")
|
||||||
|
public void testTemplateEntryClose() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose2.kt")
|
||||||
|
public void testTemplateEntryClose2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose3.kt")
|
||||||
|
public void testTemplateEntryClose3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose4.kt")
|
||||||
|
public void testTemplateEntryClose4() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose4.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose5.kt")
|
||||||
|
public void testTemplateEntryClose5() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose5.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose6.kt")
|
||||||
|
public void testTemplateEntryClose6() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose6.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose7.kt")
|
||||||
|
public void testTemplateEntryClose7() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose7.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryCloseInMultilineString.kt")
|
||||||
|
public void testTemplateEntryCloseInMultilineString() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryCloseInMultilineString.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryCloseInMultilineString2.kt")
|
||||||
|
public void testTemplateEntryCloseInMultilineString2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryCloseInMultilineString2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryCloseInMultilineString3.kt")
|
||||||
|
public void testTemplateEntryCloseInMultilineString3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryCloseInMultilineString3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpen.kt")
|
||||||
|
public void testTemplateEntryOpen() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpen.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpen2.kt")
|
||||||
|
public void testTemplateEntryOpen2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpen2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenInMultilineString.kt")
|
||||||
|
public void testTemplateEntryOpenInMultilineString() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenInMultilineString.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenInMultilineString2.kt")
|
||||||
|
public void testTemplateEntryOpenInMultilineString2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenInMultilineString2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenInMultilineString3.kt")
|
||||||
|
public void testTemplateEntryOpenInMultilineString3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenInMultilineString3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithComment.kt")
|
||||||
|
public void testTemplateEntryOpenWithComment() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithComment.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithComment2.kt")
|
||||||
|
public void testTemplateEntryOpenWithComment2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithComment2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent2.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent3.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent4.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent4() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent4.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent5.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent5() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent5.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("While.kt")
|
@TestMetadata("While.kt")
|
||||||
public void testWhile() throws Exception {
|
public void testWhile() throws Exception {
|
||||||
runTest("idea/testData/indentationOnNewline/While.kt");
|
runTest("idea/testData/indentationOnNewline/While.kt");
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${b
|
||||||
|
<caret>}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${b<caret>}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${b
|
||||||
|
|
||||||
|
<caret> }"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${b
|
||||||
|
<caret> }"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
b
|
||||||
|
|
||||||
|
<caret>}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
b
|
||||||
|
<caret>}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
b
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
b<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
b
|
||||||
|
<caret>
|
||||||
|
// smth
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
b<caret>
|
||||||
|
// smth
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "" +
|
||||||
|
"${
|
||||||
|
b
|
||||||
|
<caret>
|
||||||
|
// smth
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "" +
|
||||||
|
"${
|
||||||
|
b<caret>
|
||||||
|
// smth
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "" +
|
||||||
|
"${
|
||||||
|
b
|
||||||
|
<caret>
|
||||||
|
// smth
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "" +
|
||||||
|
"${
|
||||||
|
b<caret>
|
||||||
|
// smth
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
a
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// KT-35244
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
a<caret>
|
||||||
|
}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// KT-35244
|
||||||
|
// IGNORE_FORMATTER
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${a
|
||||||
|
<caret>}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${a<caret>}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
a
|
||||||
|
|
||||||
|
<caret>}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
a
|
||||||
|
<caret>}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
<caret>b}"
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${<caret>b}"
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
|
||||||
|
<caret>b}"
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val a = "${
|
||||||
|
<caret>b}"
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// KT-35244
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${<caret>}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// KT-35244
|
||||||
|
// IGNORE_FORMATTER
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
<caret>a}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${<caret>a}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
|
||||||
|
<caret>a
|
||||||
|
}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
val select = """
|
||||||
|
select
|
||||||
|
${
|
||||||
|
<caret>a
|
||||||
|
}
|
||||||
|
from T
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
// smth
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
// smth<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
// smth
|
||||||
|
<caret>
|
||||||
|
a
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
// smth<caret>
|
||||||
|
a
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun a() {
|
||||||
|
val a = "${
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun a() {
|
||||||
|
val a = "${<caret>}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun a() {
|
||||||
|
val a = "${
|
||||||
|
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun a() {
|
||||||
|
val a = "${
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${<caret>}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${<caret>}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
fun a() {
|
||||||
|
val b = 3
|
||||||
|
"" +
|
||||||
|
"${
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<caret>
|
||||||
|
}"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IGNORE_FORMATTER
|
||||||
@@ -36,6 +36,16 @@ abstract class AbstractTypingIndentationTestBase : KotlinLightPlatformCodeInsigh
|
|||||||
"// WITHOUT_CUSTOM_LINE_INDENT_PROVIDER"
|
"// WITHOUT_CUSTOM_LINE_INDENT_PROVIDER"
|
||||||
) != null
|
) != null
|
||||||
|
|
||||||
|
val ignoreFormatter = InTextDirectivesUtils.findStringWithPrefixes(
|
||||||
|
originalFileText,
|
||||||
|
"// IGNORE_FORMATTER"
|
||||||
|
) != null
|
||||||
|
|
||||||
|
Assert.assertFalse(
|
||||||
|
"Only one option of 'WITHOUT_CUSTOM_LINE_INDENT_PROVIDER' and 'IGNORE_FORMATTER' is available at the same time",
|
||||||
|
withoutCustomLineIndentProvider && ignoreFormatter
|
||||||
|
)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val configurator = FormatSettingsUtil.createConfigurator(originalFileText, CodeStyle.getSettings(project))
|
val configurator = FormatSettingsUtil.createConfigurator(originalFileText, CodeStyle.getSettings(project))
|
||||||
if (!inverted) {
|
if (!inverted) {
|
||||||
@@ -44,16 +54,27 @@ abstract class AbstractTypingIndentationTestBase : KotlinLightPlatformCodeInsigh
|
|||||||
configurator.configureInvertedSettings()
|
configurator.configureInvertedSettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
doNewlineTest(originFilePath, afterFilePath, withoutCustomLineIndentProvider)
|
doNewlineTest(
|
||||||
|
originFilePath, afterFilePath,
|
||||||
|
withoutCustomLineIndentProvider = withoutCustomLineIndentProvider,
|
||||||
|
ignoreFormatter = ignoreFormatter
|
||||||
|
)
|
||||||
} finally {
|
} finally {
|
||||||
CodeStyle.getSettings(project).clearCodeStyleSettings()
|
CodeStyle.getSettings(project).clearCodeStyleSettings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun doNewlineTest(beforeFilePath: String, afterFilePath: String, withoutCustomLineIndentProvider: Boolean) {
|
private fun doNewlineTest(
|
||||||
KotlinLineIndentProvider.useFormatter = true
|
beforeFilePath: String,
|
||||||
typeAndCheck(beforeFilePath, afterFilePath, "with FormatterBasedLineIndentProvider")
|
afterFilePath: String,
|
||||||
KotlinLineIndentProvider.useFormatter = false
|
withoutCustomLineIndentProvider: Boolean,
|
||||||
|
ignoreFormatter: Boolean
|
||||||
|
) {
|
||||||
|
if (!ignoreFormatter) {
|
||||||
|
KotlinLineIndentProvider.useFormatter = true
|
||||||
|
typeAndCheck(beforeFilePath, afterFilePath, "with FormatterBasedLineIndentProvider")
|
||||||
|
KotlinLineIndentProvider.useFormatter = false
|
||||||
|
}
|
||||||
|
|
||||||
if (!withoutCustomLineIndentProvider) {
|
if (!withoutCustomLineIndentProvider) {
|
||||||
typeAndCheck(beforeFilePath, afterFilePath, "with ${customLineIndentProvider.javaClass.simpleName}")
|
typeAndCheck(beforeFilePath, afterFilePath, "with ${customLineIndentProvider.javaClass.simpleName}")
|
||||||
|
|||||||
+115
@@ -240,6 +240,11 @@ public class TypingIndentationTestBaseGenerated extends AbstractTypingIndentatio
|
|||||||
runTest("idea/testData/indentationOnNewline/LargeFile.after.kt");
|
runTest("idea/testData/indentationOnNewline/LargeFile.after.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LargeFileWithStringTemplate.after.kt")
|
||||||
|
public void testLargeFileWithStringTemplate() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/LargeFileWithStringTemplate.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ModifierListInUnfinishedDeclaration.after.kt")
|
@TestMetadata("ModifierListInUnfinishedDeclaration.after.kt")
|
||||||
public void testModifierListInUnfinishedDeclaration() throws Exception {
|
public void testModifierListInUnfinishedDeclaration() throws Exception {
|
||||||
runTest("idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.after.kt");
|
runTest("idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.after.kt");
|
||||||
@@ -285,6 +290,116 @@ public class TypingIndentationTestBaseGenerated extends AbstractTypingIndentatio
|
|||||||
runTest("idea/testData/indentationOnNewline/SettingAlignMultilineParametersInCalls.after.kt");
|
runTest("idea/testData/indentationOnNewline/SettingAlignMultilineParametersInCalls.after.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose.after.kt")
|
||||||
|
public void testTemplateEntryClose() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose2.after.kt")
|
||||||
|
public void testTemplateEntryClose2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose2.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose3.after.kt")
|
||||||
|
public void testTemplateEntryClose3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose3.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose4.after.kt")
|
||||||
|
public void testTemplateEntryClose4() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose4.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose5.after.kt")
|
||||||
|
public void testTemplateEntryClose5() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose5.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose6.after.kt")
|
||||||
|
public void testTemplateEntryClose6() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose6.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryClose7.after.kt")
|
||||||
|
public void testTemplateEntryClose7() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryClose7.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryCloseInMultilineString.after.kt")
|
||||||
|
public void testTemplateEntryCloseInMultilineString() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryCloseInMultilineString.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryCloseInMultilineString2.after.kt")
|
||||||
|
public void testTemplateEntryCloseInMultilineString2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryCloseInMultilineString2.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryCloseInMultilineString3.after.kt")
|
||||||
|
public void testTemplateEntryCloseInMultilineString3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryCloseInMultilineString3.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpen.after.kt")
|
||||||
|
public void testTemplateEntryOpen() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpen.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpen2.after.kt")
|
||||||
|
public void testTemplateEntryOpen2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpen2.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenInMultilineString.after.kt")
|
||||||
|
public void testTemplateEntryOpenInMultilineString() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenInMultilineString.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenInMultilineString2.after.kt")
|
||||||
|
public void testTemplateEntryOpenInMultilineString2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenInMultilineString2.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenInMultilineString3.after.kt")
|
||||||
|
public void testTemplateEntryOpenInMultilineString3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenInMultilineString3.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithComment.after.kt")
|
||||||
|
public void testTemplateEntryOpenWithComment() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithComment.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithComment2.after.kt")
|
||||||
|
public void testTemplateEntryOpenWithComment2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithComment2.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent.after.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent2.after.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent2() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent2.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent3.after.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent3() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent3.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent4.after.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent4() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent4.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TemplateEntryOpenWithoutContent5.after.kt")
|
||||||
|
public void testTemplateEntryOpenWithoutContent5() throws Exception {
|
||||||
|
runTest("idea/testData/indentationOnNewline/TemplateEntryOpenWithoutContent5.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("While.after.kt")
|
@TestMetadata("While.after.kt")
|
||||||
public void testWhile() throws Exception {
|
public void testWhile() throws Exception {
|
||||||
runTest("idea/testData/indentationOnNewline/While.after.kt");
|
runTest("idea/testData/indentationOnNewline/While.after.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user