Pull Members Up: Always insert spaces between keywords

#KT-10971 Fixed
This commit is contained in:
Alexey Sedunov
2016-02-09 14:04:35 +03:00
parent e1b4f45b35
commit 651b00c323
7 changed files with 38 additions and 16 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
import org.jetbrains.kotlin.kdoc.parser.KDocElementType
import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink
import org.jetbrains.kotlin.lexer.KotlinLexer
import org.jetbrains.kotlin.lexer.KtKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtWhenEntry
@@ -73,11 +74,16 @@ class KotlinParserDefinition : ParserDefinition {
override fun spaceExistanceTypeBetweenTokens(left: ASTNode, right: ASTNode): ParserDefinition.SpaceRequirements {
val rightTokenType = right.elementType
// get/set from a new line
if (rightTokenType == KtTokens.GET_KEYWORD || rightTokenType == KtTokens.SET_KEYWORD) {
return MUST_LINE_BREAK
}
val leftTokenType = left.elementType
if (leftTokenType is KtKeywordToken && rightTokenType is KtKeywordToken) return MUST
// When entry from a new line
val rightWhenEntry = right.psi.getNonStrictParentOfType<KtWhenEntry>()
if (rightWhenEntry != null) {
@@ -86,6 +92,7 @@ class KotlinParserDefinition : ParserDefinition {
return MUST_LINE_BREAK
}
}
// Default
return MAY
}
@@ -272,7 +272,7 @@ class KotlinPullUpHelper(
private fun liftToProtected(declaration: KtNamedDeclaration, ignoreUsages: Boolean = false) {
if (!declaration.hasModifier(KtTokens.PRIVATE_KEYWORD)) return
if (ignoreUsages || willBeUsedInSourceClass(declaration)) declaration.addModifierWithSpace(KtTokens.PROTECTED_KEYWORD)
if (ignoreUsages || willBeUsedInSourceClass(declaration)) declaration.addModifier(KtTokens.PROTECTED_KEYWORD)
}
override fun setCorrectVisibility(info: MemberInfoBase<PsiMember>) {
@@ -358,7 +358,7 @@ class KotlinPullUpHelper(
member.delete()
}
else {
member.addModifierWithSpace(KtTokens.OVERRIDE_KEYWORD)
member.addModifier(KtTokens.OVERRIDE_KEYWORD)
(member as? KtNamedFunction)?.valueParameters?.forEach { it.dropDefaultValue() }
}
}
@@ -69,12 +69,6 @@ fun doAddCallableMember(
return addMemberToTarget(memberCopy, targetClass) as KtCallableDeclaration
}
// TODO: Formatting rules don't apply here for some reason
fun KtNamedDeclaration.addModifierWithSpace(modifier: KtModifierKeywordToken) {
addModifier(modifier)
addAfter(KtPsiFactory(this).createWhiteSpace(), modifierList)
}
// TODO: Formatting rules don't apply here for some reason
fun KtNamedDeclaration.addAnnotationWithSpace(annotationEntry: KtAnnotationEntry): KtAnnotationEntry {
val result = addAnnotationEntry(annotationEntry)
@@ -84,7 +78,7 @@ fun KtNamedDeclaration.addAnnotationWithSpace(annotationEntry: KtAnnotationEntry
fun KtClass.makeAbstract() {
if (!isInterface()) {
addModifierWithSpace(KtTokens.ABSTRACT_KEYWORD)
addModifier(KtTokens.ABSTRACT_KEYWORD)
}
}
@@ -105,7 +99,7 @@ fun makeAbstract(member: KtCallableDeclaration,
substitutor: TypeSubstitutor,
targetClass: KtClass) {
if (!targetClass.isInterface()) {
member.addModifierWithSpace(KtTokens.ABSTRACT_KEYWORD)
member.addModifier(KtTokens.ABSTRACT_KEYWORD)
}
val builtIns = originalMemberDescriptor.builtIns
@@ -139,25 +139,25 @@ class KotlinPushDownProcessor(
val targetMember = targetMemberDescriptor?.source?.getPsi() as? KtCallableDeclaration
targetMember?.apply {
if (memberDescriptor.modality != Modality.ABSTRACT && memberInfo.isToAbstract) {
addModifierWithSpace(KtTokens.OVERRIDE_KEYWORD)
addModifier(KtTokens.OVERRIDE_KEYWORD)
}
else if (memberDescriptor.overriddenDescriptors.isEmpty()) {
removeModifier(KtTokens.OVERRIDE_KEYWORD)
}
else {
addModifierWithSpace(KtTokens.OVERRIDE_KEYWORD)
addModifier(KtTokens.OVERRIDE_KEYWORD)
}
} ?: addMemberToTarget(member, targetClass).apply {
if (this@KotlinPushDownProcessor.context.sourceClassDescriptor.kind == ClassKind.INTERFACE) {
if (targetClassDescriptor.kind != ClassKind.INTERFACE && memberDescriptor.modality == Modality.ABSTRACT) {
addModifierWithSpace(KtTokens.ABSTRACT_KEYWORD)
addModifier(KtTokens.ABSTRACT_KEYWORD)
}
}
if (memberDescriptor.modality != Modality.ABSTRACT && memberInfo.isToAbstract) {
if (hasModifier(KtTokens.PRIVATE_KEYWORD)) {
addModifierWithSpace(KtTokens.PROTECTED_KEYWORD)
addModifier(KtTokens.PROTECTED_KEYWORD)
}
addModifierWithSpace(KtTokens.OVERRIDE_KEYWORD)
addModifier(KtTokens.OVERRIDE_KEYWORD)
}
}
}
@@ -194,7 +194,7 @@ class KotlinPushDownProcessor(
if (memberDescriptor.modality != Modality.ABSTRACT && memberInfo.isToAbstract) {
if (member.hasModifier(KtTokens.PRIVATE_KEYWORD)) {
member.addModifierWithSpace(KtTokens.PROTECTED_KEYWORD)
member.addModifier(KtTokens.PROTECTED_KEYWORD)
}
makeAbstract(member, memberDescriptor, TypeSubstitutor.EMPTY, context.sourceClass)
member.typeReference?.addToShorteningWaitSet()
@@ -0,0 +1,6 @@
open class Upper
open class <caret>Lower : Upper() {
// INFO: {"checked": "true", "toAbstract": "true"}
protected val moving: Int = 0
}
@@ -0,0 +1,9 @@
abstract class Upper {
// INFO: {"checked": "true", "toAbstract": "true"}
protected abstract val moving: Int
}
open class Lower : Upper() {
// INFO: {"checked": "true", "toAbstract": "true"}
protected override val moving: Int = 0
}
@@ -223,6 +223,12 @@ public class PullUpTestGenerated extends AbstractPullUpTest {
doKotlinTest(fileName);
}
@TestMetadata("spaceAfterModifier.kt")
public void testSpaceAfterModifier() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/pullUp/k2k/spaceAfterModifier.kt");
doKotlinTest(fileName);
}
@TestMetadata("superToThis.kt")
public void testSuperToThis() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/pullUp/k2k/superToThis.kt");