blob: 67057e6ea47e5cf546e0a381d177b71c57ed6567 [file] [log] [blame]
package com.github.shyiko.ktlint.ruleset.standard
import com.github.shyiko.ktlint.core.KtLint
import com.github.shyiko.ktlint.core.Rule
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
class FinalNewlineRule : Rule("final-newline") {
override fun visit(
node: ASTNode,
autoCorrect: Boolean,
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
) {
if (node.elementType == KtStubElementTypes.FILE) {
val editorConfig = node.getUserData(KtLint.EDITOR_CONFIG_USER_DATA_KEY)!!
val insertFinalNewline = editorConfig.get("insert_final_newline")?.toBoolean() ?: return
val lastNode = node.lastChildNode
if (insertFinalNewline) {
if (lastNode !is PsiWhiteSpace || !lastNode.textContains('\n')) {
// (PsiTreeUtil.getDeepestLast(lastNode.psi).node ?: lastNode).startOffset
emit(0, "File must end with a newline (\\n)", true)
if (autoCorrect) {
node.addChild(PsiWhiteSpaceImpl("\n"), null)
}
}
} else {
if (lastNode is PsiWhiteSpace && lastNode.textContains('\n')) {
emit(lastNode.startOffset, "Redundant newline (\\n) at the end of file", true)
if (autoCorrect) {
lastNode.node.treeParent.removeChild(lastNode.node)
}
}
}
}
}
}