@@ -12,14 +12,18 @@ import com.saveourtool.diktat.ruleset.utils.prevSibling
12
12
import org.jetbrains.kotlin.KtNodeTypes
13
13
import org.jetbrains.kotlin.KtNodeTypes.BLOCK
14
14
import org.jetbrains.kotlin.KtNodeTypes.CALL_EXPRESSION
15
+ import org.jetbrains.kotlin.KtNodeTypes.ELSE
15
16
import org.jetbrains.kotlin.KtNodeTypes.IF
16
17
import org.jetbrains.kotlin.KtNodeTypes.REFERENCE_EXPRESSION
17
18
import org.jetbrains.kotlin.KtNodeTypes.SAFE_ACCESS_EXPRESSION
19
+ import org.jetbrains.kotlin.KtNodeTypes.THEN
18
20
import org.jetbrains.kotlin.KtNodeTypes.WHEN
21
+ import org.jetbrains.kotlin.com.intellij.lang.ASTFactory
19
22
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
20
23
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.CompositeElement
21
24
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement
22
25
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl
26
+ import org.jetbrains.kotlin.com.intellij.psi.tree.IElementType
23
27
import org.jetbrains.kotlin.lexer.KtTokens.DO_KEYWORD
24
28
import org.jetbrains.kotlin.lexer.KtTokens.ELSE_KEYWORD
25
29
import org.jetbrains.kotlin.lexer.KtTokens.IF_KEYWORD
@@ -81,14 +85,14 @@ class BracesInConditionalsAndLoopsRule(configRules: List<RulesConfig>) : DiktatR
81
85
NO_BRACES_IN_CONDITIONALS_AND_LOOPS .warnAndFix(configRules, emitWarn, isFixMode, " IF" ,
82
86
(thenNode?.prevSibling { it.elementType == IF_KEYWORD } ? : node).startOffset, node) {
83
87
thenNode?.run {
84
- (psi as KtElement ) .replaceWithBlock(indent)
88
+ this .replaceWithBlock(indent)
85
89
if (elseNode != null && elseKeyword != null ) {
86
90
node.replaceChild(elseKeyword.prevSibling.node, PsiWhiteSpaceImpl (" " ))
87
91
}
88
92
}
89
93
? : run {
90
94
val nodeAfterCondition = ifPsi.rightParenthesis!! .node.treeNext
91
- node.insertEmptyBlockBetweenChildren(nodeAfterCondition, nodeAfterCondition, indent)
95
+ node.insertEmptyBlockBetweenChildren(nodeAfterCondition, nodeAfterCondition, indent, THEN )
92
96
}
93
97
}
94
98
}
@@ -119,7 +123,7 @@ class BracesInConditionalsAndLoopsRule(configRules: List<RulesConfig>) : DiktatR
119
123
}
120
124
? : run {
121
125
// `else` can have empty body e.g. when there is a semicolon after: `else ;`
122
- node.insertEmptyBlockBetweenChildren(elseKeyword.node.treeNext, null , indent)
126
+ node.insertEmptyBlockBetweenChildren(elseKeyword.node.treeNext, null , indent, ELSE )
123
127
}
124
128
}
125
129
}
@@ -171,24 +175,43 @@ class BracesInConditionalsAndLoopsRule(configRules: List<RulesConfig>) : DiktatR
171
175
}
172
176
173
177
private fun KtElement.replaceWithBlock (indent : Int ) {
174
- this .astReplace( KtBlockExpression (
178
+ val ktBlockNode = KtBlockExpression (
175
179
" {\n ${" " .repeat(indent + INDENT_STEP )}$text \n ${" " .repeat(indent)} }"
176
- ))
180
+ )
181
+ this .astReplace(ktBlockNode)
182
+ }
183
+
184
+ private fun ASTNode.replaceWithBlock (indent : Int ) {
185
+ val blockNode = ASTFactory .composite(BLOCK )
186
+ this .treeParent.addChild(blockNode, this )
187
+ blockNode.addChild(ASTFactory .leaf(LBRACE , " {" ))
188
+ blockNode.addChild(ASTFactory .whitespace(" \n ${" " .repeat(indent + INDENT_STEP )} " ))
189
+ blockNode.addChild(this )
190
+ blockNode.addChild(ASTFactory .whitespace(" \n ${" " .repeat(indent)} " ))
191
+ blockNode.addChild(ASTFactory .leaf(RBRACE , " }" ))
177
192
}
178
193
179
194
private fun ASTNode.insertEmptyBlockBetweenChildren (
180
195
firstChild : ASTNode ,
181
196
secondChild : ASTNode ? ,
182
- indent : Int
197
+ indent : Int ,
198
+ elementType : IElementType ? = null,
183
199
) {
184
- val emptyBlock = CompositeElement (KtNodeTypes .BLOCK_CODE_FRAGMENT )
185
- addChild(emptyBlock, firstChild)
186
- addChild(PsiWhiteSpaceImpl (" " ), emptyBlock)
187
- emptyBlock.addChild(LeafPsiElement (LBRACE , " {" ))
188
- emptyBlock.addChild(PsiWhiteSpaceImpl (" \n ${" " .repeat(indent)} " ))
189
- emptyBlock.addChild(LeafPsiElement (RBRACE , " }" ))
200
+ val emptyBlock = ASTFactory .composite(BLOCK )
201
+ elementType?.let {
202
+ val anotherBlock = ASTFactory .composite(it)
203
+ addChild(anotherBlock, firstChild)
204
+ addChild(ASTFactory .whitespace(" " ), anotherBlock)
205
+ anotherBlock.addChild(emptyBlock)
206
+ } ? : run {
207
+ addChild(emptyBlock, firstChild)
208
+ addChild(ASTFactory .whitespace(" " ), emptyBlock)
209
+ }
210
+ emptyBlock.addChild(ASTFactory .leaf(LBRACE , " {" ))
211
+ emptyBlock.addChild(ASTFactory .whitespace(" \n ${" " .repeat(indent)} " ))
212
+ emptyBlock.addChild(ASTFactory .leaf(RBRACE , " }" ))
190
213
secondChild?.let {
191
- replaceChild(it, PsiWhiteSpaceImpl (" " ))
214
+ replaceChild(it, ASTFactory .whitespace (" " ))
192
215
}
193
216
}
194
217
companion object {
0 commit comments