@@ -21,14 +21,33 @@ import com.intellij.formatting.Spacing
2121import com.intellij.formatting.SpacingBuilder
2222import com.intellij.formatting.Wrap
2323import com.intellij.lang.ASTNode
24+ import com.intellij.psi.PsiElement
2425import com.intellij.psi.PsiWhiteSpace
2526import com.intellij.psi.formatter.common.AbstractBlock
27+ import com.intellij.psi.util.PsiTreeUtil
28+ import com.intellij.psi.util.elementType
29+ import org.domaframework.doma.intellij.formatter.IndentType
2630import org.domaframework.doma.intellij.formatter.SqlCustomSpacingBuilder
2731import org.domaframework.doma.intellij.formatter.block.SqlBlock
2832import org.domaframework.doma.intellij.formatter.block.SqlBlockCommentBlock
2933import org.domaframework.doma.intellij.formatter.block.SqlCommentBlock
34+ import org.domaframework.doma.intellij.formatter.block.SqlOperationBlock
35+ import org.domaframework.doma.intellij.formatter.block.SqlUnknownBlock
36+ import org.domaframework.doma.intellij.formatter.block.group.SqlSubQueryGroupBlock
37+ import org.domaframework.doma.intellij.psi.SqlElElseifDirective
38+ import org.domaframework.doma.intellij.psi.SqlElForDirective
39+ import org.domaframework.doma.intellij.psi.SqlElIfDirective
3040import org.domaframework.doma.intellij.psi.SqlTypes
3141
42+ enum class SqlDirectiveType {
43+ IF ,
44+ ELSEIF ,
45+ ELSE ,
46+ FOR ,
47+ END ,
48+ Variable ,
49+ }
50+
3251class SqlElBlockCommentBlock (
3352 node : ASTNode ,
3453 wrap : Wrap ? ,
@@ -41,13 +60,40 @@ class SqlElBlockCommentBlock(
4160 alignment,
4261 spacingBuilder,
4362 ) {
63+ var isConditionLoopBlock = getConditionOrLoopBlock(node)
64+
65+ override val indent =
66+ ElementIndent (
67+ IndentType .NONE ,
68+ 0 ,
69+ 0 ,
70+ )
71+
72+ override fun setParentGroupBlock (block : SqlBlock ? ) {
73+ super .setParentGroupBlock(block)
74+ indent.indentLevel = IndentType .NONE
75+ indent.indentLen = createIndentLen()
76+ indent.groupIndentLen = 0
77+ }
78+
4479 override fun buildChildren (): MutableList <AbstractBlock > {
4580 val blocks = mutableListOf<AbstractBlock >()
4681 var child = node.firstChildNode
4782 while (child != null ) {
4883 if (child !is PsiWhiteSpace ) {
4984 val block = getBlock(child)
5085 blocks.add(block)
86+ if (! isConditionLoopBlock &&
87+ (
88+ child.elementType == SqlTypes .EL_IF_DIRECTIVE ||
89+ child.elementType == SqlTypes .EL_FOR_DIRECTIVE ||
90+ child.elementType == SqlTypes .EL_ELSEIF_DIRECTIVE ||
91+ child.elementType == SqlTypes .EL_ELSE ||
92+ child.elementType == SqlTypes .EL_END
93+ )
94+ ) {
95+ isConditionLoopBlock = true
96+ }
5197 }
5298 child = child.treeNext
5399 }
@@ -56,8 +102,10 @@ class SqlElBlockCommentBlock(
56102
57103 override fun getBlock (child : ASTNode ): SqlBlock =
58104 when (child.elementType) {
59- // is SqlElGeExpr, is SqlElLeExpr, is SqlElGtExpr, is SqlElLtExpr, is SqlElEqExpr, is SqlElNeExpr ->
60- // SqlOperationBlock(child, wrap, alignment, spacingBuilder)
105+ SqlTypes .GE , SqlTypes .LE , SqlTypes .GT , SqlTypes .LT , SqlTypes .EL_EQ , SqlTypes .EL_NE ,
106+ SqlTypes .PLUS , SqlTypes .MINUS , SqlTypes .ASTERISK , SqlTypes .SLASH , SqlTypes .AT_SIGN ,
107+ ->
108+ SqlOperationBlock (child, wrap, alignment, spacingBuilder)
61109
62110 SqlTypes .EL_FIELD_ACCESS_EXPR ->
63111 SqlElFieldAccessBlock (
@@ -89,9 +137,50 @@ class SqlElBlockCommentBlock(
89137 SqlTypes .BLOCK_COMMENT_CONTENT ->
90138 SqlBlockCommentBlock (child, wrap, alignment, spacingBuilder)
91139
92- else -> SqlBlock (child, wrap, alignment, customSpacingBuilder , spacingBuilder)
140+ else -> SqlUnknownBlock (child, wrap, alignment, spacingBuilder)
93141 }
94142
143+ private fun getConditionOrLoopBlock (node : ASTNode ): Boolean {
144+ val directiveType =
145+ when {
146+ PsiTreeUtil .getChildOfType(node.psi, SqlElIfDirective ::class .java) != null -> {
147+ SqlDirectiveType .IF
148+ }
149+
150+ PsiTreeUtil .getChildOfType(node.psi, SqlElElseifDirective ::class .java) != null -> {
151+ SqlDirectiveType .ELSEIF
152+ }
153+
154+ PsiTreeUtil .getChildOfType(node.psi, SqlElForDirective ::class .java) != null -> {
155+ SqlDirectiveType .FOR
156+ }
157+
158+ PsiTreeUtil .getChildOfType(node.psi, SqlElElseifDirective ::class .java) != null -> {
159+ SqlDirectiveType .ELSE
160+ }
161+
162+ PsiTreeUtil .getChildOfType(node.psi, SqlElForDirective ::class .java) != null -> {
163+ SqlDirectiveType .END
164+ }
165+
166+ else -> {
167+ val children =
168+ PsiTreeUtil
169+ .getChildrenOfType(node.psi, PsiElement ::class .java)
170+ ?.firstOrNull { it.elementType == SqlTypes .EL_ELSE || it.elementType == SqlTypes .EL_END }
171+ children?.let {
172+ when (it.elementType) {
173+ SqlTypes .EL_ELSE -> SqlDirectiveType .ELSE
174+ SqlTypes .EL_END -> SqlDirectiveType .END
175+ else -> SqlDirectiveType .Variable
176+ }
177+ } ? : SqlDirectiveType .Variable
178+ }
179+ }
180+
181+ return directiveType != SqlDirectiveType .Variable
182+ }
183+
95184 private fun createFieldAccessSpacingBuilder (): SqlCustomSpacingBuilder =
96185 SqlCustomSpacingBuilder ()
97186 .withSpacing(
@@ -143,4 +232,19 @@ class SqlElBlockCommentBlock(
143232 )
144233
145234 override fun isLeaf (): Boolean = false
235+
236+ private fun createIndentLen (): Int {
237+ parentBlock?.let {
238+ if (it is SqlSubQueryGroupBlock ) {
239+ if (it.childBlocks.dropLast(1 ).isEmpty()) {
240+ return 1
241+ }
242+ if (it.isFirstLineComment) {
243+ return it.indent.groupIndentLen.minus(2 )
244+ }
245+ }
246+ return 1
247+ }
248+ return 1
249+ }
146250}
0 commit comments