Generate enum entries in create actual / expected fixes as all other
This makes code a bit cleaner
This commit is contained in:
@@ -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,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()
|
||||||
|
}
|
||||||
+5
@@ -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/");
|
||||||
|
|||||||
Reference in New Issue
Block a user