diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 5f774da7aeb..32f5ebd3cca 100755 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -89,6 +89,7 @@ import org.jetbrains.kotlin.idea.decompiler.textBuilder.AbstractCommonDecompiled import org.jetbrains.kotlin.idea.decompiler.textBuilder.AbstractCommonDecompiledTextTest import org.jetbrains.kotlin.idea.decompiler.textBuilder.AbstractJsDecompiledTextFromJsMetadataTest import org.jetbrains.kotlin.idea.decompiler.textBuilder.AbstractJvmDecompiledTextTest +import org.jetbrains.kotlin.idea.editor.AbstractMultiLineStringIndentTest import org.jetbrains.kotlin.idea.editor.backspaceHandler.AbstractBackspaceHandlerTest import org.jetbrains.kotlin.idea.editor.quickDoc.AbstractQuickDocProviderTest import org.jetbrains.kotlin.idea.filters.AbstractKotlinExceptionFilterTest @@ -680,6 +681,10 @@ fun main(args: Array) { model("editor/backspaceHandler") } + testClass { + model("editor/enterHandler/multilineString") + } + testClass { model("editor/quickDoc", pattern = """^([^_]+)\.[^\.]*$""") } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index ee7b0388a05..99021731cff 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -558,6 +558,8 @@ + diff --git a/idea/src/org/jetbrains/kotlin/idea/editor/KotlinMultilineStringEnterHandler.kt b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinMultilineStringEnterHandler.kt new file mode 100644 index 00000000000..be738463e0d --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinMultilineStringEnterHandler.kt @@ -0,0 +1,350 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.editor + +import com.intellij.codeInsight.CodeInsightSettings +import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegate +import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegate.Result +import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegateAdapter +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.editor.Document +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.editor.actionSystem.EditorActionHandler +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Ref +import com.intellij.openapi.util.TextRange +import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.codeStyle.CodeStyleSettingsManager +import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.idea.util.application.runWriteAction +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getCallNameExpression +import org.jetbrains.kotlin.psi.psiUtil.isSingleQuoted +import org.jetbrains.kotlin.psi.psiUtil.parents +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull + +class KotlinMultilineStringEnterHandler : EnterHandlerDelegateAdapter() { + private var wasInMultilineString: Boolean = false + private var whiteSpaceAfterCaret: String = "" + + override fun preprocessEnter( + file: PsiFile, editor: Editor, caretOffset: Ref, caretAdvance: Ref, dataContext: DataContext, + originalHandler: EditorActionHandler?): EnterHandlerDelegate.Result { + if (file !is KtFile) return Result.Continue + + val document = editor.document + val text = document.text + val offset = caretOffset.get().toInt() + + if (offset == 0 || offset >= text.length) return Result.Continue + + val element = file.findElementAt(offset) + if (!inMultilineString(element, offset)) { + return Result.Continue + } + else { + wasInMultilineString = true + } + + whiteSpaceAfterCaret = text.substring(offset).takeWhile { ch -> ch == ' ' || ch == '\t' } + document.deleteString(offset, offset + whiteSpaceAfterCaret.length) + + val ch1 = text[offset - 1] + val ch2 = text[offset] + val isInBrace = (ch1 == '(' && ch2 == ')') || (ch1 == '{' && ch2 == '}') + if (!isInBrace || !CodeInsightSettings.getInstance().SMART_INDENT_ON_ENTER) { + return Result.Continue + } + + originalHandler?.execute(editor, editor.caretModel.currentCaret, dataContext) + return Result.DefaultForceIndent + } + + override fun postProcessEnter(file: PsiFile, editor: Editor, dataContext: DataContext): Result { + if (file !is KtFile) return Result.Continue + + if (!wasInMultilineString) return Result.Continue + wasInMultilineString = false + + val project = file.project + val document = editor.document + PsiDocumentManager.getInstance(project).commitDocument(document) + + val caretModel = editor.caretModel + val offset = caretModel.offset + + val element = file.findElementAt(offset) ?: return Result.Continue + val literal = findString(element, offset) ?: return Result.Continue + + val hasTrimIndentCallInChain = hasTrimIndentCallInChain(literal) + val marginChar = if (hasTrimIndentCallInChain) + null + else + getMarginCharFromTrimMarginCallsInChain(literal) ?: getMarginCharFromLiteral(literal) + + runWriteAction { + val settings = MultilineSettings(file.project) + + val caretMarker = document.createRangeMarker(offset, offset) + caretMarker.isGreedyToRight = true + fun caretOffset(): Int = caretMarker.endOffset + + val prevLineNumber = document.getLineNumber(offset) - 1 + assert(prevLineNumber >= 0) + + val prevLine = getLineByNumber(prevLineNumber, document) + val currentLine = getLineByNumber(prevLineNumber + 1, document) + val nextLine = if (document.lineCount > prevLineNumber + 2) getLineByNumber(prevLineNumber + 2, document) else "" + + val wasSingleLine = literal.text.indexOf("\n") == literal.text.lastIndexOf("\n") // Only one '\n' in the string after insertion + val lines = literal.text.split("\n") + + val inBraces = (prevLine.endsWith("{") && nextLine.trim().startsWith("}")) || + (prevLine.endsWith("(") && nextLine.trim().startsWith(")")) + + val literalOffset = literal.textRange.startOffset + if (wasSingleLine || (lines.size == 3 && inBraces)) { + val shouldUseTrimIndent = hasTrimIndentCallInChain || (marginChar == null && lines.first().trim() == MULTILINE_QUOTE) + val newMarginChar: Char? = if (shouldUseTrimIndent) null else (marginChar ?: DEFAULT_TRIM_MARGIN_CHAR) + + insertTrimCall(document, literal, if (shouldUseTrimIndent) null else newMarginChar) + + val prevIndent = settings.indentLength(prevLine) + val indentSize = prevIndent + settings.marginIndent + + forceIndent(caretOffset(), indentSize, newMarginChar, document, settings) + + val isInLineEnd = literal.text.substring(offset - literalOffset) == MULTILINE_QUOTE + if (isInLineEnd) { + // Move close quote to next line + caretMarker.isGreedyToRight = false + insertNewLine(caretOffset(), prevIndent, document, settings) + caretMarker.isGreedyToRight = true + } + + if (inBraces) { + // Move closing bracket under same indent + forceIndent(caretOffset() + 1, indentSize, newMarginChar, document, settings) + } + } + else { + val isPrevLineFirst = document.getLineNumber(literalOffset) == prevLineNumber + + val indentInPreviousLine = when { + isPrevLineFirst -> lines.first().substring(MULTILINE_QUOTE.length) + else -> prevLine + }.prefixLength { it == ' ' || it == '\t' } + + val prefixStripped = when { + isPrevLineFirst -> lines.first().substring(indentInPreviousLine + MULTILINE_QUOTE.length) + else -> prevLine.substring(indentInPreviousLine) + } + + val nonBlankNotFirstLines = lines.subList(1, lines.size).filterNot { it.isBlank() || it.trimStart() == MULTILINE_QUOTE } + + val marginCharToInsert = if (marginChar != null && + !prefixStripped.startsWith(marginChar) && + !nonBlankNotFirstLines.isEmpty() && + nonBlankNotFirstLines.none { it.trimStart().startsWith(marginChar) }) { + + // We have margin char but decide not to insert it + null + } + else { + marginChar + } + + if (marginCharToInsert == null || !currentLine.trimStart().startsWith(marginCharToInsert)) { + val indentLength = when { + inBraces -> settings.indentLength(nextLine) + !isPrevLineFirst -> settings.indentLength(prevLine) + else -> settings.indentLength(prevLine) + settings.marginIndent + } + + forceIndent(caretOffset(), indentLength, marginCharToInsert, document, settings) + + val wsAfterMargin = when { + marginCharToInsert != null && prefixStripped.startsWith(marginCharToInsert) -> { + prefixStripped.substring(1).takeWhile { it == ' ' || it == '\t' } + } + else -> "" + } + + // Insert same indent after margin char that previous line has + document.insertString(caretOffset(), wsAfterMargin) + + if (inBraces) { + val nextLineOffset = document.getLineStartOffset(prevLineNumber + 2) + forceIndent(nextLineOffset, 0, null, document, settings) + document.insertString(nextLineOffset, (marginCharToInsert?.toString() ?: "") + wsAfterMargin) + forceIndent(nextLineOffset, indentLength, null, document, settings) + } + } + } + + document.insertString(caretOffset(), whiteSpaceAfterCaret) + + caretModel.moveToOffset(caretOffset()) + caretMarker.dispose() + } + + return Result.Stop + } + + companion object { + val DEFAULT_TRIM_MARGIN_CHAR = '|' + val TRIM_INDENT_CALL = "trimIndent" + val TRIM_MARGIN_CALL = "trimMargin" + + val MULTILINE_QUOTE = "\"\"\"" + + class MultilineSettings(project: Project) { + private val kotlinIndentOptions = + CodeStyleSettingsManager.getInstance(project).currentSettings.getIndentOptions(KotlinFileType.INSTANCE) + + val useTabs = kotlinIndentOptions.USE_TAB_CHARACTER + val tabSize = kotlinIndentOptions.TAB_SIZE + val regularIndent = kotlinIndentOptions.INDENT_SIZE + val marginIndent = regularIndent + + fun getSmartSpaces(count: Int): String = when { + useTabs -> StringUtil.repeat("\t", count / tabSize) + StringUtil.repeat(" ", count % tabSize) + else -> StringUtil.repeat(" ", count) + } + + fun indentLength(line: String): Int = when { + useTabs -> { + val tabsCount = line.prefixLength { it == '\t' } + tabsCount * tabSize + line.substring(tabsCount).prefixLength { it == ' ' } + } + else -> line.prefixLength { it == ' ' } + } + } + + fun findString(element: PsiElement?, offset: Int): KtStringTemplateExpression? { + if (element !is LeafPsiElement) return null + + when (element.elementType) { + KtTokens.REGULAR_STRING_PART -> { + // Ok + } + KtTokens.CLOSING_QUOTE -> { + if (element.startOffset != offset) { + return null + } + } + else -> return null + } + + return element.parents.firstIsInstanceOrNull() + } + + fun inMultilineString(element: PsiElement?, offset: Int) = + !(findString(element, offset)?.isSingleQuoted() ?: true) + + fun getMarginCharFromLiteral(str: KtStringTemplateExpression, marginChar: Char = DEFAULT_TRIM_MARGIN_CHAR): Char? { + val lines = str.text.lines() + if (lines.size <= 2) return null + + val middleNonBlank = lines.subList(1, lines.size - 1).filter { !it.isBlank() } + + if (middleNonBlank.isNotEmpty() && middleNonBlank.all { it.trimStart().startsWith(marginChar) }) { + return marginChar + } + + return null + } + + + fun getLiteralCalls(str: KtStringTemplateExpression): Sequence { + var previous: PsiElement = str + return str.parents + .takeWhile { parent -> + if (parent is KtQualifiedExpression && parent.receiverExpression == previous) { + previous = parent + true + } + else { + false + } + } + .mapNotNull { qualified -> + (qualified as KtQualifiedExpression).selectorExpression as? KtCallExpression + } + } + + fun getMarginCharFromTrimMarginCallsInChain(str: KtStringTemplateExpression): Char? { + val literalCall = getLiteralCalls(str).firstOrNull { call -> + call.getCallNameExpression()?.text == TRIM_MARGIN_CALL + } ?: return null + + val firstArgument = literalCall.valueArguments.getOrNull(0) ?: return DEFAULT_TRIM_MARGIN_CHAR + val argumentExpression = firstArgument.getArgumentExpression() as? KtStringTemplateExpression ?: return DEFAULT_TRIM_MARGIN_CHAR + val entry = argumentExpression.entries.singleOrNull() as? KtLiteralStringTemplateEntry ?: return DEFAULT_TRIM_MARGIN_CHAR + + return entry.text?.singleOrNull() ?: DEFAULT_TRIM_MARGIN_CHAR + } + + fun hasTrimIndentCallInChain(str: KtStringTemplateExpression): Boolean { + return getLiteralCalls(str).any { call -> call.getCallNameExpression()?.text == TRIM_INDENT_CALL } + } + + fun getLineByNumber(number: Int, document: Document): String = + document.getText(TextRange(document.getLineStartOffset(number), document.getLineEndOffset(number))) + + fun insertNewLine(nlOffset: Int, indent: Int, document: Document, settings: MultilineSettings) { + document.insertString(nlOffset, "\n") + forceIndent(nlOffset + 1, indent, null, document, settings) + } + + fun forceIndent(offset: Int, indent: Int, marginChar: Char?, document: Document, settings: MultilineSettings) { + val lineNumber = document.getLineNumber(offset) + val lineStart = document.getLineStartOffset(lineNumber) + val line = getLineByNumber(lineNumber, document) + val wsPrefix = line.takeWhile { c -> c == ' ' || c == '\t' } + document.replaceString(lineStart, + lineStart + wsPrefix.length, + settings.getSmartSpaces(indent) + (marginChar?.toString() ?: "")) + } + + fun String.prefixLength(f: (Char) -> Boolean) = takeWhile(f).count() + + fun insertTrimCall(document: Document, literal: KtStringTemplateExpression, marginChar: Char?) { + if (hasTrimIndentCallInChain(literal) || getMarginCharFromTrimMarginCallsInChain(literal) != null) return + if (literal.parents.any { it is KtAnnotationEntry }) return + + if (marginChar == null) { + document.insertString(literal.textRange.endOffset, ".$TRIM_INDENT_CALL()") + } + else { + document.insertString( + literal.textRange.endOffset, + if (marginChar == DEFAULT_TRIM_MARGIN_CHAR) { + ".$TRIM_MARGIN_CALL()" + } + else { + ".$TRIM_MARGIN_CALL(\"$marginChar\")" + }) + } + } + } +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginCharWhenMultilineWithoutMargins.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginCharWhenMultilineWithoutMargins.kt new file mode 100644 index 00000000000..004bdc2bb1e --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginCharWhenMultilineWithoutMargins.kt @@ -0,0 +1,12 @@ +val a = + """blah blah blah + blah blah blah + blah blah blah + """.trimMargin() +//----- +val a = + """bl + ah blah blah + blah blah blah + blah blah blah + """.trimMargin() diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnused.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnused.kt new file mode 100644 index 00000000000..c20ec153734 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnused.kt @@ -0,0 +1,14 @@ +val a = + """ +blah blah blah + blah blah blah + blah blah blah + """.trimMargin() +//----- +val a = + """ +blah blah blah + blah blah blah + blah blah blah + + """.trimMargin() diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnusedWithEmptyPrevious.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnusedWithEmptyPrevious.kt new file mode 100644 index 00000000000..5389bb08d78 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnusedWithEmptyPrevious.kt @@ -0,0 +1,16 @@ +val a = + """ +blah blah blah + blah blah blah + blah blah blah + + """.trimMargin() +//----- +val a = + """ +blah blah blah + blah blah blah + blah blah blah + + + """.trimMargin() diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultiline.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultiline.kt new file mode 100644 index 00000000000..6af9a896829 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultiline.kt @@ -0,0 +1,14 @@ +val a = + """ +blah blah blah + blah blah blah + blah blah blah + """ +//----- +val a = + """ +blah blah blah + blah blah blah + blah blah blah + + """ diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultilineFirstLine.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultilineFirstLine.kt new file mode 100644 index 00000000000..da4f1556109 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultilineFirstLine.kt @@ -0,0 +1,12 @@ +val a = + """blah blah blah + blah blah blah + blah blah blah + """ +//----- +val a = + """bl + ah blah blah + blah blah blah + blah blah blah + """ diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin1.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin1.kt new file mode 100644 index 00000000000..a599d5b801b --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin1.kt @@ -0,0 +1,5 @@ +val a = """blah blah""".trimMargin() +//----- +val a = """blah blah + | +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin2.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin2.kt new file mode 100644 index 00000000000..44f5fddd08c --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin2.kt @@ -0,0 +1,5 @@ +val a = """blah blah blah""".replace(" ", "")?.replace("b", "p").trimMargin().length +//----- +val a = """blah blah blah + | +""".replace(" ", "")?.replace("b", "p").trimMargin().length \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin3.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin3.kt new file mode 100644 index 00000000000..5414d354520 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin3.kt @@ -0,0 +1,17 @@ +val a = + (""" + | blah blah + | blah blah + """ + """""").trimMargin() + +// TODO: Concatenation is not supported +//----- +val a = + (""" + | blah blah + | blah blah + """ + """ + + """.trimIndent()).trimMargin() + +// TODO: Concatenation is not supported diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin4.kt b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin4.kt new file mode 100644 index 00000000000..5ab3555df82 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin4.kt @@ -0,0 +1,5 @@ +val a = """blah blah blah""".replace(" ", "")?.replace("b", "p").trimIndent().length +//----- +val a = """blah blah blah + +""".replace(" ", "")?.replace("b", "p").trimIndent().length \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterBeforeMarginChar.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterBeforeMarginChar.kt new file mode 100644 index 00000000000..7cc59f38a7e --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterBeforeMarginChar.kt @@ -0,0 +1,12 @@ +fun some() { + val b = """ + |helle|asdf + """.trimMargin() +} +//----- +fun some() { + val b = """ + |helle + |asdf + """.trimMargin() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInInfixMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInInfixMargin.kt new file mode 100644 index 00000000000..3225c6b8c24 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInInfixMargin.kt @@ -0,0 +1,11 @@ +val a = + """blah blah + | blah blah + | blah blah""" + """blah blah""" +//----- +val a = + """blah blah + | blah blah + | blah blah""" + """blah blah + | + """.trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInLineWithMarginOnNotMargedLine.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInLineWithMarginOnNotMargedLine.kt new file mode 100644 index 00000000000..7f68c10892f --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInLineWithMarginOnNotMargedLine.kt @@ -0,0 +1,12 @@ +fun main(args: Array) { + println(""" + + | sdf""".trimMargin()) +} +//----- +fun main(args: Array) { + println(""" + + | + | sdf""".trimMargin()) +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInMethodCallMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInMethodCallMargin.kt new file mode 100644 index 00000000000..1e4d6e8409e --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInMethodCallMargin.kt @@ -0,0 +1,5 @@ +val a = """blah blah""".replace("\r", "") +//----- +val a = """blah blah + | +""".trimMargin().replace("\r", "") \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInOneLineAfterSpaces.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInOneLineAfterSpaces.kt new file mode 100644 index 00000000000..c6267cfe0c7 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInOneLineAfterSpaces.kt @@ -0,0 +1,4 @@ +val a = """ blah blah""" +//----- +val a = """ + blah blah""".trimIndent() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInTwoLinesNoMarginCall.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInTwoLinesNoMarginCall.kt new file mode 100644 index 00000000000..aa53aa551fc --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInTwoLinesNoMarginCall.kt @@ -0,0 +1,10 @@ +fun some() { + val b = """ + """ +} +//----- +fun some() { + val b = """ + + """ +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces.kt new file mode 100644 index 00000000000..ed8aebfa18c --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces.kt @@ -0,0 +1,11 @@ +val a = + """ + | blah blah blah {} + """.trimMargin() +//----- +val a = + """ + | blah blah blah { + | + | } + """.trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces1.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces1.kt new file mode 100644 index 00000000000..26314e3a6b0 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces1.kt @@ -0,0 +1,17 @@ +fun some() { + val b = """ + class Test { + fun some() {} + } + """.trimIndent() +} +//----- +fun some() { + val b = """ + class Test { + fun some() { + + } + } + """.trimIndent() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces2.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces2.kt new file mode 100644 index 00000000000..336ba78e6b8 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces2.kt @@ -0,0 +1,9 @@ +fun some() { + val b = """class Test {}""" +} +//----- +fun some() { + val b = """class Test { + | + |}""".trimMargin() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideTextMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideTextMargin.kt new file mode 100644 index 00000000000..20fb3f610cb --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterInsideTextMargin.kt @@ -0,0 +1,8 @@ +object A { + val a = """blah blah""" +} +//----- +object A { + val a = """blah + | blah""".trimMargin() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterMLSimpleMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterMLSimpleMargin.kt new file mode 100644 index 00000000000..7aae3d70d64 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterMLSimpleMargin.kt @@ -0,0 +1,14 @@ +val a = + """ + | blah blah blah + | blah blah blah + | blah blah blah + """ +//----- +val a = + """ + | blah blah blah + | blah blah blah + | blah blah blah + | + """ diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterMLStartOnSameLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterMLStartOnSameLineMargin.kt new file mode 100644 index 00000000000..05b19c60d06 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterMLStartOnSameLineMargin.kt @@ -0,0 +1,8 @@ +val a = """blah blah blah + | blah blah + """ +//----- +val a = """blah blah blah + | blah blah + | + """ \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMargin.kt new file mode 100644 index 00000000000..6d8e1ca39c1 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMargin.kt @@ -0,0 +1,10 @@ +fun some() { + val b = """ + """.trimMargin() +} +//----- +fun some() { + val b = """ + | + """.trimMargin() +} diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMarginAndLine.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMarginAndLine.kt new file mode 100644 index 00000000000..1b0e4fcf3be --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMarginAndLine.kt @@ -0,0 +1,12 @@ +fun some() { + val b = """ + |hello + """.trimMargin() +} +//----- +fun some() { + val b = """ + | + |hello + """.trimMargin() +} diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstNonEmptyLineWithPresentTrimMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstNonEmptyLineWithPresentTrimMargin.kt new file mode 100644 index 00000000000..eefde97398e --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstNonEmptyLineWithPresentTrimMargin.kt @@ -0,0 +1,10 @@ +fun some() { + val b = """abc + """.trimMargin() +} +//----- +fun some() { + val b = """abc + | + """.trimMargin() +} diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterOnNewLine.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnNewLine.kt new file mode 100644 index 00000000000..65a205fb982 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterOnNewLine.kt @@ -0,0 +1,7 @@ +val a = + """""" +//----- +val a = + """ + + """.trimIndent() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterSimple.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterSimple.kt new file mode 100644 index 00000000000..44707eeaa35 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterSimple.kt @@ -0,0 +1,9 @@ +class A { + val a = """""" +} +//----- +class A { + val a = """ + + """.trimIndent() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextMargin.kt new file mode 100644 index 00000000000..345f91ec13e --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextMargin.kt @@ -0,0 +1,5 @@ +val a = """blah blah""" +//----- +val a = """blah blah + | +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextOnNewLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextOnNewLineMargin.kt new file mode 100644 index 00000000000..a4060d17fd3 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextOnNewLineMargin.kt @@ -0,0 +1,7 @@ +val a = + """blah blah""" +//----- +val a = + """blah blah + | + """.trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMargin.kt new file mode 100644 index 00000000000..8f96465fcab --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMargin.kt @@ -0,0 +1,9 @@ +class A { + val a = """blah blah""".trimMargin("#") +} +//----- +class A { + val a = """blah blah + # + """.trimMargin("#") +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMarginInLineStart.kt b/idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMarginInLineStart.kt new file mode 100644 index 00000000000..f40835f557a --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMarginInLineStart.kt @@ -0,0 +1,8 @@ +class A { + val a = """blah blah""".trimMargin("#") +} +//----- +class A { + val a = """ + #blah blah""".trimMargin("#") +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/insertDefaultMargin.kt b/idea/testData/editor/enterHandler/multilineString/spaces/insertDefaultMargin.kt new file mode 100644 index 00000000000..192946580bc --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/insertDefaultMargin.kt @@ -0,0 +1,11 @@ +class A { + val m = '#' + val a = """blah blah""".trimMargin(m) +} +//----- +class A { + val m = '#' + val a = """blah blah + | + """.trimMargin(m) +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/noTrimIndentInAnnotations.kt b/idea/testData/editor/enterHandler/multilineString/spaces/noTrimIndentInAnnotations.kt new file mode 100644 index 00000000000..f5bbc45bf69 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/noTrimIndentInAnnotations.kt @@ -0,0 +1,7 @@ +@Annotation("""""") +fun some() {} +//----- +@Annotation(""" + +""") +fun some() {} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/spaces/restoreIndentFromEmptyLine.kt b/idea/testData/editor/enterHandler/multilineString/spaces/restoreIndentFromEmptyLine.kt new file mode 100644 index 00000000000..6af3a39bcf7 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/spaces/restoreIndentFromEmptyLine.kt @@ -0,0 +1,12 @@ +fun main(args: Array) { + println(""" + + | sdf""".trimMargin()) +} +//----- +fun main(args: Array) { + println(""" + +| + | sdf""".trimMargin()) +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/dontInsertTrimMarginCall.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/dontInsertTrimMarginCall.kt new file mode 100644 index 00000000000..9ed424e020e --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/dontInsertTrimMarginCall.kt @@ -0,0 +1,5 @@ +val a = """blah blah""".trimMargin() +//----- +val a = """blah blah + | +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInMethodCallMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInMethodCallMargin.kt new file mode 100644 index 00000000000..728889d967d --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInMethodCallMargin.kt @@ -0,0 +1,5 @@ +val a = """blah blah""".replace("\r", "") +//----- +val a = """blah blah + | +""".trimMargin().replace("\r", "") \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInTwoLinesNoMarginCall.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInTwoLinesNoMarginCall.kt new file mode 100644 index 00000000000..256d3927756 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInTwoLinesNoMarginCall.kt @@ -0,0 +1,10 @@ +fun some() { + val b = """ + """ +} +//----- +fun some() { + val b = """ + + """ +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideBraces.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideBraces.kt new file mode 100644 index 00000000000..b0e3258c027 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideBraces.kt @@ -0,0 +1,11 @@ +val a = + """ + | blah blah {} + """.trimMargin() +//----- +val a = + """ + | blah blah { + | + | } + """.trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideText.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideText.kt new file mode 100644 index 00000000000..eb5188149ca --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideText.kt @@ -0,0 +1,8 @@ +object A { + val a = """blah blah""" +} +//----- +object A { + val a = """blah + | blah""".trimMargin() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLSimpleMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLSimpleMargin.kt new file mode 100644 index 00000000000..24d0eabe369 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLSimpleMargin.kt @@ -0,0 +1,14 @@ +val a = + """ + | blah blah blah + | blah blah blah + | blah blah blah + """ +//----- +val a = + """ + | blah blah blah + | blah blah blah + | blah blah blah + | + """ \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLStartOnSameLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLStartOnSameLineMargin.kt new file mode 100644 index 00000000000..937eb4427fd --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLStartOnSameLineMargin.kt @@ -0,0 +1,8 @@ +val a = """blah blah blah + | blah blah + """ +//----- +val a = """blah blah blah + | blah blah + | + """ \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterOnNewLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterOnNewLineMargin.kt new file mode 100644 index 00000000000..8e64c0c8b58 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterOnNewLineMargin.kt @@ -0,0 +1,7 @@ +val a = + """""" +//----- +val a = + """ + + """.trimIndent() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterSimpleMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterSimpleMargin.kt new file mode 100644 index 00000000000..9ea99a8f88f --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterSimpleMargin.kt @@ -0,0 +1,9 @@ +class A { + val a = """""" +} +//----- +class A { + val a = """ + + """.trimIndent() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextMargin.kt new file mode 100644 index 00000000000..2dced6524ea --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextMargin.kt @@ -0,0 +1,5 @@ +val a = """blah blah""" +//----- +val a = """blah blah + | +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextOnNewLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextOnNewLineMargin.kt new file mode 100644 index 00000000000..b55a7655a54 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextOnNewLineMargin.kt @@ -0,0 +1,7 @@ +val a = + """blah blah""" +//----- +val a = + """blah blah + | + """.trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/settings.txt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/settings.txt new file mode 100644 index 00000000000..209da5c146a --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/settings.txt @@ -0,0 +1,3 @@ +// SET_TRUE: USE_TAB_CHARACTER +// SET_INT: TAB_SIZE=2 +// SET_INT: INDENT_SIZE=2 diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/dontInsertTrimMarginCall.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/dontInsertTrimMarginCall.kt new file mode 100644 index 00000000000..9ed424e020e --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/dontInsertTrimMarginCall.kt @@ -0,0 +1,5 @@ +val a = """blah blah""".trimMargin() +//----- +val a = """blah blah + | +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInMethodCallMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInMethodCallMargin.kt new file mode 100644 index 00000000000..728889d967d --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInMethodCallMargin.kt @@ -0,0 +1,5 @@ +val a = """blah blah""".replace("\r", "") +//----- +val a = """blah blah + | +""".trimMargin().replace("\r", "") \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideBraces.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideBraces.kt new file mode 100644 index 00000000000..9df8976ffaf --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideBraces.kt @@ -0,0 +1,11 @@ +val a = + """ + | blah blah {} + """.trimMargin() +//----- +val a = + """ + | blah blah { + | + | } + """.trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideText.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideText.kt new file mode 100644 index 00000000000..eb5188149ca --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideText.kt @@ -0,0 +1,8 @@ +object A { + val a = """blah blah""" +} +//----- +object A { + val a = """blah + | blah""".trimMargin() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLSimpleMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLSimpleMargin.kt new file mode 100644 index 00000000000..946a40790fe --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLSimpleMargin.kt @@ -0,0 +1,14 @@ +val a = + """ + | blah blah blah + | blah blah blah + | blah blah blah + """ +//----- +val a = + """ + | blah blah blah + | blah blah blah + | blah blah blah + | + """ \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLStartOnSameLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLStartOnSameLineMargin.kt new file mode 100644 index 00000000000..b2e44c31601 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLStartOnSameLineMargin.kt @@ -0,0 +1,8 @@ +val a = """blah blah blah + | blah blah + """ +//----- +val a = """blah blah blah + | blah blah + | + """ \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterOnNewLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterOnNewLineMargin.kt new file mode 100644 index 00000000000..8e64c0c8b58 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterOnNewLineMargin.kt @@ -0,0 +1,7 @@ +val a = + """""" +//----- +val a = + """ + + """.trimIndent() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterSimpleMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterSimpleMargin.kt new file mode 100644 index 00000000000..9ea99a8f88f --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterSimpleMargin.kt @@ -0,0 +1,9 @@ +class A { + val a = """""" +} +//----- +class A { + val a = """ + + """.trimIndent() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTabsAfterMarginChar.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTabsAfterMarginChar.kt new file mode 100644 index 00000000000..944c95dcbab --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTabsAfterMarginChar.kt @@ -0,0 +1,16 @@ +fun some() { + val b = """ + |class Test() { + | fun test() { + |} + """.trimMargin() +} +//----- +fun some() { + val b = """ + |class Test() { + | fun test() { + | + |} + """.trimMargin() +} \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextMargin.kt new file mode 100644 index 00000000000..2dced6524ea --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextMargin.kt @@ -0,0 +1,5 @@ +val a = """blah blah""" +//----- +val a = """blah blah + | +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextOnNewLineMargin.kt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextOnNewLineMargin.kt new file mode 100644 index 00000000000..b55a7655a54 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextOnNewLineMargin.kt @@ -0,0 +1,7 @@ +val a = + """blah blah""" +//----- +val a = + """blah blah + | + """.trimMargin() \ No newline at end of file diff --git a/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/settings.txt b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/settings.txt new file mode 100644 index 00000000000..a8fc25e5912 --- /dev/null +++ b/idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/settings.txt @@ -0,0 +1,3 @@ +// SET_TRUE: USE_TAB_CHARACTER +// SET_INT: TAB_SIZE=4 +// SET_INT: INDENT_SIZE=4 diff --git a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java index 1feb8c66138..35fea186ca8 100644 --- a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java @@ -698,6 +698,39 @@ public class FormatterTestGenerated extends AbstractFormatterTest { doTest(fileName); } + @TestMetadata("idea/testData/formatter/constructor") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Constructor extends AbstractFormatterTest { + public void testAllFilesPresentInConstructor() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/formatter/constructor"), Pattern.compile("^([^\\.]+)\\.after\\.kt.*$"), TargetBackend.ANY, true); + } + + @TestMetadata("ParameterListChopAsNeeded.after.kt") + public void testParameterListChopAsNeeded() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/constructor/ParameterListChopAsNeeded.after.kt"); + doTest(fileName); + } + + @TestMetadata("ParameterListDoNotWrap.after.kt") + public void testParameterListDoNotWrap() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/constructor/ParameterListDoNotWrap.after.kt"); + doTest(fileName); + } + + @TestMetadata("ParameterListWrapAlways.after.kt") + public void testParameterListWrapAlways() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/constructor/ParameterListWrapAlways.after.kt"); + doTest(fileName); + } + + @TestMetadata("ParameterListWrapAsNeeded.after.kt") + public void testParameterListWrapAsNeeded() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/constructor/ParameterListWrapAsNeeded.after.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/formatter/fileAnnotations") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/AbstractMultiLineStringIndentTest.kt b/idea/tests/org/jetbrains/kotlin/idea/editor/AbstractMultiLineStringIndentTest.kt new file mode 100644 index 00000000000..5d69f665fed --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/AbstractMultiLineStringIndentTest.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.editor + +import com.intellij.openapi.util.io.FileUtil +import com.intellij.psi.codeStyle.CodeStyleSettingsManager +import com.intellij.testFramework.EditorTestUtil +import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.test.SettingsConfigurator +import java.io.File + +abstract class AbstractMultiLineStringIndentTest : KotlinLightCodeInsightFixtureTestCase() { + val FILE_SEPARATOR = "//-----" + + protected fun doTest(path: String) { + val testDir = File(path).parentFile + val settingsFile = File(testDir, "settings.txt") + + setupSettings(settingsFile) { + val multiFileText = FileUtil.loadFile(File(path), true) + + val beforeFile = multiFileText.substringBefore(FILE_SEPARATOR).trim() + val afterFile = multiFileText.substringAfter(FILE_SEPARATOR).trim() + + myFixture.configureByText(KotlinFileType.INSTANCE, beforeFile) + myFixture.type('\n') + + val caretModel = myFixture.editor.caretModel + val offset = caretModel.offset + val actualTextWithCaret = StringBuilder(myFixture.editor.document.text).insert(offset, EditorTestUtil.CARET_TAG).toString() + + if (afterFile != actualTextWithCaret) { + KotlinTestUtils.assertEqualsToFile(File(path), "$beforeFile\n$FILE_SEPARATOR\n$actualTextWithCaret") + } + } + } + + fun setupSettings(settingsFile: File, inverted: Boolean = false, action: () -> Unit) { + if (!settingsFile.exists()) { + // Don nothing with settings + action() + return + } + + val settingsFileText = FileUtil.loadFile(settingsFile, true) + try { + val indentOptions = CodeStyleSettingsManager.getInstance(project).currentSettings.getIndentOptions(KotlinFileType.INSTANCE) + val configurator = SettingsConfigurator(settingsFileText, indentOptions) + if (!inverted) { + configurator.configureSettings() + } + else { + configurator.configureInvertedSettings() + } + + action() + } + finally { + CodeStyleSettingsManager.getSettings(myFixture.project).clearCodeStyleSettings() + } + } + + override fun getProjectDescriptor() = JAVA_LATEST!! + override fun getTestDataPath(): String = "" +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/MultiLineStringIndentTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/editor/MultiLineStringIndentTestGenerated.java new file mode 100644 index 00000000000..5112ad5fc17 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/MultiLineStringIndentTestGenerated.java @@ -0,0 +1,404 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.editor; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/testData/editor/enterHandler/multilineString") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class MultiLineStringIndentTestGenerated extends AbstractMultiLineStringIndentTest { + public void testAllFilesPresentInMultilineString() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/editor/enterHandler/multilineString"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("idea/testData/editor/enterHandler/multilineString/spaces") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Spaces extends AbstractMultiLineStringIndentTest { + public void testAllFilesPresentInSpaces() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/editor/enterHandler/multilineString/spaces"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("dontAddMarginCharWhenMultilineWithoutMargins.kt") + public void testDontAddMarginCharWhenMultilineWithoutMargins() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginCharWhenMultilineWithoutMargins.kt"); + doTest(fileName); + } + + @TestMetadata("dontAddMarginWhenItIsUnused.kt") + public void testDontAddMarginWhenItIsUnused() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnused.kt"); + doTest(fileName); + } + + @TestMetadata("dontAddMarginWhenItIsUnusedWithEmptyPrevious.kt") + public void testDontAddMarginWhenItIsUnusedWithEmptyPrevious() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontAddMarginWhenItIsUnusedWithEmptyPrevious.kt"); + doTest(fileName); + } + + @TestMetadata("dontAddTrimCallWhenAlreadyMultiline.kt") + public void testDontAddTrimCallWhenAlreadyMultiline() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultiline.kt"); + doTest(fileName); + } + + @TestMetadata("dontAddTrimCallWhenAlreadyMultilineFirstLine.kt") + public void testDontAddTrimCallWhenAlreadyMultilineFirstLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontAddTrimCallWhenAlreadyMultilineFirstLine.kt"); + doTest(fileName); + } + + @TestMetadata("dontInsertTrimMargin1.kt") + public void testDontInsertTrimMargin1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin1.kt"); + doTest(fileName); + } + + @TestMetadata("dontInsertTrimMargin2.kt") + public void testDontInsertTrimMargin2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin2.kt"); + doTest(fileName); + } + + @TestMetadata("dontInsertTrimMargin3.kt") + public void testDontInsertTrimMargin3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin3.kt"); + doTest(fileName); + } + + @TestMetadata("dontInsertTrimMargin4.kt") + public void testDontInsertTrimMargin4() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/dontInsertTrimMargin4.kt"); + doTest(fileName); + } + + @TestMetadata("enterBeforeMarginChar.kt") + public void testEnterBeforeMarginChar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterBeforeMarginChar.kt"); + doTest(fileName); + } + + @TestMetadata("enterInInfixMargin.kt") + public void testEnterInInfixMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInInfixMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterInLineWithMarginOnNotMargedLine.kt") + public void testEnterInLineWithMarginOnNotMargedLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInLineWithMarginOnNotMargedLine.kt"); + doTest(fileName); + } + + @TestMetadata("enterInMethodCallMargin.kt") + public void testEnterInMethodCallMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInMethodCallMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterInOneLineAfterSpaces.kt") + public void testEnterInOneLineAfterSpaces() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInOneLineAfterSpaces.kt"); + doTest(fileName); + } + + @TestMetadata("enterInTwoLinesNoMarginCall.kt") + public void testEnterInTwoLinesNoMarginCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInTwoLinesNoMarginCall.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideBraces.kt") + public void testEnterInsideBraces() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideBraces1.kt") + public void testEnterInsideBraces1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces1.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideBraces2.kt") + public void testEnterInsideBraces2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInsideBraces2.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideTextMargin.kt") + public void testEnterInsideTextMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterInsideTextMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterMLSimpleMargin.kt") + public void testEnterMLSimpleMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterMLSimpleMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterMLStartOnSameLineMargin.kt") + public void testEnterMLStartOnSameLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterMLStartOnSameLineMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterOnFirstLineWithPresentTrimMargin.kt") + public void testEnterOnFirstLineWithPresentTrimMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterOnFirstLineWithPresentTrimMarginAndLine.kt") + public void testEnterOnFirstLineWithPresentTrimMarginAndLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstLineWithPresentTrimMarginAndLine.kt"); + doTest(fileName); + } + + @TestMetadata("enterOnFirstNonEmptyLineWithPresentTrimMargin.kt") + public void testEnterOnFirstNonEmptyLineWithPresentTrimMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterOnFirstNonEmptyLineWithPresentTrimMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterOnNewLine.kt") + public void testEnterOnNewLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterOnNewLine.kt"); + doTest(fileName); + } + + @TestMetadata("enterSimple.kt") + public void testEnterSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterSimple.kt"); + doTest(fileName); + } + + @TestMetadata("enterWithTextMargin.kt") + public void testEnterWithTextMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterWithTextOnNewLineMargin.kt") + public void testEnterWithTextOnNewLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/enterWithTextOnNewLineMargin.kt"); + doTest(fileName); + } + + @TestMetadata("insertCustomMargin.kt") + public void testInsertCustomMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMargin.kt"); + doTest(fileName); + } + + @TestMetadata("insertCustomMarginInLineStart.kt") + public void testInsertCustomMarginInLineStart() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/insertCustomMarginInLineStart.kt"); + doTest(fileName); + } + + @TestMetadata("insertDefaultMargin.kt") + public void testInsertDefaultMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/insertDefaultMargin.kt"); + doTest(fileName); + } + + @TestMetadata("noTrimIndentInAnnotations.kt") + public void testNoTrimIndentInAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/noTrimIndentInAnnotations.kt"); + doTest(fileName); + } + + @TestMetadata("restoreIndentFromEmptyLine.kt") + public void testRestoreIndentFromEmptyLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/spaces/restoreIndentFromEmptyLine.kt"); + doTest(fileName); + } + } + + @TestMetadata("idea/testData/editor/enterHandler/multilineString/withTabs") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class WithTabs extends AbstractMultiLineStringIndentTest { + public void testAllFilesPresentInWithTabs() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/editor/enterHandler/multilineString/withTabs"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Tabs2 extends AbstractMultiLineStringIndentTest { + public void testAllFilesPresentInTabs2() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("dontInsertTrimMarginCall.kt") + public void testDontInsertTrimMarginCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/dontInsertTrimMarginCall.kt"); + doTest(fileName); + } + + @TestMetadata("enterInMethodCallMargin.kt") + public void testEnterInMethodCallMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInMethodCallMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterInTwoLinesNoMarginCall.kt") + public void testEnterInTwoLinesNoMarginCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInTwoLinesNoMarginCall.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideBraces.kt") + public void testEnterInsideBraces() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideBraces.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideText.kt") + public void testEnterInsideText() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterInsideText.kt"); + doTest(fileName); + } + + @TestMetadata("enterMLSimpleMargin.kt") + public void testEnterMLSimpleMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLSimpleMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterMLStartOnSameLineMargin.kt") + public void testEnterMLStartOnSameLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterMLStartOnSameLineMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterOnNewLineMargin.kt") + public void testEnterOnNewLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterOnNewLineMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterSimpleMargin.kt") + public void testEnterSimpleMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterSimpleMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterWithTextMargin.kt") + public void testEnterWithTextMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterWithTextOnNewLineMargin.kt") + public void testEnterWithTextOnNewLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs2/enterWithTextOnNewLineMargin.kt"); + doTest(fileName); + } + } + + @TestMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Tabs4 extends AbstractMultiLineStringIndentTest { + public void testAllFilesPresentInTabs4() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("dontInsertTrimMarginCall.kt") + public void testDontInsertTrimMarginCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/dontInsertTrimMarginCall.kt"); + doTest(fileName); + } + + @TestMetadata("enterInMethodCallMargin.kt") + public void testEnterInMethodCallMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInMethodCallMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideBraces.kt") + public void testEnterInsideBraces() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideBraces.kt"); + doTest(fileName); + } + + @TestMetadata("enterInsideText.kt") + public void testEnterInsideText() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterInsideText.kt"); + doTest(fileName); + } + + @TestMetadata("enterMLSimpleMargin.kt") + public void testEnterMLSimpleMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLSimpleMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterMLStartOnSameLineMargin.kt") + public void testEnterMLStartOnSameLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterMLStartOnSameLineMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterOnNewLineMargin.kt") + public void testEnterOnNewLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterOnNewLineMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterSimpleMargin.kt") + public void testEnterSimpleMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterSimpleMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterWithTabsAfterMarginChar.kt") + public void testEnterWithTabsAfterMarginChar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTabsAfterMarginChar.kt"); + doTest(fileName); + } + + @TestMetadata("enterWithTextMargin.kt") + public void testEnterWithTextMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextMargin.kt"); + doTest(fileName); + } + + @TestMetadata("enterWithTextOnNewLineMargin.kt") + public void testEnterWithTextOnNewLineMargin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/enterHandler/multilineString/withTabs/tabs4/enterWithTextOnNewLineMargin.kt"); + doTest(fileName); + } + } + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/TypedHandlerTest.kt b/idea/tests/org/jetbrains/kotlin/idea/editor/TypedHandlerTest.kt index 92bd30b81a5..66b20a731e4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/editor/TypedHandlerTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/TypedHandlerTest.kt @@ -384,12 +384,6 @@ class TypedHandlerTest : LightCodeInsightTestCase() { " \"bar\").length()" ) - fun testSplitStringByEnter_TripleQuotedString(): Unit = doCharTypeTest( - '\n', - "val l = \"\"\"foobar\"\"\"", - "val l = \"\"\"foo\nbar\"\"\"" - ) - fun testTypeLtInFunDeclaration() { doLtGtTest("fun ") }