/
FunctionReturnTypeSpacingRule.kt
63 lines (59 loc) · 2.44 KB
/
FunctionReturnTypeSpacingRule.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.pinterest.ktlint.ruleset.experimental
import com.pinterest.ktlint.core.Rule
import com.pinterest.ktlint.core.ast.ElementType.COLON
import com.pinterest.ktlint.core.ast.ElementType.FUN
import com.pinterest.ktlint.core.ast.ElementType.WHITE_SPACE
import com.pinterest.ktlint.core.ast.nextLeaf
import com.pinterest.ktlint.core.ast.prevLeaf
import com.pinterest.ktlint.core.ast.upsertWhitespaceAfterMe
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
public class FunctionReturnTypeSpacingRule : Rule("$experimentalRulesetId:function-return-type-spacing") {
override fun beforeVisitChildNodes(
node: ASTNode,
autoCorrect: Boolean,
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit,
) {
node.firstChildNode
node
.takeIf { node.elementType == FUN }
?.let { node.findChildByType(COLON) }
?.let { colonNode ->
removeWhiteSpaceBetweenClosingParenthesisAndColon(colonNode, emit, autoCorrect)
fixWhiteSpaceBetweenColonAndReturnType(colonNode, emit, autoCorrect)
}
}
private fun removeWhiteSpaceBetweenClosingParenthesisAndColon(
node: ASTNode,
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit,
autoCorrect: Boolean,
) {
require(node.elementType == COLON)
node
.prevLeaf()
?.takeIf { it.elementType == WHITE_SPACE }
?.let { whitespaceBeforeColonNode ->
emit(whitespaceBeforeColonNode.startOffset, "Unexpected whitespace", true)
if (autoCorrect) {
whitespaceBeforeColonNode.treeParent?.removeChild(whitespaceBeforeColonNode)
}
}
}
private fun fixWhiteSpaceBetweenColonAndReturnType(
node: ASTNode,
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit,
autoCorrect: Boolean,
) {
require(node.elementType == COLON)
node
.nextLeaf()
?.takeIf { it.elementType == WHITE_SPACE }
.let { whiteSpaceAfterColon ->
if (whiteSpaceAfterColon?.text != " ") {
emit(node.startOffset, "Single space expected between colon and return type", true)
if (autoCorrect) {
node.upsertWhitespaceAfterMe(" ")
}
}
}
}
}