KT-61889 [AA] Migrate KtFirReferenceShortener to ContextCollector
This should make reference shortener considerably faster, since it won't need to perform redundant extra resolve of the file. `ContextCollector` more accurately collects the scopes for the scripts, so some script tests are also fixed. It should fix the following bugs: ^KTIJ-26714 Fixed ^KTIJ-26727 Fixed This is also an important part of fixing the following bugs: - KTIJ-26715 - KTIJ-26734 But those bugs also rely on KT-61890, because completion uses scopes and snows incorrect elements from them
This commit is contained in:
committed by
Space Team
parent
ce900063c0
commit
7b50506aea
+47
-5
@@ -26,9 +26,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.AllCandidatesResolver
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector
|
||||
import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
@@ -43,6 +45,7 @@ import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnmatchedTypeArgumentsError
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
@@ -94,11 +97,7 @@ internal class KtFirReferenceShortener(
|
||||
kDocQualifiersToShorten = emptyList(),
|
||||
)
|
||||
|
||||
val towerContext = if (declarationToVisit is KtFile) {
|
||||
LowLevelFirApiFacadeForResolveOnAir.getOnAirTowerDataContextProviderForTheWholeFile(firResolveSession, declarationToVisit)
|
||||
} else {
|
||||
LowLevelFirApiFacadeForResolveOnAir.getOnAirGetTowerContextProvider(firResolveSession, declarationToVisit)
|
||||
}
|
||||
val towerContext = createTowerDataContextProvider(declarationToVisit)
|
||||
|
||||
//TODO: collect all usages of available symbols in the file and prevent importing symbols that could introduce name clashes, which
|
||||
// may alter the meaning of existing code.
|
||||
@@ -140,6 +139,10 @@ internal class KtFirReferenceShortener(
|
||||
)
|
||||
}
|
||||
|
||||
private fun createTowerDataContextProvider(declaration: KtElement): FirTowerContextProvider {
|
||||
return FirTowerContextProviderByContextCollector(declaration, firResolveSession)
|
||||
}
|
||||
|
||||
private fun KtElement.getCorrespondingFirElement(): FirElement? {
|
||||
require(this is KtFile || this is KtDeclaration)
|
||||
|
||||
@@ -156,6 +159,45 @@ internal class KtFirReferenceShortener(
|
||||
private fun buildSymbol(firSymbol: FirBasedSymbol<*>): KtSymbol = analysisSession.firSymbolBuilder.buildSymbol(firSymbol)
|
||||
}
|
||||
|
||||
private class FirTowerContextProviderByContextCollector(
|
||||
targetElement: KtElement,
|
||||
firResolveSession: LLFirResolveSession,
|
||||
) : FirTowerContextProvider {
|
||||
|
||||
private val contextProvider: ContextCollector.ContextProvider = run {
|
||||
val firFile = targetElement.containingKtFile.getOrBuildFirFile(firResolveSession)
|
||||
|
||||
val sessionHolder = run {
|
||||
val firSession = firResolveSession.useSiteFirSession
|
||||
val scopeSession = firResolveSession.getScopeSessionFor(firSession)
|
||||
|
||||
SessionHolderImpl(firSession, scopeSession)
|
||||
}
|
||||
|
||||
val designation = ContextCollector.computeDesignation(firFile, targetElement)
|
||||
|
||||
ContextCollector.process(
|
||||
firFile,
|
||||
sessionHolder,
|
||||
designation,
|
||||
shouldCollectBodyContext = false, // we only query SELF context
|
||||
filter = { ContextCollector.FilterResponse.CONTINUE }
|
||||
)
|
||||
}
|
||||
|
||||
override fun getClosestAvailableParentContext(ktElement: KtElement): FirTowerDataContext? {
|
||||
for (parent in ktElement.parentsWithSelf) {
|
||||
val context = contextProvider[parent, ContextCollector.ContextKind.SELF]
|
||||
|
||||
if (context != null) {
|
||||
return context.towerDataContext
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
private fun FqName.dropFakeRootPrefixIfPresent(): FqName =
|
||||
tail(FqName(ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE))
|
||||
|
||||
|
||||
+12
@@ -640,6 +640,18 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
|
||||
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/classHeaderPositions/annotationOnParameter_nested.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("constructorParameterVsTopLevelProperty_conflict.kt")
|
||||
public void testConstructorParameterVsTopLevelProperty_conflict() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/classHeaderPositions/constructorParameterVsTopLevelProperty_conflict.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("constructorParameterVsTopLevelProperty_noConflict.kt")
|
||||
public void testConstructorParameterVsTopLevelProperty_noConflict() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/classHeaderPositions/constructorParameterVsTopLevelProperty_noConflict.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("contextReceiver.kt")
|
||||
public void testContextReceiver() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user