From ac730a693a16d1c3a197d870d5b7f3f8f37178e9 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 19 Jun 2019 14:40:36 +0300 Subject: [PATCH] FIR: don't count implicit built-in type as a kind of implicit type Before this commit, implicit Unit type for function with body and without type, implicit Boolean type for conditions etc. were 'implicit' types and resolved types together. Sometimes this could lead to hard-to-find issues in FIR resolve, because 'implicit' types are usually handled there as 'necessary to resolve' which is wrong for such effectively-resolved types. --- .../resolve/transformers/FirBodyResolveTransformer.kt | 8 ++++---- .../tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt | 10 +++++++--- .../kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt | 7 +------ 3 files changed, 12 insertions(+), 13 deletions(-) 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 b356e24e02e..dc533f06c5c 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 @@ -898,10 +898,10 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn override fun transformNamedFunction(namedFunction: FirNamedFunction, data: Any?): CompositeTransformResult { val returnTypeRef = namedFunction.returnTypeRef - if ((returnTypeRef !is FirImplicitTypeRef || returnTypeRef is FirResolvedTypeRef) && implicitTypeOnly) { + if ((returnTypeRef !is FirImplicitTypeRef) && implicitTypeOnly) { return namedFunction.compose() } - if (returnTypeRef is FirImplicitTypeRef && returnTypeRef !is FirResolvedTypeRef) { + if (returnTypeRef is FirImplicitTypeRef) { namedFunction.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) } @@ -920,10 +920,10 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn return super.transformPropertyAccessor(propertyAccessor, data) } val returnTypeRef = propertyAccessor.returnTypeRef - if ((returnTypeRef !is FirImplicitTypeRef || returnTypeRef is FirResolvedTypeRef) && implicitTypeOnly) { + if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) { return propertyAccessor.compose() } - if (returnTypeRef is FirImplicitTypeRef && returnTypeRef !is FirResolvedTypeRef && data !is FirResolvedTypeRef) { + if (returnTypeRef is FirImplicitTypeRef && data !is FirResolvedTypeRef) { propertyAccessor.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) } return if (data is FirResolvedTypeRef && returnTypeRef !is FirResolvedTypeRef) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index abc950cb27d..e313700daf8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -710,7 +710,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { } override fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef) { - print(if (implicitTypeRef is FirImplicitBuiltinTypeRef) "${implicitTypeRef.id}" else "") + print("") } override fun visitTypeRefWithNullability(typeRefWithNullability: FirTypeRefWithNullability) { @@ -740,10 +740,14 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) { resolvedTypeRef.annotations.renderAnnotations() - print("R|") + if (resolvedTypeRef !is FirImplicitBuiltinTypeRef) { + print("R|") + } val coneType = resolvedTypeRef.type print(coneType.render()) - print("|") + if (resolvedTypeRef !is FirImplicitBuiltinTypeRef) { + print("|") + } if (coneType !is ConeKotlinErrorType && coneType !is ConeClassErrorType) { print(coneType.nullability.suffix) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt index 29790128f1c..92a066de9b7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt @@ -11,23 +11,18 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef -import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.name.ClassId sealed class FirImplicitBuiltinTypeRef( override val session: FirSession, override val psi: PsiElement?, val id: ClassId -) : FirImplicitTypeRef, FirResolvedTypeRef { +) : FirResolvedTypeRef { override val annotations: List get() = emptyList() override val type: ConeKotlinType = ConeClassTypeImpl(ConeClassLikeLookupTagImpl(id), emptyArray(), false) - - override fun accept(visitor: FirVisitor, data: D): R = - visitor.visitImplicitTypeRef(this, data) } class FirImplicitUnitTypeRef(