Add when branches: include auto-import

Before this commit, enum / sealed class to add was not imported so
user had to import them himself. Now everything is auto-imported.
Separate "add with import" is kept but * import is now in mind there.
#KT-22330 Fixed
#KT-22354 Fixed
EA-108090 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-08-15 17:42:36 +03:00
parent f3972bfdfe
commit b031e34f8d
8 changed files with 83 additions and 3 deletions
@@ -24,10 +24,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
import org.jetbrains.kotlin.idea.intentions.ImportAllMembersIntention
import org.jetbrains.kotlin.idea.refactoring.isMultiLine
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
class AddWhenRemainingBranchesFix(
@@ -77,16 +80,20 @@ class AddWhenRemainingBranchesFix(
val elseBranch = element.entries.find { it.isElse }
val psiFactory = KtPsiFactory(element)
if (missingCases.isNotEmpty() && !element.isMultiLine()) {
element.addBefore(psiFactory.createNewLine(), whenCloseBrace)
}
for (case in missingCases) {
val branchConditionText = when (case) {
UnknownMissingCase, NullMissingCase, is BooleanMissingCase ->
case.branchConditionText
is ClassMissingCase ->
if (case.classIsSingleton) {
case.classFqName.quoteIfNeeded().asString()
""
} else {
"is " + case.classFqName.quoteIfNeeded().asString()
}
"is "
} + case.descriptor.fqNameSafe.quoteIfNeeded().asString()
}
val entry = psiFactory.createWhenEntry("$branchConditionText -> TODO()")
if (elseBranch != null) {
@@ -96,6 +103,8 @@ class AddWhenRemainingBranchesFix(
}
}
ShortenReferences.DEFAULT.process(element)
if (withImport) {
importAllEntries(element)
}
@@ -0,0 +1,15 @@
// "Add remaining branches" "true"
package u
import e.OwnEnum
import e.getOwnEnum
fun mainContext() {
val ownLocal = getOwnEnum()
when (ownLocal) {
OwnEnum.RED -> TODO()
OwnEnum.GREEN -> TODO()
OwnEnum.BLUE -> TODO()
}
}
@@ -0,0 +1,5 @@
package e
enum class OwnEnum { RED, GREEN, BLUE }
fun getOwnEnum(): OwnEnum = OwnEnum.RED
@@ -0,0 +1,10 @@
// "Add remaining branches" "true"
package u
import e.getOwnEnum
fun mainContext() {
val ownLocal = getOwnEnum()
<caret>when (ownLocal) {}
}
@@ -0,0 +1,16 @@
// "Add remaining branches with import" "true"
package u
import e.OwnEnum
import e.OwnEnum.*
import e.getOwnEnum
fun mainContext() {
val ownLocal = getOwnEnum()
when (ownLocal) {
RED -> TODO()
GREEN -> TODO()
BLUE -> TODO()
}
}
@@ -0,0 +1,5 @@
package e
enum class OwnEnum { RED, GREEN, BLUE }
fun getOwnEnum(): OwnEnum = OwnEnum.RED
@@ -0,0 +1,10 @@
// "Add remaining branches with import" "true"
package u
import e.getOwnEnum
fun mainContext() {
val ownLocal = getOwnEnum()
<caret>when (ownLocal) {}
}
@@ -4203,6 +4203,16 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
KotlinTestUtils.runTest(this::doTestWithExtraFile, TargetBackend.ANY, testDataFilePath);
}
@TestMetadata("addRemainingBranchesAnotherPackage.before.Main.kt")
public void testAddRemainingBranchesAnotherPackage() throws Exception {
runTest("idea/testData/quickfix/when/addRemainingBranchesAnotherPackage.before.Main.kt");
}
@TestMetadata("addRemainingBranchesAnotherPackageAll.before.Main.kt")
public void testAddRemainingBranchesAnotherPackageAll() throws Exception {
runTest("idea/testData/quickfix/when/addRemainingBranchesAnotherPackageAll.before.Main.kt");
}
public void testAllFilesPresentInWhen() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/when"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), TargetBackend.ANY, true);
}