FIR IDE: Create FirResolvedImports without fake PSI
This commit is contained in:
+21
-16
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
||||||
|
|
||||||
import com.intellij.openapi.application.ApplicationManager
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import com.intellij.psi.SmartPsiElementPointer
|
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
|
||||||
@@ -14,6 +13,8 @@ import org.jetbrains.kotlin.fir.FirElement
|
|||||||
import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
|
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.declarations.builder.buildImport
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
@@ -23,6 +24,8 @@ import org.jetbrains.kotlin.fir.references.FirNamedReference
|
|||||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.transformers.resolveToPackageOrClass
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.getFunctions
|
import org.jetbrains.kotlin.fir.scopes.getFunctions
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope
|
import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope
|
||||||
@@ -39,7 +42,6 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
|||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirSafe
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
|
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtReferenceShortener
|
import org.jetbrains.kotlin.idea.frontend.api.components.KtReferenceShortener
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.ShortenCommand
|
import org.jetbrains.kotlin.idea.frontend.api.components.ShortenCommand
|
||||||
@@ -51,7 +53,6 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
|
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
|
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
|
||||||
import org.jetbrains.kotlin.resolve.ImportPath
|
|
||||||
|
|
||||||
internal class KtFirReferenceShortener(
|
internal class KtFirReferenceShortener(
|
||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
@@ -134,30 +135,34 @@ internal class KtFirReferenceShortener(
|
|||||||
|
|
||||||
val result = buildList<FirScope> {
|
val result = buildList<FirScope> {
|
||||||
addAll(towerDataContext.nonLocalTowerDataElements.mapNotNull { it.scope })
|
addAll(towerDataContext.nonLocalTowerDataElements.mapNotNull { it.scope })
|
||||||
addIfNotNull(createFakeImportingScope(position.project, newImports))
|
addIfNotNull(createFakeImportingScope(newImports))
|
||||||
addAll(towerDataContext.localScopes)
|
addAll(towerDataContext.localScopes)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.asReversed()
|
return result.asReversed()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createFakeImportingScope(
|
private fun createFakeImportingScope(newImports: List<FqName>): FirScope? {
|
||||||
project: Project,
|
val resolvedNewImports = newImports.mapNotNull { createFakeResolvedImport(it) }
|
||||||
newImports: List<FqName>
|
|
||||||
): FirScope? {
|
|
||||||
if (newImports.isEmpty()) return null
|
|
||||||
|
|
||||||
val psiFactory = KtPsiFactory(project)
|
|
||||||
|
|
||||||
val resolvedNewImports = newImports
|
|
||||||
.map { psiFactory.createImportDirective(ImportPath(it, isAllUnder = false)) }
|
|
||||||
.mapNotNull { it.getOrBuildFirSafe<FirResolvedImport>(firResolveState) }
|
|
||||||
|
|
||||||
if (resolvedNewImports.isEmpty()) return null
|
if (resolvedNewImports.isEmpty()) return null
|
||||||
|
|
||||||
return FirExplicitSimpleImportingScope(resolvedNewImports, firResolveState.rootModuleSession, ScopeSession())
|
return FirExplicitSimpleImportingScope(resolvedNewImports, firResolveState.rootModuleSession, ScopeSession())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createFakeResolvedImport(fqNameToImport: FqName): FirResolvedImport? {
|
||||||
|
val packageOrClass = resolveToPackageOrClass(firResolveState.rootModuleSession.firSymbolProvider, fqNameToImport) ?: return null
|
||||||
|
|
||||||
|
val delegateImport = buildImport {
|
||||||
|
importedFqName = fqNameToImport
|
||||||
|
isAllUnder = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return buildResolvedImport {
|
||||||
|
delegate = delegateImport
|
||||||
|
packageFqName = packageOrClass.packageFqName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private inner class TypesCollectingVisitor(
|
private inner class TypesCollectingVisitor(
|
||||||
private val namesToImport: MutableList<FqName>,
|
private val namesToImport: MutableList<FqName>,
|
||||||
private val typesToShorten: MutableList<KtUserType>,
|
private val typesToShorten: MutableList<KtUserType>,
|
||||||
|
|||||||
Reference in New Issue
Block a user