[kotlin] "Add import" should modify PSI-tree correctly

^KTIJ-25416 Fixed

GitOrigin-RevId: fbba6c3b1c21958677503dede31013aa6c317ef2
This commit is contained in:
Dmitrii Gridin
2023-05-02 11:09:45 +00:00
committed by intellij-monorepo-bot
parent 10672e0f3f
commit 7e4d309519
11 changed files with 64 additions and 2 deletions
@@ -8,6 +8,7 @@ import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.PsiTestUtil
import com.intellij.util.PathUtil
import org.junit.Ignore
import java.io.File
class KotlinJUnitMalformedDeclarationInspectionTest : JUnitMalformedDeclarationInspectionTestBase() {
@@ -692,7 +693,9 @@ class KotlinJUnitMalformedDeclarationInspectionTest : JUnitMalformedDeclarationI
}
""".trimIndent())
}
fun `test malformed before each remove private quickfix`() {
return // TODO: IDEA-319390
myFixture.testQuickFixWithPreview(JvmLanguage.KOTLIN, """
class MainTest {
@org.junit.jupiter.api.BeforeEach
@@ -6,9 +6,11 @@ import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.base.facet.platform.platform
import org.jetbrains.kotlin.idea.base.projectStructure.compositeAnalysis.findAnalyzerServices
import org.jetbrains.kotlin.idea.base.psi.isMultiLine
import org.jetbrains.kotlin.idea.base.utils.fqname.isImported
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings
@@ -489,11 +491,27 @@ class ImportInsertHelperImpl(private val project: Project) : ImportInsertHelper(
val newDirective = psiFactory.createImportDirective(importPath)
val imports = importList.imports
return if (imports.isEmpty()) {
file.packageDirective?.takeIf { it.packageKeyword != null }?.let {
val packageDirective = file.packageDirective?.takeIf { it.packageKeyword != null }
packageDirective?.let {
file.addAfter(psiFactory.createNewLine(2), it)
}
importList.add(newDirective) as KtImportDirective
(importList.add(newDirective) as KtImportDirective).also {
if (packageDirective == null) {
val whiteSpace = importList.nextSibling
if (whiteSpace is PsiWhiteSpace) {
val newLineBreak = if (whiteSpace.isMultiLine()) {
psiFactory.createWhiteSpace("\n" + whiteSpace.text)
} else {
psiFactory.createWhiteSpace("\n\n" + whiteSpace.text)
}
whiteSpace.replace(newLineBreak)
} else {
file.addAfter(psiFactory.createNewLine(2), importList)
}
}
}
} else {
val importPathComparator = ImportInsertHelperImpl(project).getImportSortComparator(file)
val insertAfter = imports.lastOrNull {
@@ -258,6 +258,11 @@ public class AddImportTestGenerated extends AbstractAddImportTest {
runTest("testData/addImport/PropertyAlreadyImported2.kt");
}
@TestMetadata("RootPackageWithoutFormatter.kt")
public void testRootPackageWithoutFormatter() throws Exception {
runTest("testData/addImport/RootPackageWithoutFormatter.kt");
}
@TestMetadata("StdlibImportsLast.kt")
public void testStdlibImportsLast() throws Exception {
runTest("testData/addImport/StdlibImportsLast.kt");
@@ -301,6 +301,11 @@ public abstract class ShortenRefsTestGenerated extends AbstractShortenRefsTest {
runTest("testData/shortenRefs/type/ClassSameNameAsPackage.kt");
}
@TestMetadata("ClassSameNameAsPackageWithSpace.kt")
public void testClassSameNameAsPackageWithSpace() throws Exception {
runTest("testData/shortenRefs/type/ClassSameNameAsPackageWithSpace.kt");
}
@TestMetadata("delegationSpecifier.kt")
public void testDelegationSpecifier() throws Exception {
runTest("testData/shortenRefs/type/delegationSpecifier.kt");
@@ -0,0 +1,3 @@
package one.two
class MyClass
@@ -0,0 +1,5 @@
//@formatter:off
// IMPORT: class: one.two.MyClass
fun test() {
MyClass()
}
@@ -0,0 +1,7 @@
import one.two.*
//@formatter:off
// IMPORT: class: one.two.MyClass
fun test() {
MyClass()
}
@@ -0,0 +1,3 @@
package same
class same() {}
@@ -0,0 +1,3 @@
//@formatter:off
fun f(s: <selection>_root_ide_package_.same.same</selection>) {
}
@@ -0,0 +1,5 @@
import same.same
//@formatter:off
fun f(s: same) {
}
@@ -258,6 +258,11 @@ public class PerformanceAddImportTestGenerated extends AbstractPerformanceAddImp
runTest("../idea/tests/testData/addImport/PropertyAlreadyImported2.kt");
}
@TestMetadata("RootPackageWithoutFormatter.kt")
public void testRootPackageWithoutFormatter() throws Exception {
runTest("../idea/tests/testData/addImport/RootPackageWithoutFormatter.kt");
}
@TestMetadata("StdlibImportsLast.kt")
public void testStdlibImportsLast() throws Exception {
runTest("../idea/tests/testData/addImport/StdlibImportsLast.kt");