Strip trailing spaces on Save: do not strip trailing spaces inside raw String

#KT-13048 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-03-25 14:57:11 +09:00
committed by Alexander Podkhalyuzin
parent 9fc869397d
commit e082522cdf
5 changed files with 84 additions and 0 deletions
@@ -3371,5 +3371,6 @@
<postStartupActivity implementation="org.jetbrains.kotlin.idea.framework.TargetRetrieveActivity"/>
<stripTrailingSpacesFilterFactory implementation="org.jetbrains.kotlin.idea.editor.KotlinStripTrailingSpacesFilterFactory"/>
</extensions>
</idea-plugin>
@@ -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)
}
})
}
}
}
@@ -0,0 +1,4 @@
val s =<caret>"""
foo, foo
bar, bar
"""
@@ -0,0 +1,4 @@
val s = """
foo, foo
bar, bar
"""
@@ -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")
}
}