Skip to content

Commit 2f48acd

Browse files
committed
Create an abstract class to share trailing whitespace removal logic in the PostProcessor for both regular SQL files and injected SQL.
1 parent 5089291 commit 2f48acd

File tree

4 files changed

+87
-48
lines changed

4 files changed

+87
-48
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* Copyright Doma Tools Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.domaframework.doma.intellij.formatter.processor
17+
18+
import com.intellij.lang.injection.InjectedLanguageManager
19+
import com.intellij.openapi.application.ApplicationManager
20+
import com.intellij.openapi.command.WriteCommandAction
21+
import com.intellij.openapi.editor.Document
22+
import com.intellij.openapi.project.Project
23+
import com.intellij.openapi.util.TextRange
24+
import com.intellij.psi.PsiDocumentManager
25+
import com.intellij.psi.PsiElement
26+
import com.intellij.psi.PsiFile
27+
import com.intellij.psi.codeStyle.CodeStyleSettings
28+
import org.domaframework.doma.intellij.setting.SqlLanguage
29+
30+
class SqlFormatPostProcessor : SqlPostProcessor() {
31+
override fun processElement(
32+
source: PsiElement,
33+
settings: CodeStyleSettings,
34+
): PsiElement = source
35+
36+
override fun processText(
37+
source: PsiFile,
38+
rangeToReformat: TextRange,
39+
settings: CodeStyleSettings,
40+
): TextRange {
41+
if (!isSqlFile(source) || isInjectedSqlFile(source)) {
42+
return rangeToReformat
43+
}
44+
45+
val document = getDocument(source) ?: return rangeToReformat
46+
val processedText = processDocumentText(document.text, true)
47+
48+
if (document.text == processedText) {
49+
return rangeToReformat
50+
}
51+
52+
updateDocument(source.project, document, processedText)
53+
return TextRange(0, processedText.length)
54+
}
55+
56+
private fun isSqlFile(source: PsiFile): Boolean = source.language == SqlLanguage.INSTANCE
57+
58+
private fun isInjectedSqlFile(source: PsiFile): Boolean {
59+
val injectedLanguageManager = InjectedLanguageManager.getInstance(source.project)
60+
return injectedLanguageManager.isInjectedFragment(source)
61+
}
62+
63+
private fun getDocument(source: PsiFile) = PsiDocumentManager.getInstance(source.project).getDocument(source)
64+
65+
private fun updateDocument(
66+
project: Project,
67+
document: Document,
68+
newText: String,
69+
) {
70+
ApplicationManager.getApplication().invokeAndWait {
71+
WriteCommandAction.runWriteCommandAction(project) {
72+
document.setText(newText)
73+
PsiDocumentManager.getInstance(project).commitDocument(document)
74+
}
75+
}
76+
}
77+
}

src/main/kotlin/org/domaframework/doma/intellij/formatter/processor/SqlInjectionPostProcessor.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ import com.intellij.openapi.util.TextRange
2020
import com.intellij.psi.PsiElement
2121
import com.intellij.psi.PsiFile
2222
import com.intellij.psi.codeStyle.CodeStyleSettings
23-
import com.intellij.psi.impl.source.codeStyle.PostFormatProcessor
2423
import org.domaframework.doma.intellij.common.dao.getDaoClass
2524
import org.domaframework.doma.intellij.common.isJavaOrKotlinFileType
2625
import org.domaframework.doma.intellij.formatter.visitor.DaoInjectionSqlVisitor
2726

28-
class SqlInjectionPostProcessor : PostFormatProcessor {
27+
class SqlInjectionPostProcessor : SqlPostProcessor() {
2928
override fun processElement(
3029
element: PsiElement,
3130
settings: CodeStyleSettings,
@@ -46,6 +45,8 @@ class SqlInjectionPostProcessor : PostFormatProcessor {
4645
val project: Project = element.project
4746
val visitor = DaoInjectionSqlVisitor(element, project)
4847
element.accept(visitor)
49-
visitor.processAll()
48+
visitor.processAll { text, skipFinalLineBreak ->
49+
processDocumentText(text, skipFinalLineBreak)
50+
}
5051
}
5152
}

src/main/kotlin/org/domaframework/doma/intellij/formatter/processor/SqlPostProcessor.kt

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,58 +15,32 @@
1515
*/
1616
package org.domaframework.doma.intellij.formatter.processor
1717

18-
import com.intellij.openapi.application.ApplicationManager
19-
import com.intellij.openapi.command.WriteCommandAction
20-
import com.intellij.openapi.editor.Document
21-
import com.intellij.openapi.project.Project
2218
import com.intellij.openapi.util.TextRange
23-
import com.intellij.psi.PsiDocumentManager
2419
import com.intellij.psi.PsiElement
2520
import com.intellij.psi.PsiFile
2621
import com.intellij.psi.codeStyle.CodeStyleSettings
2722
import com.intellij.psi.impl.source.codeStyle.PostFormatProcessor
28-
import org.domaframework.doma.intellij.common.util.InjectionSqlUtil.isInjectedSqlFile
2923
import org.domaframework.doma.intellij.common.util.StringUtil
30-
import org.domaframework.doma.intellij.setting.SqlLanguage
3124

32-
class SqlPostProcessor : PostFormatProcessor {
25+
abstract class SqlPostProcessor : PostFormatProcessor {
3326
companion object {
3427
private const val FILE_END_PADDING = " ${StringUtil.LINE_SEPARATE}"
3528
}
3629

3730
private val trailingSpacesRegex = Regex(" +(\r?\n)")
3831

3932
override fun processElement(
40-
source: PsiElement,
33+
element: PsiElement,
4134
settings: CodeStyleSettings,
42-
): PsiElement = source
35+
): PsiElement = element
4336

4437
override fun processText(
4538
source: PsiFile,
4639
rangeToReformat: TextRange,
4740
settings: CodeStyleSettings,
48-
): TextRange {
49-
if (!isSqlFile(source) || isInjectedSqlFile(source)) {
50-
return rangeToReformat
51-
}
41+
): TextRange = rangeToReformat
5242

53-
val originalDocument = getDocument(source)
54-
val document = originalDocument ?: source.fileDocument
55-
val processedText = processDocumentText(document.text, originalDocument != null)
56-
57-
if (document.text == processedText) {
58-
return rangeToReformat
59-
}
60-
61-
updateDocument(source.project, document, processedText)
62-
return TextRange(0, processedText.length)
63-
}
64-
65-
private fun isSqlFile(source: PsiFile): Boolean = source.language == SqlLanguage.INSTANCE
66-
67-
private fun getDocument(source: PsiFile) = PsiDocumentManager.getInstance(source.project).getDocument(source)
68-
69-
private fun processDocumentText(
43+
protected fun processDocumentText(
7044
originalText: String,
7145
existsOriginalDocument: Boolean,
7246
): String {
@@ -82,17 +56,4 @@ class SqlPostProcessor : PostFormatProcessor {
8256
): String =
8357
text.trimEnd() +
8458
if (isEndSpace) FILE_END_PADDING else ""
85-
86-
private fun updateDocument(
87-
project: Project,
88-
document: Document,
89-
newText: String,
90-
) {
91-
ApplicationManager.getApplication().invokeAndWait {
92-
WriteCommandAction.runWriteCommandAction(project) {
93-
document.setText(newText)
94-
PsiDocumentManager.getInstance(project).commitDocument(document)
95-
}
96-
}
97-
}
9859
}

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
<lang.formatter language="DomaSql"
6767
implementationClass="org.domaframework.doma.intellij.formatter.builder.SqlFormattingModelBuilder"/>
6868
<preFormatProcessor implementation="org.domaframework.doma.intellij.formatter.processor.SqlFormatPreProcessor" />
69-
<postFormatProcessor implementation="org.domaframework.doma.intellij.formatter.processor.SqlPostProcessor" />
69+
<postFormatProcessor implementation="org.domaframework.doma.intellij.formatter.processor.SqlFormatPostProcessor" />
7070
<postFormatProcessor implementation="org.domaframework.doma.intellij.formatter.processor.SqlInjectionPostProcessor" />
7171

7272
<!-- CustomLanguage -->

0 commit comments

Comments
 (0)