1515 */
1616package org.domaframework.doma.intellij.formatter.processor
1717
18- import com.intellij.openapi.project.Project
18+ import com.intellij.lang.injection.InjectedLanguageManager
1919import com.intellij.openapi.util.TextRange
2020import com.intellij.psi.PsiElement
2121import com.intellij.psi.PsiFile
22+ import com.intellij.psi.PsiLiteralExpression
2223import com.intellij.psi.codeStyle.CodeStyleSettings
2324import org.domaframework.doma.intellij.common.dao.getDaoClass
2425import org.domaframework.doma.intellij.common.isJavaOrKotlinFileType
26+ import org.domaframework.doma.intellij.common.isSupportFileType
2527import org.domaframework.doma.intellij.formatter.visitor.DaoInjectionSqlVisitor
2628
2729class SqlInjectionPostProcessor : SqlPostProcessor () {
@@ -35,17 +37,49 @@ class SqlInjectionPostProcessor : SqlPostProcessor() {
3537 rangeToReformat : TextRange ,
3638 settings : CodeStyleSettings ,
3739 ): TextRange {
38- if (! isJavaOrKotlinFileType(source) || getDaoClass(source) == null ) return rangeToReformat
40+ if (! shouldProcessFile(source)) {
41+ return rangeToReformat
42+ }
43+
44+ val manager = InjectedLanguageManager .getInstance(source.project)
45+ if (manager.isInjectedFragment(source)) {
46+ processInjectedFragment(source, manager)
47+ } else {
48+ processRegularFile(source)
49+ }
3950
40- processInjected(source)
4151 return rangeToReformat
4252 }
4353
44- private fun processInjected (element : PsiFile ) {
45- val project: Project = element.project
46- val visitor = DaoInjectionSqlVisitor (element, project)
47- element.accept(visitor)
48- visitor.processAll { text, skipFinalLineBreak ->
54+ private fun shouldProcessFile (source : PsiFile ): Boolean {
55+ val manager = InjectedLanguageManager .getInstance(source.project)
56+ val isInjectedSql = if (isSupportFileType(source)) manager.isInjectedFragment(source) else false
57+ val isDaoFile = isJavaOrKotlinFileType(source) && getDaoClass(source) != null
58+
59+ return isInjectedSql || isDaoFile
60+ }
61+
62+ private fun processInjectedFragment (
63+ source : PsiFile ,
64+ manager : InjectedLanguageManager ,
65+ ) {
66+ val host = manager.getInjectionHost(source) as ? PsiLiteralExpression ? : return
67+ val hostDaoFile = host.containingFile
68+ val originalText = host.value?.toString() ? : return
69+
70+ val visitor = DaoInjectionSqlVisitor (hostDaoFile, source.project)
71+ val formattingTask = DaoInjectionSqlVisitor .FormattingTask (host, originalText)
72+
73+ visitor.replaceHostStringLiteral(formattingTask) { text ->
74+ processDocumentText(text)
75+ }
76+ }
77+
78+ private fun processRegularFile (source : PsiFile ) {
79+ val visitor = DaoInjectionSqlVisitor (source, source.project)
80+ source.accept(visitor)
81+
82+ visitor.processAll { text ->
4983 processDocumentText(text)
5084 }
5185 }
0 commit comments