From de4bfb3973176184a2afbc2efc0e6abbc30b67d5 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 24 Jan 2020 15:00:13 +0300 Subject: [PATCH] FIR: Implement FirApplyInferredDeclarationTypesTransformer --- .../body/resolve/FirImplicitBodyResolve.kt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 00eaf284ec1..e1dc3703c01 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic +import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ScopeSession @@ -23,6 +24,7 @@ import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult +import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.compose @@ -47,6 +49,41 @@ class FirImplicitTypeBodyResolveTransformerAdapter2 : FirTransformer() } } +// TODO: This class is unused because it's effectively unneeded while we have mutable trees +// Once we decide to switch to persistent trees this, it should be applied to each file +// If the decision is to stay with mutable trees, this class should be removed +private class FirApplyInferredDeclarationTypesTransformer( + private val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession +) : FirDefaultTransformer() { + override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { + return element.compose() + } + + override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { + file.replaceResolvePhase(FirResolvePhase.SUPER_TYPES) + + return (file.transformChildren(this, null) as FirFile).compose() + } + + override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult { + return (regularClass.transformChildren(this, null) as FirRegularClass).compose() + } + + override fun transformSimpleFunction(simpleFunction: FirSimpleFunction, data: Nothing?): CompositeTransformResult { + if (simpleFunction.returnTypeRef !is FirImplicitTypeRef) return simpleFunction.compose() + + val transformedDeclaration = implicitBodyResolveComputationSession.getComputedResult(simpleFunction.symbol).transformedDeclaration + return transformedDeclaration.compose() + } + + override fun transformProperty(property: FirProperty, data: Nothing?): CompositeTransformResult { + if (property.returnTypeRef !is FirImplicitTypeRef) return property.compose() + + val transformedDeclaration = implicitBodyResolveComputationSession.getComputedResult(property.symbol).transformedDeclaration + return transformedDeclaration.compose() + } +} + private open class MyFirBodyResolveTransformer( session: FirSession, scopeSession: ScopeSession, @@ -235,6 +272,15 @@ private class ImplicitBodyResolveComputationSession { implicitBodyResolveStatusMap[symbol] = ImplicitBodyResolveComputationStatus.Computed(returnTypeRef, transformedDeclaration) } + + fun getComputedResult(symbol: FirCallableSymbol<*>): ImplicitBodyResolveComputationStatus.Computed { + val status = getStatus(symbol) + require(status is ImplicitBodyResolveComputationStatus.Computed) { + "Unexpected status $status for ${symbol.fir.render()}" + } + + return status + } } private sealed class ImplicitBodyResolveComputationStatus {