From e082522cdf17f8608a057455004a24f7fe16cf28 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Mon, 25 Mar 2019 14:57:11 +0900 Subject: [PATCH] Strip trailing spaces on Save: do not strip trailing spaces inside raw String #KT-13048 Fixed --- idea/resources/META-INF/plugin-common.xml | 1 + .../KotlinStripTrailingSpacesFilterFactory.kt | 34 +++++++++++++++ .../keepTrailingSpacesInRawString.kt | 4 ++ .../keepTrailingSpacesInRawString.kt.after | 4 ++ .../idea/editor/StripTrailingSpacesTest.kt | 41 +++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 idea/src/org/jetbrains/kotlin/idea/editor/KotlinStripTrailingSpacesFilterFactory.kt create mode 100644 idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt create mode 100644 idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt.after create mode 100644 idea/tests/org/jetbrains/kotlin/idea/editor/StripTrailingSpacesTest.kt diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index 68d3693014e..5bf2daa302f 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -3371,5 +3371,6 @@ + \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/editor/KotlinStripTrailingSpacesFilterFactory.kt b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinStripTrailingSpacesFilterFactory.kt new file mode 100644 index 00000000000..0fcc39d1ea9 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinStripTrailingSpacesFilterFactory.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.editor + +import com.intellij.lang.Language +import com.intellij.openapi.editor.Document +import com.intellij.openapi.editor.impl.PsiBasedStripTrailingSpacesFilter +import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.psi.KtStringTemplateExpression +import org.jetbrains.kotlin.psi.KtTreeVisitorVoid + +class KotlinStripTrailingSpacesFilterFactory : PsiBasedStripTrailingSpacesFilter.Factory() { + override fun isApplicableTo(language: Language): Boolean { + return language.`is`(KotlinLanguage.INSTANCE) + } + + override fun createFilter(document: Document): PsiBasedStripTrailingSpacesFilter { + return KotlinStripTrailingSpacesFilter(document) + } + + private class KotlinStripTrailingSpacesFilter(document: Document) : PsiBasedStripTrailingSpacesFilter(document) { + override fun process(psiFile: PsiFile) { + psiFile.accept(object : KtTreeVisitorVoid() { + override fun visitStringTemplateExpression(expression: KtStringTemplateExpression) { + disableRange(expression.textRange, false) + } + }) + } + } +} \ No newline at end of file diff --git a/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt new file mode 100644 index 00000000000..6e0ce257484 --- /dev/null +++ b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt @@ -0,0 +1,4 @@ +val s =""" + foo, foo + bar, bar +""" \ No newline at end of file diff --git a/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt.after b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt.after new file mode 100644 index 00000000000..ecd1524ecc6 --- /dev/null +++ b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt.after @@ -0,0 +1,4 @@ +val s = """ + foo, foo + bar, bar +""" \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/StripTrailingSpacesTest.kt b/idea/tests/org/jetbrains/kotlin/idea/editor/StripTrailingSpacesTest.kt new file mode 100644 index 00000000000..785e23c1472 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/StripTrailingSpacesTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.editor + +import com.intellij.openapi.editor.ex.EditorSettingsExternalizable +import com.intellij.openapi.fileEditor.FileDocumentManager +import com.intellij.psi.PsiDocumentManager +import com.intellij.testFramework.EditorTestUtil +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.PluginTestCaseBase + +class StripTrailingSpacesTest : LightCodeInsightFixtureTestCase() { + override fun getTestDataPath(): String { + return PluginTestCaseBase.getTestDataPathBase() + "/editor/stripTrailingSpaces/" + } + + fun testKeepTrailingSpacesInRawString() { + doTest() + } + + fun doTest() { + myFixture.configureByFile("${getTestName(true)}.kt") + + val editorSettings = EditorSettingsExternalizable.getInstance() + val stripSpaces = editorSettings.stripTrailingSpaces + try { + editorSettings.stripTrailingSpaces = EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE + val doc = myFixture.editor.document + EditorTestUtil.performTypingAction(editor, ' ') + PsiDocumentManager.getInstance(project).commitDocument(doc) + FileDocumentManager.getInstance().saveDocument(doc) + } finally { + editorSettings.stripTrailingSpaces = stripSpaces + } + + myFixture.checkResultByFile("${getTestName(true)}.kt.after") + } +}