1
1
/*
2
- * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
2
+ * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
3
3
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4
4
*/
5
5
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.analysis.api.types.KtErrorType
15
15
import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType
16
16
import org.jetbrains.kotlin.analysis.api.types.KtType
17
17
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
18
- import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType
19
18
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
20
19
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
21
20
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
@@ -28,16 +27,13 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference
28
27
import org.jetbrains.kotlin.fir.resolve.constructFunctionType
29
28
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
30
29
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
30
+ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
31
31
import org.jetbrains.kotlin.fir.types.*
32
32
import org.jetbrains.kotlin.lexer.KtTokens
33
33
import org.jetbrains.kotlin.psi
34
34
import org.jetbrains.kotlin.psi.*
35
35
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
36
- import kotlin.contracts.ExperimentalContracts
37
- import kotlin.contracts.contract
38
36
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
39
- import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
40
- import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
41
37
42
38
internal class KtFirExpressionTypeProvider (
43
39
override val analysisSession : KtFirAnalysisSession ,
@@ -137,23 +133,12 @@ internal class KtFirExpressionTypeProvider(
137
133
}
138
134
139
135
override fun getFunctionalTypeForKtFunction (declaration : KtFunction ): KtType {
140
- val firFunction = if (isAnonymousFunction(declaration))
141
- declaration.toFirAnonymousFunction()
142
- else
143
- declaration.getOrBuildFirOfType<FirFunction >(firResolveSession)
144
- return firFunction.constructFunctionType(firFunction.specialFunctionTypeKind(firResolveSession.useSiteFirSession)).asKtType()
145
- }
146
-
147
- @OptIn(ExperimentalContracts ::class )
148
- private fun isAnonymousFunction (ktDeclaration : KtDeclaration ): Boolean {
149
- contract {
150
- returns(true ) implies (ktDeclaration is KtNamedFunction )
136
+ val firFunction = declaration.resolveToFirSymbol(firResolveSession, FirResolvePhase .TYPES ).fir as FirFunction
137
+ if (firFunction.returnTypeRef is FirImplicitTypeRef ) {
138
+ firFunction.lazyResolveToPhase(FirResolvePhase .IMPLICIT_TYPES_BODY_RESOLVE )
151
139
}
152
- return ktDeclaration is KtNamedFunction && ktDeclaration.isAnonymous
153
- }
154
140
155
- private fun KtFunction.toFirAnonymousFunction (): FirAnonymousFunction {
156
- return getOrBuildFirOfType<FirAnonymousFunctionExpression >(firResolveSession).anonymousFunction
141
+ return firFunction.constructFunctionType(firFunction.specialFunctionTypeKind(firResolveSession.useSiteFirSession)).asKtType()
157
142
}
158
143
159
144
override fun getExpectedType (expression : PsiElement ): KtType ? {
@@ -250,7 +235,7 @@ internal class KtFirExpressionTypeProvider(
250
235
251
236
// There is only one parameter for infix functions; get its type
252
237
val argumentsToParameters = firCall.argumentsToSubstitutedValueParameters(substituteWithErrorTypes = false ) ? : return null
253
- return argumentsToParameters.values.singleOrNull()?.substitutedType?.asKtType() ? : return null
238
+ return argumentsToParameters.values.singleOrNull()?.substitutedType?.asKtType()
254
239
}
255
240
256
241
private fun getExpectedTypeByReturnExpression (expression : PsiElement ): KtType ? {
0 commit comments