diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index bde412fc99f..c90cc4c74ac 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -8,18 +8,14 @@ package org.jetbrains.kotlin.fir.resolve.transformers import com.google.common.collect.LinkedHashMultimap import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultSetterValueParameter import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference -import org.jetbrains.kotlin.fir.resolve.FirProvider -import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.* -import org.jetbrains.kotlin.fir.resolve.defaultType -import org.jetbrains.kotlin.fir.resolve.scope import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.symbols.* @@ -31,7 +27,6 @@ import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addIfNotNull -import org.jetbrains.kotlin.utils.addToStdlib.cast open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOnly: Boolean) : FirTransformer() { @@ -148,13 +143,13 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn private fun storeTypeFromCallee(access: T) where T : FirQualifiedAccess, T : FirExpression { bindingContext[access] = - when (val newCallee = access.calleeReference) { - is FirErrorNamedReference -> - FirErrorTypeRefImpl(session, access.psi, newCallee.errorReason) - is FirResolvedCallableReference -> - jump.tryCalculateReturnType(newCallee.callableSymbol.firUnsafe()) - else -> return - } + when (val newCallee = access.calleeReference) { + is FirErrorNamedReference -> + FirErrorTypeRefImpl(session, access.psi, newCallee.errorReason) + is FirResolvedCallableReference -> + jump.tryCalculateReturnType(newCallee.callableSymbol.firUnsafe()) + else -> return + } } override fun transformQualifiedAccessExpression( @@ -191,26 +186,28 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn override fun transformFunctionCall(functionCall: FirFunctionCall, data: Any?): CompositeTransformResult { + val functionCall = functionCall.transformChildren(this, null) as FirFunctionCall + if (functionCall.calleeReference !is FirSimpleNamedReference) return functionCall.compose() val name = functionCall.calleeReference.name val expectedTypeRef = data as FirTypeRef? - functionCall.explicitReceiver?.visitNoTransform(this, null) - functionCall.arguments.forEach { it.visitNoTransform(this, null) } + val receiver = functionCall.explicitReceiver + val arguments = functionCall.arguments val checkers = listOf(FunctionApplicabilityChecker(name).apply { expectedType = expectedTypeRef - explicitReceiverType = functionCall.explicitReceiver?.resultType - parameterCount = functionCall.arguments.size + explicitReceiverType = receiver?.resultType + parameterCount = arguments.size }, VariableInvokeApplicabilityChecker(name).apply { expectedType = expectedTypeRef variableChecker.apply { expectedType = expectedTypeRef - explicitReceiverType = functionCall.explicitReceiver?.resultType + explicitReceiverType = receiver?.resultType } - parameterCount = functionCall.arguments.size + parameterCount = arguments.size }) @@ -220,15 +217,19 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn is VariableInvokeApplicabilityChecker -> { FirFunctionCallImpl(functionCall.session, functionCall.psi, safe = functionCall.safe).apply { calleeReference = - functionCall.calleeReference.transformSingle(this@FirBodyResolveTransformer, result.successCandidates()) + functionCall.calleeReference.transformSingle(this@FirBodyResolveTransformer, result.successCandidates()) explicitReceiver = - FirQualifiedAccessExpressionImpl(functionCall.session, functionCall.calleeReference.psi, functionCall.safe).apply { - calleeReference = createResolvedNamedReference( - functionCall.calleeReference, - result.variableChecker.successCandidates() as List - ) - explicitReceiver = functionCall.explicitReceiver - } + FirQualifiedAccessExpressionImpl( + functionCall.session, + functionCall.calleeReference.psi, + functionCall.safe + ).apply { + calleeReference = createResolvedNamedReference( + functionCall.calleeReference, + result.variableChecker.successCandidates() as List + ) + explicitReceiver = functionCall.explicitReceiver + } } } is ApplicabilityChecker -> { @@ -356,21 +357,37 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } override fun transformVariable(variable: FirVariable, data: Any?): CompositeTransformResult { + val variable = super.transformVariable(variable, variable.returnTypeRef).single as FirVariable val initializer = variable.initializer - initializer?.visitNoTransform(this, variable.returnTypeRef) if (variable.returnTypeRef is FirImplicitTypeRef) { when { initializer != null -> { - variable.transformReturnTypeRef(this, initializer.resultType) + variable.transformReturnTypeRef( + this, + initializer.resultType ?: FirErrorTypeRefImpl( + session, + null, + "No result type for initializer" + ) + ) } variable.delegate != null -> { + // TODO: type from delegate + variable.transformReturnTypeRef( + this, + FirErrorTypeRefImpl( + session, + null, + "Not supported: type from delegate" + ) + ) } } } if (variable !is FirProperty) { localScopes.lastOrNull()?.storeDeclaration(variable) } - return super.transformVariable(variable, data) + return variable.compose() } override fun transformProperty(property: FirProperty, data: Any?): CompositeTransformResult { @@ -380,7 +397,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn fun FirElement.visitNoTransform(transformer: FirTransformer, data: D) { val result = this.transform(transformer, data) - require(result.single === this) + require(result.single === this) { "become ${result.single}: `${result.single.render()}`, was ${this}: `${this.render()}`" } } } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/access.txt b/compiler/fir/resolve/testData/resolve/expresssions/access.txt index c6ad45b3822..b8a2865d41a 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/access.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/access.txt @@ -3,7 +3,7 @@ FILE: access.kt public constructor(): super() public final val x: R|kotlin/Int| = Int(1) - public get(): + public get(): R|kotlin/Int| public final fun abc(): R|kotlin/Int| { ^abc R|/Foo.x| @@ -18,7 +18,7 @@ FILE: access.kt public constructor(): super() public final val x: R|kotlin/String| = String() - public get(): + public get(): R|kotlin/String| public final fun R|Foo|.abc(): R|kotlin/Int| { ^abc R|/Foo.x| diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.txt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.txt index 287ec2f2f23..ae12b0b0a25 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.txt @@ -9,7 +9,7 @@ FILE: extension.kt } public final val x: R|kotlin/Int| = Int(0) - public get(): + public get(): R|kotlin/Int| public final fun foo(): R|Foo| { ^foo R|/Foo.x|.R|/Foo.invoke|() diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.txt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.txt index 9648b4fc0e8..8af90b01b0c 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.txt @@ -8,7 +8,7 @@ FILE: farInvokeExtension.kt public constructor(): super() public final val x: R|kotlin/Int| = Int(0) - public get(): + public get(): R|kotlin/Int| public final fun foo(): R|kotlin/Unit| { ^foo R|/x|() diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/implicitTypeOrder.txt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/implicitTypeOrder.txt index 914802ffdd0..8ab7cf5a8ba 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/invoke/implicitTypeOrder.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/implicitTypeOrder.txt @@ -15,4 +15,4 @@ FILE: implicitTypeOrder.kt ^create R|/A.A|() } public final val foo: R|A| = R|/create|() - public get(): + public get(): R|A| diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt b/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt index ae18d1b3673..679974c39d9 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt @@ -1,6 +1,6 @@ FILE: localImplicitBodies.kt public final fun foo(): R|kotlin/Unit| { - lval x: R|kotlin/Unit| = object : { + lval x: = object : { public constructor(): super() public final fun sss(): { diff --git a/compiler/fir/resolve/testData/resolve/expresssions/simple.txt b/compiler/fir/resolve/testData/resolve/expresssions/simple.txt index 9be18d8d815..69a860b8d4f 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/simple.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/simple.txt @@ -3,8 +3,8 @@ FILE: simple.kt lval x: R|kotlin/Int| = Int(1) } public final val bar: R|kotlin/String| = String() - public get(): + public get(): R|kotlin/String| public final val n: R|kotlin/Nothing|? = Null(null) - public get(): + public get(): R|kotlin/Nothing|? public final val g: R|kotlin/String|? = Null(null) public get(): R|kotlin/String|? diff --git a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt index 92f42c7183a..bda8591998c 100644 --- a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt +++ b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt @@ -63,7 +63,7 @@ FILE: enums.kt public constructor(): super() public final const val G: R|kotlin/Double| = Double(6.67E-11) - public get(): + public get(): R|kotlin/Double| } diff --git a/compiler/fir/resolve/testData/resolve/fromBuilder/simpleClass.txt b/compiler/fir/resolve/testData/resolve/fromBuilder/simpleClass.txt index 3072b3f7b38..94682c1f4d4 100644 --- a/compiler/fir/resolve/testData/resolve/fromBuilder/simpleClass.txt +++ b/compiler/fir/resolve/testData/resolve/fromBuilder/simpleClass.txt @@ -10,7 +10,7 @@ FILE: simpleClass.kt public constructor(): super() private final val baz: R|kotlin/Int| = Int(42) - private get(): + private get(): R|kotlin/Int| public final override fun foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String| { ^foo #(#(R|/y|, R|/x|), R|/SomeClass.baz|) diff --git a/compiler/fir/resolve/testData/resolve/simpleClass.txt b/compiler/fir/resolve/testData/resolve/simpleClass.txt index 66b957e4b60..c0c297653b2 100644 --- a/compiler/fir/resolve/testData/resolve/simpleClass.txt +++ b/compiler/fir/resolve/testData/resolve/simpleClass.txt @@ -10,7 +10,7 @@ FILE: simpleClass.kt public constructor(): super() private final val baz: R|kotlin/Int| = Int(42) - private get(): + private get(): R|kotlin/Int| public final override fun foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String| { ^foo #(#(R|/y|, R|/x|), R|/SomeClass.baz|)