[AA] delegate to resolveToFirSymbol to avoid decompilation
`getReturnTypeForKtDeclaration` is called by UAST on probably compiled declarations. In order to avoid redundant decompilation + building raw FIR + resolve, let's delegate to deserialized FIR which is already prepared in stubs Fixes KTIJ-24810 When `findSourceNonLocalFirDeclaration` is called on non-physical property accessor e.g., during completion, then traverse tree should allow drilling into FirProperty; otherwise, no FIR would be found
This commit is contained in:
+9
-4
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
@@ -34,6 +35,9 @@ import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.contract
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||
|
||||
internal class KtFirExpressionTypeProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -120,12 +124,13 @@ internal class KtFirExpressionTypeProvider(
|
||||
}
|
||||
|
||||
override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType {
|
||||
val firDeclaration = if (isAnonymousFunction(declaration))
|
||||
declaration.toFirAnonymousFunction()
|
||||
else
|
||||
val firDeclaration = if (declaration is KtParameter && declaration.ownerFunction == null) {
|
||||
declaration.getOrBuildFir(firResolveSession)
|
||||
} else {
|
||||
declaration.resolveToFirSymbol(firResolveSession, FirResolvePhase.TYPES).fir
|
||||
}
|
||||
return when (firDeclaration) {
|
||||
is FirCallableDeclaration -> firDeclaration.returnTypeRef.coneType.asKtType()
|
||||
is FirCallableDeclaration -> firDeclaration.symbol.resolvedReturnType.asKtType()
|
||||
is FirFunctionTypeParameter -> firDeclaration.returnTypeRef.coneType.asKtType()
|
||||
else -> unexpectedElementError<FirElement>(firDeclaration)
|
||||
}
|
||||
|
||||
+6
@@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGene
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/types/byDeclarationReturnType"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anonymousFunction.kt")
|
||||
public void testAnonymousFunction() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/anonymousFunction.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("localClassType.kt")
|
||||
public void testLocalClassType() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user