Generate enum entries in create actual / expected fixes as all other

This makes code a bit cleaner
This commit is contained in:
Mikhail Glukhikh
2018-11-15 13:26:39 +03:00
parent a9280cdbcd
commit d3fada89b7
9 changed files with 49 additions and 30 deletions
@@ -200,12 +200,7 @@ internal fun KtPsiFactory.generateClassOrObjectByExpectedClass(
val actualClass = createClassCopyByText(expectedClass) val actualClass = createClassCopyByText(expectedClass)
actualClass.declarations.forEach { actualClass.declarations.forEach {
if (it.exists()) {
it.delete()
return@forEach
}
when (it) { when (it) {
is KtEnumEntry -> return@forEach
is KtClassOrObject -> it.delete() is KtClassOrObject -> it.delete()
is KtCallableDeclaration -> it.delete() is KtCallableDeclaration -> it.delete()
} }
@@ -229,17 +224,16 @@ internal fun KtPsiFactory.generateClassOrObjectByExpectedClass(
} }
} }
} }
actualClass.replaceExpectModifier(actualNeeded) if (actualClass !is KtEnumEntry) {
actualClass.replaceExpectModifier(actualNeeded)
}
declLoop@ for (expectedDeclaration in expectedClass.declarations.filter { !it.exists() }) { declLoop@ for (expectedDeclaration in expectedClass.declarations.filter { !it.exists() }) {
val descriptor = expectedDeclaration.toDescriptor() ?: continue val descriptor = expectedDeclaration.toDescriptor() ?: continue
val actualDeclaration: KtDeclaration = when (expectedDeclaration) { val actualDeclaration: KtDeclaration = when (expectedDeclaration) {
is KtClassOrObject -> is KtClassOrObject -> {
if (expectedDeclaration !is KtEnumEntry) { generateClassOrObjectByExpectedClass(project, expectedDeclaration, actualNeeded = true)
generateClassOrObjectByExpectedClass(project, expectedDeclaration, actualNeeded = true) }
} else {
continue@declLoop
}
is KtCallableDeclaration -> { is KtCallableDeclaration -> {
when (expectedDeclaration) { when (expectedDeclaration) {
is KtFunction -> generateFunction(project, expectedDeclaration, descriptor as FunctionDescriptor, actualClass) is KtFunction -> generateFunction(project, expectedDeclaration, descriptor as FunctionDescriptor, actualClass)
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction
import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.idea.util.hasDeclarationOf import org.jetbrains.kotlin.idea.util.hasDeclarationOf
import org.jetbrains.kotlin.idea.util.isEffectivelyActual
import org.jetbrains.kotlin.idea.util.liftToExpected import org.jetbrains.kotlin.idea.util.liftToExpected
import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
@@ -188,7 +189,6 @@ private fun KtPsiFactory.generateClassOrObjectByActualClass(
val expectedClass = createClassCopyByText(actualClass) val expectedClass = createClassCopyByText(actualClass)
expectedClass.declarations.forEach { expectedClass.declarations.forEach {
when (it) { when (it) {
is KtEnumEntry -> return@forEach
is KtClassOrObject -> it.delete() is KtClassOrObject -> it.delete()
is KtCallableDeclaration -> it.delete() is KtCallableDeclaration -> it.delete()
is KtAnonymousInitializer -> it.delete() is KtAnonymousInitializer -> it.delete()
@@ -214,14 +214,11 @@ private fun KtPsiFactory.generateClassOrObjectByActualClass(
declLoop@ for (actualDeclaration in actualClass.declarations) { declLoop@ for (actualDeclaration in actualClass.declarations) {
val descriptor = actualDeclaration.toDescriptor() ?: continue val descriptor = actualDeclaration.toDescriptor() ?: continue
if (!actualDeclaration.hasActualModifier()) continue@declLoop if (!actualDeclaration.isEffectivelyActual()) continue@declLoop
val expectedDeclaration: KtDeclaration = when (actualDeclaration) { val expectedDeclaration: KtDeclaration = when (actualDeclaration) {
is KtClassOrObject -> is KtClassOrObject -> {
if (actualDeclaration !is KtEnumEntry) { generateClassOrObjectByActualClass(project, actualDeclaration, outerExpectedClasses + expectedClass)
generateClassOrObjectByActualClass(project, actualDeclaration, outerExpectedClasses + expectedClass) }
} else {
continue@declLoop
}
is KtCallableDeclaration -> { is KtCallableDeclaration -> {
when (actualDeclaration) { when (actualDeclaration) {
is KtFunction -> is KtFunction ->
@@ -49,14 +49,14 @@ fun createFileForDeclaration(module: Module, declaration: KtNamedDeclaration): K
fun KtPsiFactory.createClassCopyByText(originalClass: KtClassOrObject): KtClassOrObject { fun KtPsiFactory.createClassCopyByText(originalClass: KtClassOrObject): KtClassOrObject {
val text = originalClass.text val text = originalClass.text
return if (originalClass is KtObjectDeclaration) { return when (originalClass) {
if (originalClass.isCompanion()) { is KtObjectDeclaration -> if (originalClass.isCompanion()) {
createCompanionObject(text) createCompanionObject(text)
} else { } else {
createObject(text) createObject(text)
} }
} else { is KtEnumEntry -> createEnumEntry(text)
createClass(text) else -> createClass(text)
} }
} }
+1 -3
View File
@@ -1,8 +1,6 @@
// MyEnum: to be implemented // MyEnum: to be implemented
actual enum class MyEnum { actual enum class MyEnum {
FIRST, FIRST, SECOND, LAST;
SECOND,
LAST;
actual val num: Int actual val num: Int
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
@@ -1,8 +1,6 @@
// My: to be implemented // My: to be implemented
// DISABLE-ERRORS // DISABLE-ERRORS
expect enum class My { expect enum class My {
FIRST, FIRST, SECOND, LAST;
SECOND,
LAST;
} }
@@ -0,0 +1,7 @@
expect enum class Complex {
FIRST {
};
abstract fun foo()
}
@@ -0,0 +1,10 @@
// "Create expected enum class in common module testModule_Common" "true"
// DISABLE-ERRORS
actual enum class <caret>Complex {
FIRST {
override fun foo() {}
};
actual abstract fun foo()
}
@@ -0,0 +1,10 @@
// "Create expected enum class in common module testModule_Common" "true"
// DISABLE-ERRORS
actual enum class Complex {
FIRST {
override fun foo() {}
};
actual abstract fun foo()
}
@@ -324,6 +324,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
runTest("idea/testData/multiModuleQuickFix/expectEnum/"); runTest("idea/testData/multiModuleQuickFix/expectEnum/");
} }
@TestMetadata("expectEnumComplex")
public void testExpectEnumComplex() throws Exception {
runTest("idea/testData/multiModuleQuickFix/expectEnumComplex/");
}
@TestMetadata("expectEnumEmpty") @TestMetadata("expectEnumEmpty")
public void testExpectEnumEmpty() throws Exception { public void testExpectEnumEmpty() throws Exception {
runTest("idea/testData/multiModuleQuickFix/expectEnumEmpty/"); runTest("idea/testData/multiModuleQuickFix/expectEnumEmpty/");