FIR IDE: Remove fake root prefix even when the element is not shortened
This commit is contained in:
+18
-5
@@ -126,11 +126,6 @@ public class FirShortenRefsTestGenerated extends AbstractFirShortenRefsTest {
|
|||||||
runTest("idea/testData/shortenRefsFir/calls/rootPackage.kt");
|
runTest("idea/testData/shortenRefsFir/calls/rootPackage.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("rootPackageShortenFakeRootPackage.kt")
|
|
||||||
public void testRootPackageShortenFakeRootPackage() throws Exception {
|
|
||||||
runTest("idea/testData/shortenRefsFir/calls/rootPackageShortenFakeRootPackage.kt");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("selfReferencingFunction.kt")
|
@TestMetadata("selfReferencingFunction.kt")
|
||||||
public void testSelfReferencingFunction() throws Exception {
|
public void testSelfReferencingFunction() throws Exception {
|
||||||
runTest("idea/testData/shortenRefsFir/calls/selfReferencingFunction.kt");
|
runTest("idea/testData/shortenRefsFir/calls/selfReferencingFunction.kt");
|
||||||
@@ -142,6 +137,24 @@ public class FirShortenRefsTestGenerated extends AbstractFirShortenRefsTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("idea/testData/shortenRefsFir/fakeRootPackage")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class FakeRootPackage extends AbstractFirShortenRefsTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTestWithMuting, this, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInFakeRootPackage() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/shortenRefsFir/fakeRootPackage"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("rootPackageShortenFakeRootPackage.kt")
|
||||||
|
public void testRootPackageShortenFakeRootPackage() throws Exception {
|
||||||
|
runTest("idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/shortenRefsFir/quailfiers")
|
@TestMetadata("idea/testData/shortenRefsFir/quailfiers")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
+38
-5
@@ -11,6 +11,7 @@ import com.intellij.psi.SmartPsiElementPointer
|
|||||||
import com.intellij.util.containers.addIfNotNull
|
import com.intellij.util.containers.addIfNotNull
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
|
import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClass
|
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
@@ -209,6 +210,17 @@ internal class KtFirReferenceShortener(
|
|||||||
|
|
||||||
if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) {
|
if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) {
|
||||||
addTypeToImportAndShorten(mostTopLevelClassId.asSingleFqName(), mostTopLevelTypeElement)
|
addTypeToImportAndShorten(mostTopLevelClassId.asSingleFqName(), mostTopLevelTypeElement)
|
||||||
|
} else {
|
||||||
|
addFakePackagePrefixToShortenIfPresent(mostTopLevelTypeElement)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun addFakePackagePrefixToShortenIfPresent(typeElement: KtUserType) {
|
||||||
|
val deepestTypeWithQualifier = typeElement.qualifiersWithSelf.last().parent as? KtUserType
|
||||||
|
?: error("Type element should have at least one qualifier, instead it was ${typeElement.text}")
|
||||||
|
|
||||||
|
if (deepestTypeWithQualifier.hasFakeRootPrefix()) {
|
||||||
|
addTypeToShorten(deepestTypeWithQualifier)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,11 +272,17 @@ internal class KtFirReferenceShortener(
|
|||||||
val scopes = findScopesAtPosition(callExpression, namesToImport) ?: return
|
val scopes = findScopesAtPosition(callExpression, namesToImport) ?: return
|
||||||
val availableCallables = findFunctionsInScopes(scopes, callableId.callableName)
|
val availableCallables = findFunctionsInScopes(scopes, callableId.callableName)
|
||||||
|
|
||||||
if (availableCallables.isEmpty()) {
|
when {
|
||||||
val additionalImport = callableId.asImportableFqName() ?: return
|
availableCallables.isEmpty() -> {
|
||||||
addElementToImportAndShorten(additionalImport, qualifiedCallExpression)
|
val additionalImport = callableId.asImportableFqName() ?: return
|
||||||
} else if (availableCallables.all { it.callableId == callableId }) {
|
addElementToImportAndShorten(additionalImport, qualifiedCallExpression)
|
||||||
addElementToShorten(qualifiedCallExpression)
|
}
|
||||||
|
availableCallables.all { it.callableId == callableId } -> {
|
||||||
|
addElementToShorten(qualifiedCallExpression)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
addFakePackagePrefixToShortenIfPresent(qualifiedCallExpression)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,6 +364,15 @@ internal class KtFirReferenceShortener(
|
|||||||
|
|
||||||
if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) {
|
if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) {
|
||||||
addElementToImportAndShorten(mostTopLevelClassId.asSingleFqName(), mostTopLevelQualifier)
|
addElementToImportAndShorten(mostTopLevelClassId.asSingleFqName(), mostTopLevelQualifier)
|
||||||
|
} else {
|
||||||
|
addFakePackagePrefixToShortenIfPresent(mostTopLevelQualifier)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun addFakePackagePrefixToShortenIfPresent(wholeQualifiedExpression: KtDotQualifiedExpression) {
|
||||||
|
val deepestQualifier = wholeQualifiedExpression.qualifiersWithSelf.last()
|
||||||
|
if (deepestQualifier.hasFakeRootPrefix()) {
|
||||||
|
addElementToShorten(deepestQualifier)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,6 +422,12 @@ private class ShortenCommandImpl(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtUserType.hasFakeRootPrefix(): Boolean =
|
||||||
|
qualifier?.referencedName == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
|
||||||
|
|
||||||
|
private fun KtDotQualifiedExpression.hasFakeRootPrefix(): Boolean =
|
||||||
|
(receiverExpression as? KtNameReferenceExpression)?.getReferencedName() == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
|
||||||
|
|
||||||
private fun CallableId.asImportableFqName(): FqName? = if (classId == null) packageName.child(callableName) else null
|
private fun CallableId.asImportableFqName(): FqName? = if (classId == null) packageName.child(callableName) else null
|
||||||
|
|
||||||
private fun KtElement.getDotQualifiedExpressionForSelector(): KtDotQualifiedExpression? =
|
private fun KtElement.getDotQualifiedExpressionForSelector(): KtDotQualifiedExpression? =
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
// FIR_IGNORE
|
|
||||||
package test
|
|
||||||
|
|
||||||
fun test() {}
|
|
||||||
|
|
||||||
fun usage() {
|
|
||||||
fun test() {}
|
|
||||||
|
|
||||||
<selection>_root_ide_package_.test.test()</selection>
|
|
||||||
}
|
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// FIR_COMPARISON
|
||||||
|
package test
|
||||||
|
|
||||||
|
class Test
|
||||||
|
|
||||||
|
fun test() {}
|
||||||
|
|
||||||
|
fun usage() {
|
||||||
|
class Test
|
||||||
|
|
||||||
|
fun test() {}
|
||||||
|
|
||||||
|
<selection>
|
||||||
|
_root_ide_package_.test.test()
|
||||||
|
_root_ide_package_.test.Test
|
||||||
|
val t: _root_ide_package_.test.Test
|
||||||
|
</selection>
|
||||||
|
}
|
||||||
+8
@@ -1,10 +1,18 @@
|
|||||||
// FIR_COMPARISON
|
// FIR_COMPARISON
|
||||||
package test
|
package test
|
||||||
|
|
||||||
|
class Test
|
||||||
|
|
||||||
fun test() {}
|
fun test() {}
|
||||||
|
|
||||||
fun usage() {
|
fun usage() {
|
||||||
|
class Test
|
||||||
|
|
||||||
fun test() {}
|
fun test() {}
|
||||||
|
|
||||||
|
|
||||||
test.test()
|
test.test()
|
||||||
|
test.Test
|
||||||
|
val t: test.Test
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user