Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,19 @@ open class SqlBlock(
(parent.parentBlock is SqlNewGroupBlock || parent.parentBlock is SqlElConditionLoopCommentBlock)
} == true

protected fun isElementAfterConditionLoopEnd(): Boolean =
(
protected fun isElementAfterConditionLoopEnd(): Boolean {
val prevChildren =
prevBlocks
.lastOrNull()
.firstOrNull()
?.childBlocks
?.firstOrNull() as? SqlElConditionLoopCommentBlock
)?.conditionEnd != null

val firstConditionBlock = (prevChildren?.firstOrNull() as? SqlElConditionLoopCommentBlock)
val endBlock = firstConditionBlock?.conditionEnd
if (endBlock == null) return false
val lastBlock = prevChildren.lastOrNull()

return endBlock.node.startOffset > (lastBlock?.node?.startOffset ?: 0)
}

protected fun isFirstChildConditionLoopDirective(): Boolean = childBlocks.firstOrNull() is SqlElConditionLoopCommentBlock

Expand Down Expand Up @@ -265,7 +271,7 @@ open class SqlBlock(
/**
* Creates a spacing builder specifically for directive block comments.
*/
protected fun createBlockDirectiveCommentSpacingBuilder(): SqlCustomSpacingBuilder =
protected open fun createBlockDirectiveCommentSpacingBuilder(): SqlCustomSpacingBuilder =
SqlCustomSpacingBuilder()
.withSpacing(
SqlTypes.BLOCK_COMMENT_START,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import org.domaframework.doma.intellij.formatter.block.comment.SqlDefaultComment
import org.domaframework.doma.intellij.formatter.block.comment.SqlElBlockCommentBlock
import org.domaframework.doma.intellij.formatter.block.comment.SqlElConditionLoopCommentBlock
import org.domaframework.doma.intellij.formatter.block.comment.SqlLineCommentBlock
import org.domaframework.doma.intellij.formatter.block.expr.SqlElAtSignBlock
import org.domaframework.doma.intellij.formatter.block.expr.SqlElSymbolBlock
import org.domaframework.doma.intellij.formatter.block.group.SqlNewGroupBlock
import org.domaframework.doma.intellij.formatter.block.group.column.SqlColumnBlock
Expand All @@ -47,13 +48,15 @@ import org.domaframework.doma.intellij.formatter.block.group.keyword.update.SqlU
import org.domaframework.doma.intellij.formatter.block.group.keyword.with.SqlWithColumnGroupBlock
import org.domaframework.doma.intellij.formatter.block.group.keyword.with.SqlWithCommonTableGroupBlock
import org.domaframework.doma.intellij.formatter.block.group.keyword.with.SqlWithQueryGroupBlock
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlArrayListGroupBlock
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlDataTypeParamBlock
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlFunctionParamBlock
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlSubGroupBlock
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlSubQueryGroupBlock
import org.domaframework.doma.intellij.formatter.block.other.SqlEscapeBlock
import org.domaframework.doma.intellij.formatter.block.other.SqlOtherBlock
import org.domaframework.doma.intellij.formatter.block.word.SqlAliasBlock
import org.domaframework.doma.intellij.formatter.block.word.SqlArrayWordBlock
import org.domaframework.doma.intellij.formatter.block.word.SqlFunctionGroupBlock
import org.domaframework.doma.intellij.formatter.block.word.SqlTableBlock
import org.domaframework.doma.intellij.formatter.block.word.SqlWordBlock
Expand Down Expand Up @@ -105,14 +108,14 @@ open class SqlFileBlock(
if (isLeaf) return mutableListOf()

var child = node.firstChildNode
var prevNonWhiteSpaceNode: ASTNode? = null
var prevNonWhiteSpaceNode: SqlBlock? = null
blockBuilder.addGroupTopNodeIndexHistory(this)
while (child != null) {
val lastBlock = blocks.lastOrNull()
val lastGroup = blockBuilder.getLastGroupTopNodeIndexHistory()
if (child !is PsiWhiteSpace) {
val childBlock = getBlock(child)
prevNonWhiteSpaceNode = child
val childBlock = getBlock(child, prevNonWhiteSpaceNode)
prevNonWhiteSpaceNode = childBlock
updateCommentParentAndIdent(childBlock)
updateBlockParentAndLAddGroup(childBlock)
updateWhiteSpaceInclude(lastBlock, childBlock, lastGroup)
Expand Down Expand Up @@ -140,7 +143,10 @@ open class SqlFileBlock(
/**
* Creates a block for the given child AST node.
*/
override fun getBlock(child: ASTNode): SqlBlock {
private fun getBlock(
child: ASTNode,
prevBlock: SqlBlock?,
): SqlBlock {
val defaultFormatCtx =
SqlBlockFormattingContext(
wrap,
Expand Down Expand Up @@ -181,10 +187,17 @@ open class SqlFileBlock(
} else {
val escapeStrings = listOf("\"", "`", "[", "]")
if (escapeStrings.contains(child.text)) {
SqlEscapeBlock(
child,
defaultFormatCtx,
)
if (child.text == "[" && prevBlock is SqlArrayWordBlock) {
SqlArrayListGroupBlock(
child,
defaultFormatCtx,
)
} else {
SqlEscapeBlock(
child,
defaultFormatCtx,
)
}
} else {
SqlOtherBlock(
child,
Expand Down Expand Up @@ -378,6 +391,25 @@ open class SqlFileBlock(
)
}

is SqlEscapeBlock -> {
val index =
if (lastGroupBlock is SqlArrayListGroupBlock) {
blockBuilder.getGroupTopNodeIndex {
it is SqlArrayListGroupBlock
}
} else {
-1
}
blockRelationBuilder.updateGroupBlockParentAndAddGroup(
childBlock,
)
if (lastGroupBlock is SqlArrayListGroupBlock) {
if (index >= 0) {
blockBuilder.clearSubListGroupTopNodeIndexHistory(index)
}
}
}

is SqlWordBlock, is SqlOtherBlock -> {
blockRelationBuilder.updateGroupBlockParentAndAddGroup(
childBlock,
Expand Down Expand Up @@ -461,6 +493,10 @@ open class SqlFileBlock(
)
}

if (childBlock1 is SqlArrayWordBlock && childBlock2 is SqlArrayListGroupBlock) {
return SqlCustomSpacingBuilder.nonSpacing
}

if (childBlock2 is SqlWithColumnGroupBlock) {
return SqlCustomSpacingBuilder.normalSpacing
}
Expand Down Expand Up @@ -494,6 +530,10 @@ open class SqlFileBlock(
SqlCustomSpacingBuilder().getSpacing(childBlock2)
}

is SqlArrayListGroupBlock -> {
SqlCustomSpacingBuilder.nonSpacing
}

else -> SqlCustomSpacingBuilder.normalSpacing
}
}
Expand All @@ -519,7 +559,7 @@ open class SqlFileBlock(
return SqlCustomSpacingBuilder().getSpacing(childBlock2)
}

if (childBlock2 is SqlOtherBlock) {
if (childBlock1 !is SqlElSymbolBlock && childBlock1 !is SqlOtherBlock && childBlock2 is SqlOtherBlock) {
return SqlCustomSpacingBuilder().getSpacing(childBlock2)
}

Expand Down Expand Up @@ -578,6 +618,16 @@ open class SqlFileBlock(
return SqlCustomSpacingBuilder.normalSpacing
}

if (childBlock1 is SqlElSymbolBlock && childBlock2 is SqlElSymbolBlock ||
childBlock1 is SqlElAtSignBlock && childBlock2 is SqlElSymbolBlock ||
childBlock1 is SqlOtherBlock && childBlock2 is SqlElSymbolBlock ||
childBlock1 is SqlElSymbolBlock && childBlock2 is SqlElAtSignBlock ||
childBlock1 is SqlOtherBlock && childBlock2 is SqlOtherBlock ||
childBlock1 is SqlElSymbolBlock && childBlock2 is SqlOtherBlock
) {
return SqlCustomSpacingBuilder.nonSpacing
}

val spacing: Spacing? = customSpacingBuilder?.getCustomSpacing(childBlock1, childBlock2)
return spacing ?: spacingBuilder.getSpacing(this, childBlock1, childBlock2)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Copyright Doma Tools Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.domaframework.doma.intellij.formatter.block.comma

import com.intellij.lang.ASTNode
import com.intellij.psi.formatter.common.AbstractBlock
import org.domaframework.doma.intellij.formatter.block.SqlBlock
import org.domaframework.doma.intellij.formatter.block.SqlCommaBlock
import org.domaframework.doma.intellij.formatter.block.comment.SqlElConditionLoopCommentBlock
import org.domaframework.doma.intellij.formatter.util.IndentType
import org.domaframework.doma.intellij.formatter.util.SqlBlockFormattingContext

class SqlArrayCommaBlock(
node: ASTNode,
context: SqlBlockFormattingContext,
) : SqlCommaBlock(
node,
context,
) {
override val indent =
ElementIndent(
IndentType.NONE,
0,
0,
)

override fun setParentGroupBlock(lastGroup: SqlBlock?) {
super.setParentGroupBlock(lastGroup)
indent.indentLevel = IndentType.NONE
indent.indentLen = createBlockIndentLen()
indent.groupIndentLen = createGroupIndentLen()
}

override fun buildChildren(): MutableList<AbstractBlock> = mutableListOf()

override fun createBlockIndentLen(): Int = 0

override fun createGroupIndentLen(): Int = indent.indentLen.plus(1)

override fun isSaveSpace(lastGroup: SqlBlock?): Boolean = parentBlock is SqlElConditionLoopCommentBlock
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@ package org.domaframework.doma.intellij.formatter.block.comment
import com.intellij.formatting.Block
import com.intellij.formatting.Spacing
import com.intellij.lang.ASTNode
import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.formatter.common.AbstractBlock
import com.intellij.psi.util.PsiTreeUtil
import org.domaframework.doma.intellij.common.util.StringUtil
import org.domaframework.doma.intellij.formatter.block.SqlBlock
import org.domaframework.doma.intellij.formatter.block.SqlUnknownBlock
import org.domaframework.doma.intellij.formatter.builder.SqlCustomSpacingBuilder
Expand All @@ -36,18 +33,7 @@ open class SqlBlockCommentBlock(
node,
context,
) {
override fun buildChildren(): MutableList<AbstractBlock> {
val blocks = mutableListOf<AbstractBlock>()
var child = node.firstChildNode
while (child != null) {
if (child !is PsiWhiteSpace) {
val block = getBlock(child)
blocks.add(block)
}
child = child.treeNext
}
return blocks
}
override fun buildChildren(): MutableList<AbstractBlock> = buildChildBlocks { getBlock(it) }

override fun getBlock(child: ASTNode): SqlBlock {
val elementType = child.elementType
Expand All @@ -59,8 +45,7 @@ open class SqlBlockCommentBlock(
}
}

override fun isSaveSpace(lastGroup: SqlBlock?): Boolean =
PsiTreeUtil.prevLeaf(node.psi)?.text?.contains(StringUtil.LINE_SEPARATE) == true
override fun isSaveSpace(lastGroup: SqlBlock?): Boolean = hasLineBreakBefore()

override fun getSpacing(
child1: Block?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
package org.domaframework.doma.intellij.formatter.block.comment

import com.intellij.lang.ASTNode
import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.formatter.common.AbstractBlock
import com.intellij.psi.util.PsiTreeUtil
import org.domaframework.doma.intellij.common.util.StringUtil
import org.domaframework.doma.intellij.formatter.block.SqlBlock
import org.domaframework.doma.intellij.formatter.block.group.subgroup.SqlSubGroupBlock
import org.domaframework.doma.intellij.formatter.util.IndentType
Expand All @@ -33,11 +36,16 @@ abstract class SqlCommentBlock(
context.enableFormat,
context.formatMode,
) {
companion object {
const val DEFAULT_INDENT = 0
const val SINGLE_INDENT = 1
}

override val indent =
ElementIndent(
IndentType.NONE,
0,
0,
DEFAULT_INDENT,
DEFAULT_INDENT,
)

override fun setParentGroupBlock(lastGroup: SqlBlock?) {
Expand All @@ -53,14 +61,29 @@ abstract class SqlCommentBlock(

override fun createBlockIndentLen(): Int {
parentBlock?.let { parent ->
if (parent.parentBlock !is SqlSubGroupBlock ||
parent.parentBlock?.childBlocks?.size != 1
) {
if (shouldInheritParentIndent(parent)) {
return parent.indent.indentLen
}
}
return 0
return DEFAULT_INDENT
}

override fun createGroupIndentLen(): Int = indent.indentLen

protected open fun shouldInheritParentIndent(parent: SqlBlock): Boolean =
parent.parentBlock !is SqlSubGroupBlock || parent.parentBlock?.childBlocks?.size != 1

fun hasLineBreakBefore(): Boolean = PsiTreeUtil.prevLeaf(node.psi)?.text?.contains(StringUtil.LINE_SEPARATE) == true

protected fun buildChildBlocks(blockProvider: (ASTNode) -> SqlBlock): MutableList<AbstractBlock> {
val blocks = mutableListOf<AbstractBlock>()
var child = node.firstChildNode
while (child != null) {
if (child !is PsiWhiteSpace) {
blocks.add(blockProvider(child))
}
child = child.treeNext
}
return blocks
}
}
Loading
Loading