Extraction Engine: When extracting to enum class body, place new declaration after the last entry

#KT-9629 Fixed
This commit is contained in:
Alexey Sedunov
2015-10-20 19:09:27 +03:00
committed by Alexey Sedunov
parent 40f2a983cc
commit 3fd6864461
7 changed files with 67 additions and 11 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes.*
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
import java.util.*
class KtClassBody : KtElementImplStub<KotlinPlaceHolderStub<KtClassBody>>, KtDeclarationContainer {
@@ -57,4 +58,22 @@ class KtClassBody : KtElementImplStub<KotlinPlaceHolderStub<KtClassBody>>, KtDec
*/
val danglingAnnotations: List<KtAnnotationEntry>
get() = getStubOrPsiChildrenAsList(MODIFIER_LIST).flatMap { it.annotationEntries }
private fun addEnumEntriesTerminator() {
val klass = parent as? KtClass ?: return
if (!klass.isEnum()) return
val lastEntry = klass.declarations.lastIsInstanceOrNull<KtEnumEntry>()
if (KtPsiUtil.skipTrailingWhitespacesAndComments(lastEntry ?: firstChild)?.node?.elementType == KtTokens.SEMICOLON) return
super.addAfter(KtPsiFactory(this).createSemicolon(), lastEntry)
}
override fun addAfter(element: PsiElement, anchor: PsiElement?): PsiElement? {
return super.addAfter(element, anchor)
.apply {
if (element !is KtEnumEntry) {
addEnumEntriesTerminator()
}
}
}
}