FIR IDE: Add ElementToShorten sealed classes

This commit is contained in:
Roman Golyshev
2021-02-09 18:52:25 +03:00
committed by Space
parent d202b0feb2
commit dee4f4345b
@@ -170,6 +170,10 @@ private class FirShorteningContext(val firResolveState: FirModuleResolveState) {
} }
} }
private sealed class ElementToShorten
private class ShortenType(val element: KtUserType, val nameToImport: FqName? = null) : ElementToShorten()
private class ShortenQualifier(val element: KtDotQualifiedExpression, val nameToImport: FqName? = null) : ElementToShorten()
private class ElementsToShortenCollector(private val shorteningContext: FirShorteningContext) : FirVisitorVoid() { private class ElementsToShortenCollector(private val shorteningContext: FirShorteningContext) : FirVisitorVoid() {
val namesToImport: MutableList<FqName> = mutableListOf() val namesToImport: MutableList<FqName> = mutableListOf()
val typesToShorten: MutableList<KtUserType> = mutableListOf() val typesToShorten: MutableList<KtUserType> = mutableListOf()
@@ -228,7 +232,7 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
val firstFoundClass = shorteningContext.findFirstClassifierInScopesByName(positionScopes, classId.shortClassName)?.classId val firstFoundClass = shorteningContext.findFirstClassifierInScopesByName(positionScopes, classId.shortClassName)?.classId
if (firstFoundClass == classId) { if (firstFoundClass == classId) {
addTypeToShorten(typeElement) addElementToShorten(ShortenType(typeElement))
return return
} }
} }
@@ -242,7 +246,7 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
} }
if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) { if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) {
addTypeToShorten(mostTopLevelTypeElement, mostTopLevelClassId.asSingleFqName()) addElementToShorten(ShortenType(mostTopLevelTypeElement, mostTopLevelClassId.asSingleFqName()))
} else { } else {
addFakePackagePrefixToShortenIfPresent(mostTopLevelTypeElement) addFakePackagePrefixToShortenIfPresent(mostTopLevelTypeElement)
} }
@@ -253,15 +257,10 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
?: error("Type element should have at least one qualifier, instead it was ${typeElement.text}") ?: error("Type element should have at least one qualifier, instead it was ${typeElement.text}")
if (deepestTypeWithQualifier.hasFakeRootPrefix()) { if (deepestTypeWithQualifier.hasFakeRootPrefix()) {
addTypeToShorten(deepestTypeWithQualifier) addElementToShorten(ShortenType(deepestTypeWithQualifier))
} }
} }
private fun addTypeToShorten(mostTopLevelTypeElement: KtUserType, classFqName: FqName? = null) {
namesToImport.addIfNotNull(classFqName)
typesToShorten.add(mostTopLevelTypeElement)
}
private fun processTypeQualifier(resolvedQualifier: FirResolvedQualifier) { private fun processTypeQualifier(resolvedQualifier: FirResolvedQualifier) {
val wholeClassQualifier = resolvedQualifier.classId ?: return val wholeClassQualifier = resolvedQualifier.classId ?: return
val wholeQualifierElement = when (val qualifierPsi = resolvedQualifier.psi) { val wholeQualifierElement = when (val qualifierPsi = resolvedQualifier.psi) {
@@ -283,7 +282,7 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
val firstFoundClass = shorteningContext.findFirstClassifierInScopesByName(positionScopes, classId.shortClassName)?.classId val firstFoundClass = shorteningContext.findFirstClassifierInScopesByName(positionScopes, classId.shortClassName)?.classId
if (firstFoundClass == classId) { if (firstFoundClass == classId) {
addElementToShorten(qualifier) addElementToShorten(ShortenQualifier(qualifier))
return return
} }
} }
@@ -296,7 +295,7 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
} }
if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) { if (availableClassifier == null || availableClassifier.isFromStarOrPackageImport) {
addElementToShorten(mostTopLevelQualifier, mostTopLevelClassId.asSingleFqName()) addElementToShorten(ShortenQualifier(mostTopLevelQualifier, mostTopLevelClassId.asSingleFqName()))
} else { } else {
addFakePackagePrefixToShortenIfPresent(mostTopLevelQualifier) addFakePackagePrefixToShortenIfPresent(mostTopLevelQualifier)
} }
@@ -312,7 +311,7 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
val singleAvailableProperty = shorteningContext.findSinglePropertyInScopesByName(scopes, propertyId.callableName) val singleAvailableProperty = shorteningContext.findSinglePropertyInScopesByName(scopes, propertyId.callableName)
if (singleAvailableProperty?.callableId == propertyId) { if (singleAvailableProperty?.callableId == propertyId) {
addElementToShorten(qualifiedProperty) addElementToShorten(ShortenQualifier(qualifiedProperty))
} }
} }
@@ -331,10 +330,10 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
when { when {
availableCallables.isEmpty() -> { availableCallables.isEmpty() -> {
val additionalImport = callableId.asImportableFqName() ?: return val additionalImport = callableId.asImportableFqName() ?: return
addElementToShorten(qualifiedCallExpression, additionalImport) addElementToShorten(ShortenQualifier(qualifiedCallExpression, additionalImport))
} }
availableCallables.all { it.callableId == callableId } -> { availableCallables.all { it.callableId == callableId } -> {
addElementToShorten(qualifiedCallExpression) addElementToShorten(ShortenQualifier(qualifiedCallExpression))
} }
else -> { else -> {
addFakePackagePrefixToShortenIfPresent(qualifiedCallExpression) addFakePackagePrefixToShortenIfPresent(qualifiedCallExpression)
@@ -388,13 +387,21 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
private fun addFakePackagePrefixToShortenIfPresent(wholeQualifiedExpression: KtDotQualifiedExpression) { private fun addFakePackagePrefixToShortenIfPresent(wholeQualifiedExpression: KtDotQualifiedExpression) {
val deepestQualifier = wholeQualifiedExpression.qualifiersWithSelf.last() val deepestQualifier = wholeQualifiedExpression.qualifiersWithSelf.last()
if (deepestQualifier.hasFakeRootPrefix()) { if (deepestQualifier.hasFakeRootPrefix()) {
addElementToShorten(deepestQualifier) addElementToShorten(ShortenQualifier(deepestQualifier))
} }
} }
private fun addElementToShorten(element: KtDotQualifiedExpression, nameToImport: FqName? = null) { private fun addElementToShorten(element: ElementToShorten) {
namesToImport.addIfNotNull(nameToImport) when (element) {
qualifiersToShorten.add(element) is ShortenType -> {
namesToImport.addIfNotNull(element.nameToImport)
typesToShorten.add(element.element)
}
is ShortenQualifier -> {
namesToImport.addIfNotNull(element.nameToImport)
qualifiersToShorten.add(element.element)
}
}
} }
private val ClassId.outerClassesWithSelf: Sequence<ClassId> private val ClassId.outerClassesWithSelf: Sequence<ClassId>