Skip to content

Commit 192d386

Browse files
committed
Implement utility class and revise the logic for generating parent-child relationships between blocks.
1 parent 48c9db9 commit 192d386

File tree

5 files changed

+158
-37
lines changed

5 files changed

+158
-37
lines changed

src/main/kotlin/org/domaframework/doma/intellij/formatter/block/SqlDataTypeBlock.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package org.domaframework.doma.intellij.formatter.block
1717

1818
import com.intellij.lang.ASTNode
1919
import com.intellij.psi.formatter.common.AbstractBlock
20-
import org.domaframework.doma.intellij.formatter.block.SqlBlock
2120
import org.domaframework.doma.intellij.formatter.block.group.keyword.create.SqlCreateTableColumnDefinitionRawGroupBlock
2221
import org.domaframework.doma.intellij.formatter.util.IndentType
2322
import org.domaframework.doma.intellij.formatter.util.SqlBlockFormattingContext

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

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,22 @@ package org.domaframework.doma.intellij.formatter.processor
1818
import org.domaframework.doma.intellij.common.util.TypeUtil.isExpectedClassType
1919
import org.domaframework.doma.intellij.formatter.block.SqlBlock
2020
import org.domaframework.doma.intellij.formatter.block.SqlCommaBlock
21+
import org.domaframework.doma.intellij.formatter.block.SqlRightPatternBlock
2122
import org.domaframework.doma.intellij.formatter.block.expr.SqlElConditionLoopCommentBlock
2223
import org.domaframework.doma.intellij.formatter.block.group.column.SqlColumnDefinitionRawGroupBlock
2324
import org.domaframework.doma.intellij.formatter.block.group.column.SqlColumnRawGroupBlock
2425
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlInlineGroupBlock
2526
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlInlineSecondGroupBlock
2627
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlKeywordGroupBlock
2728
import org.domaframework.doma.intellij.formatter.block.group.keyword.create.SqlCreateViewGroupBlock
28-
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlRightPatternBlock
29+
import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlUpdateQueryGroupBlock
30+
import org.domaframework.doma.intellij.formatter.block.group.keyword.with.SqlWithCommonTableGroupBlock
31+
import org.domaframework.doma.intellij.formatter.block.group.keyword.with.SqlWithQuerySubGroupBlock
2932
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlSubGroupBlock
3033
import org.domaframework.doma.intellij.formatter.builder.SqlBlockBuilder
3134
import org.domaframework.doma.intellij.formatter.util.IndentType
3235
import org.domaframework.doma.intellij.formatter.util.SqlKeywordUtil
36+
import org.domaframework.doma.intellij.formatter.util.UpdateClauseUtil
3337
import org.domaframework.doma.intellij.psi.SqlTypes
3438

3539
class SqlSetParentGroupProcessor(
@@ -44,12 +48,12 @@ class SqlSetParentGroupProcessor(
4448
* Sets the parent of the latest group block and registers itself as a child element.
4549
*/
4650
fun updateGroupBlockParentAndAddGroup(childBlock: SqlBlock) {
47-
val context =
51+
setParentGroups(
4852
SetParentContext(
4953
childBlock,
5054
blockBuilder,
51-
)
52-
setParentGroups(context) { history ->
55+
),
56+
) { history ->
5357
return@setParentGroups history.last()
5458
}
5559
}
@@ -207,7 +211,15 @@ class SqlSetParentGroupProcessor(
207211
if (isExpectedClassType(exceptionTypes, lastGroupBlock)) {
208212
blockBuilder.removeLastGroupTopNodeIndexHistory()
209213
}
210-
updateGroupBlockParentAndAddGroup(childBlock)
214+
setParentGroups(
215+
SetParentContext(
216+
childBlock,
217+
blockBuilder,
218+
),
219+
) { history ->
220+
return@setParentGroups history
221+
.lastOrNull { it.indent.indentLevel < childBlock.indent.indentLevel }
222+
}
211223
}
212224

213225
fun updateInlineSecondGroupBlockParentAndAddGroup(
@@ -294,10 +306,25 @@ class SqlSetParentGroupProcessor(
294306
if (childBlock.parentBlock is SqlSubGroupBlock) {
295307
(childBlock.parentBlock as SqlSubGroupBlock).endGroup()
296308
}
297-
blockBuilder.clearSubListGroupTopNodeIndexHistory(paramIndex)
309+
310+
if (blockBuilder.getGroupTopNodeIndexHistory()[paramIndex] is SqlWithQuerySubGroupBlock) {
311+
val withCommonBlockIndex =
312+
blockBuilder.getGroupTopNodeIndex { block ->
313+
block is SqlWithCommonTableGroupBlock
314+
}
315+
if (withCommonBlockIndex >= 0) {
316+
blockBuilder.clearSubListGroupTopNodeIndexHistory(withCommonBlockIndex)
317+
}
318+
} else {
319+
blockBuilder.clearSubListGroupTopNodeIndexHistory(paramIndex)
320+
}
298321
}
299322
}
300323

324+
fun updateSubGroupBlockParent(childBlock: SqlSubGroupBlock) {
325+
updateGroupBlockParentAndAddGroup(childBlock)
326+
}
327+
301328
/**
302329
* Determines its parent group and, if conditions are met, registers itself as a new group block in the list.
303330
*/

src/main/kotlin/org/domaframework/doma/intellij/formatter/util/NotQueryGroupUtil.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,14 @@
1616
package org.domaframework.doma.intellij.formatter.util
1717

1818
import com.intellij.lang.ASTNode
19+
import com.intellij.psi.util.PsiTreeUtil
20+
import com.intellij.psi.util.elementType
1921
import org.domaframework.doma.intellij.formatter.block.SqlBlock
22+
import org.domaframework.doma.intellij.formatter.block.group.keyword.condition.SqlConditionKeywordGroupBlock
23+
import org.domaframework.doma.intellij.formatter.block.group.keyword.condition.SqlConditionalExpressionGroupBlock
24+
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlFunctionParamBlock
2025
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlParallelListBlock
26+
import org.domaframework.doma.intellij.psi.SqlTypes
2127

2228
object NotQueryGroupUtil {
2329
fun getSubGroup(
@@ -31,6 +37,18 @@ object NotQueryGroupUtil {
3137
if (lastKeyword != null && lastKeyword.getNodeText().lowercase() == "in") {
3238
return SqlParallelListBlock(child, sqlBlockFormattingCtx)
3339
}
40+
41+
if (PsiTreeUtil.prevLeaf(child.psi)?.elementType == SqlTypes.WORD) {
42+
return SqlFunctionParamBlock(child, sqlBlockFormattingCtx)
43+
}
44+
45+
if (lastGroup is SqlConditionKeywordGroupBlock) {
46+
return SqlConditionalExpressionGroupBlock(
47+
child,
48+
sqlBlockFormattingCtx,
49+
)
50+
}
51+
3452
return null
3553
}
3654
}

src/main/kotlin/org/domaframework/doma/intellij/formatter/util/SqlBlockUtil.kt

Lines changed: 83 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,26 @@ import org.domaframework.doma.intellij.formatter.block.group.column.SqlColumnRaw
4242
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlInlineGroupBlock
4343
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlInlineSecondGroupBlock
4444
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlJoinGroupBlock
45+
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlJoinQueriesGroupBlock
4546
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlKeywordGroupBlock
47+
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlSecondKeywordBlock
48+
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlSecondOptionKeywordGroupBlock
49+
import org.domaframework.doma.intellij.formatter.block.group.keyword.SqlValuesGroupBlock
4650
import org.domaframework.doma.intellij.formatter.block.group.keyword.condition.SqlConditionKeywordGroupBlock
47-
import org.domaframework.doma.intellij.formatter.block.group.keyword.condition.SqlConditionalExpressionGroupBlock
4851
import org.domaframework.doma.intellij.formatter.block.group.keyword.create.SqlCreateKeywordGroupBlock
4952
import org.domaframework.doma.intellij.formatter.block.group.keyword.create.SqlCreateTableColumnDefinitionGroupBlock
5053
import org.domaframework.doma.intellij.formatter.block.group.keyword.create.SqlCreateTableColumnDefinitionRawGroupBlock
5154
import org.domaframework.doma.intellij.formatter.block.group.keyword.create.SqlCreateViewGroupBlock
5255
import org.domaframework.doma.intellij.formatter.block.group.keyword.insert.SqlInsertQueryGroupBlock
56+
import org.domaframework.doma.intellij.formatter.block.group.keyword.top.SqlDeleteQueryGroupBlock
5357
import org.domaframework.doma.intellij.formatter.block.group.keyword.top.SqlSelectQueryGroupBlock
5458
import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlUpdateQueryGroupBlock
5559
import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlUpdateSetGroupBlock
60+
import org.domaframework.doma.intellij.formatter.block.group.keyword.with.SqlWithCommonTableGroupBlock
61+
import org.domaframework.doma.intellij.formatter.block.group.keyword.with.SqlWithQueryGroupBlock
5662
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlDataTypeParamBlock
5763
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlFunctionParamBlock
64+
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlSubGroupBlock
5865
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlSubQueryGroupBlock
5966
import org.domaframework.doma.intellij.formatter.builder.SqlCustomSpacingBuilder
6067
import org.domaframework.doma.intellij.psi.SqlCustomElCommentExpr
@@ -168,6 +175,12 @@ class SqlBlockUtil(
168175

169176
IndentType.TOP -> {
170177
return when (keywordText) {
178+
"with" ->
179+
SqlWithQueryGroupBlock(
180+
child,
181+
sqlBlockFormattingCtx,
182+
)
183+
171184
"select" ->
172185
SqlSelectQueryGroupBlock(
173186
child,
@@ -198,6 +211,17 @@ class SqlBlockUtil(
198211
sqlBlockFormattingCtx,
199212
)
200213

214+
"delete" ->
215+
SqlDeleteQueryGroupBlock(
216+
child,
217+
sqlBlockFormattingCtx,
218+
)
219+
"union", "intersect", "except" ->
220+
SqlJoinQueriesGroupBlock(
221+
child,
222+
sqlBlockFormattingCtx,
223+
)
224+
201225
else ->
202226
SqlKeywordGroupBlock(
203227
child,
@@ -208,17 +232,39 @@ class SqlBlockUtil(
208232
}
209233

210234
IndentType.SECOND -> {
211-
return if (keywordText == "set") {
212-
SqlUpdateSetGroupBlock(
213-
child,
214-
sqlBlockFormattingCtx,
215-
)
216-
} else {
217-
SqlKeywordGroupBlock(
218-
child,
219-
indentLevel,
220-
sqlBlockFormattingCtx,
221-
)
235+
return when (keywordText) {
236+
"set" -> {
237+
if (lastGroupBlock is SqlUpdateQueryGroupBlock) {
238+
SqlUpdateSetGroupBlock(
239+
child,
240+
sqlBlockFormattingCtx,
241+
)
242+
} else {
243+
WithClauseUtil
244+
.getWithClauseKeywordGroup(lastGroupBlock, child, sqlBlockFormattingCtx)
245+
?.let { return it }
246+
return SqlSecondKeywordBlock(
247+
child,
248+
sqlBlockFormattingCtx,
249+
)
250+
}
251+
}
252+
253+
"values" ->
254+
SqlValuesGroupBlock(
255+
child,
256+
sqlBlockFormattingCtx,
257+
)
258+
259+
else -> {
260+
WithClauseUtil
261+
.getWithClauseKeywordGroup(lastGroupBlock, child, sqlBlockFormattingCtx)
262+
?.let { return it }
263+
SqlSecondKeywordBlock(
264+
child,
265+
sqlBlockFormattingCtx,
266+
)
267+
}
222268
}
223269
}
224270

@@ -234,9 +280,8 @@ class SqlBlockUtil(
234280
sqlBlockFormattingCtx,
235281
)
236282
} else {
237-
SqlKeywordGroupBlock(
283+
SqlSecondOptionKeywordGroupBlock(
238284
child,
239-
indentLevel,
240285
sqlBlockFormattingCtx,
241286
)
242287
}
@@ -272,21 +317,16 @@ class SqlBlockUtil(
272317
lastGroup: SqlBlock?,
273318
child: ASTNode,
274319
): SqlBlock {
275-
if (PsiTreeUtil.prevLeaf(child.psi)?.elementType == SqlTypes.WORD) {
276-
return SqlFunctionParamBlock(child, sqlBlockFormattingCtx)
277-
}
278-
279320
when (lastGroup) {
280321
is SqlKeywordGroupBlock -> {
281-
// List-type test data for IN clause
282-
NotQueryGroupUtil
283-
.getSubGroup(lastGroup, child, sqlBlockFormattingCtx)
284-
?.let { return it }
285-
286322
CreateTableUtil
287323
.getCreateTableClauseSubGroup(lastGroup, child, sqlBlockFormattingCtx)
288324
?.let { return it }
289325

326+
WithClauseUtil
327+
.getWithClauseSubGroup(lastGroup, child, sqlBlockFormattingCtx)
328+
?.let { return it }
329+
290330
InsertClauseUtil
291331
.getInsertClauseSubGroup(lastGroup, child, sqlBlockFormattingCtx)
292332
?.let { return it }
@@ -298,21 +338,30 @@ class SqlBlockUtil(
298338
sqlBlockFormattingCtx,
299339
)?.let { return it }
300340

301-
if (lastGroup is SqlConditionKeywordGroupBlock) {
302-
return SqlConditionalExpressionGroupBlock(
303-
child,
304-
sqlBlockFormattingCtx,
305-
)
306-
}
341+
// List-type test data for IN clause
342+
NotQueryGroupUtil
343+
.getSubGroup(lastGroup, child, sqlBlockFormattingCtx)
344+
?.let { return it }
307345

308346
return SqlSubQueryGroupBlock(child, sqlBlockFormattingCtx)
309347
}
310348

311349
is SqlColumnDefinitionRawGroupBlock ->
312350
return SqlDataTypeParamBlock(child, sqlBlockFormattingCtx)
313351

314-
else ->
352+
else -> {
353+
if (lastGroup is SqlSubGroupBlock) {
354+
WithClauseUtil
355+
.getWithClauseSubGroup(lastGroup, child, sqlBlockFormattingCtx)
356+
?.let { return it }
357+
}
358+
359+
if (PsiTreeUtil.prevLeaf(child.psi)?.elementType == SqlTypes.WORD) {
360+
return SqlFunctionParamBlock(child, sqlBlockFormattingCtx)
361+
}
362+
315363
return SqlSubQueryGroupBlock(child, sqlBlockFormattingCtx)
364+
}
316365
}
317366
}
318367

@@ -333,6 +382,8 @@ class SqlBlockUtil(
333382
}
334383
}
335384

385+
is SqlWithCommonTableGroupBlock -> SqlWithCommonTableGroupBlock(child, sqlBlockFormattingCtx)
386+
336387
else -> SqlCommaBlock(child, sqlBlockFormattingCtx)
337388
}
338389
}
@@ -351,6 +402,8 @@ class SqlBlockUtil(
351402
)
352403
}
353404

405+
lastGroup is SqlWithQueryGroupBlock -> SqlWithCommonTableGroupBlock(child, sqlBlockFormattingCtx)
406+
354407
else -> SqlWordBlock(child, sqlBlockFormattingCtx)
355408
}
356409
}

src/main/kotlin/org/domaframework/doma/intellij/formatter/util/UpdateClauseUtil.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ package org.domaframework.doma.intellij.formatter.util
1717

1818
import com.intellij.lang.ASTNode
1919
import org.domaframework.doma.intellij.formatter.block.SqlBlock
20+
import org.domaframework.doma.intellij.formatter.block.conflict.SqlDoGroupBlock
2021
import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlUpdateColumnGroupBlock
22+
import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlUpdateQueryGroupBlock
2123
import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlUpdateSetGroupBlock
2224
import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlUpdateValueGroupBlock
2325
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlSubQueryGroupBlock
26+
import org.domaframework.doma.intellij.formatter.builder.SqlBlockBuilder
2427

2528
object UpdateClauseUtil {
2629
fun getUpdateClauseSubGroup(
@@ -39,4 +42,25 @@ object UpdateClauseUtil {
3942
} else {
4043
null
4144
}
45+
46+
fun getParentGroupBlock(
47+
blockBuilder: SqlBlockBuilder,
48+
childBlock: SqlUpdateQueryGroupBlock,
49+
): SqlBlock? {
50+
var parentBlock: SqlBlock? = null
51+
val topKeywordIndex =
52+
blockBuilder.getGroupTopNodeIndex { block ->
53+
block.indent.indentLevel == IndentType.TOP || block is SqlDoGroupBlock
54+
}
55+
if (topKeywordIndex >= 0) {
56+
val copyParentBlock =
57+
blockBuilder.getGroupTopNodeIndexHistory()[topKeywordIndex]
58+
parentBlock =
59+
copyParentBlock as? SqlDoGroupBlock ?: copyParentBlock.parentBlock
60+
if (copyParentBlock.indent.indentLevel == childBlock.indent.indentLevel) {
61+
blockBuilder.clearSubListGroupTopNodeIndexHistory(topKeywordIndex)
62+
}
63+
}
64+
return parentBlock
65+
}
4266
}

0 commit comments

Comments
 (0)