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.
This commit is contained in:
Mikhail Glukhikh
2019-06-19 14:40:36 +03:00
parent 2efbc6e914
commit ac730a693a
3 changed files with 12 additions and 13 deletions
@@ -898,10 +898,10 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
override fun transformNamedFunction(namedFunction: FirNamedFunction, data: Any?): CompositeTransformResult<FirDeclaration> { override fun transformNamedFunction(namedFunction: FirNamedFunction, data: Any?): CompositeTransformResult<FirDeclaration> {
val returnTypeRef = namedFunction.returnTypeRef val returnTypeRef = namedFunction.returnTypeRef
if ((returnTypeRef !is FirImplicitTypeRef || returnTypeRef is FirResolvedTypeRef) && implicitTypeOnly) { if ((returnTypeRef !is FirImplicitTypeRef) && implicitTypeOnly) {
return namedFunction.compose() return namedFunction.compose()
} }
if (returnTypeRef is FirImplicitTypeRef && returnTypeRef !is FirResolvedTypeRef) { if (returnTypeRef is FirImplicitTypeRef) {
namedFunction.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) namedFunction.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef)
} }
@@ -920,10 +920,10 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
return super.transformPropertyAccessor(propertyAccessor, data) return super.transformPropertyAccessor(propertyAccessor, data)
} }
val returnTypeRef = propertyAccessor.returnTypeRef val returnTypeRef = propertyAccessor.returnTypeRef
if ((returnTypeRef !is FirImplicitTypeRef || returnTypeRef is FirResolvedTypeRef) && implicitTypeOnly) { if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) {
return propertyAccessor.compose() return propertyAccessor.compose()
} }
if (returnTypeRef is FirImplicitTypeRef && returnTypeRef !is FirResolvedTypeRef && data !is FirResolvedTypeRef) { if (returnTypeRef is FirImplicitTypeRef && data !is FirResolvedTypeRef) {
propertyAccessor.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) propertyAccessor.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef)
} }
return if (data is FirResolvedTypeRef && returnTypeRef !is FirResolvedTypeRef) { return if (data is FirResolvedTypeRef && returnTypeRef !is FirResolvedTypeRef) {
@@ -710,7 +710,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
} }
override fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef) { override fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef) {
print(if (implicitTypeRef is FirImplicitBuiltinTypeRef) "${implicitTypeRef.id}" else "<implicit>") print("<implicit>")
} }
override fun visitTypeRefWithNullability(typeRefWithNullability: FirTypeRefWithNullability) { override fun visitTypeRefWithNullability(typeRefWithNullability: FirTypeRefWithNullability) {
@@ -740,10 +740,14 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) { override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) {
resolvedTypeRef.annotations.renderAnnotations() resolvedTypeRef.annotations.renderAnnotations()
print("R|") if (resolvedTypeRef !is FirImplicitBuiltinTypeRef) {
print("R|")
}
val coneType = resolvedTypeRef.type val coneType = resolvedTypeRef.type
print(coneType.render()) print(coneType.render())
print("|") if (resolvedTypeRef !is FirImplicitBuiltinTypeRef) {
print("|")
}
if (coneType !is ConeKotlinErrorType && coneType !is ConeClassErrorType) { if (coneType !is ConeKotlinErrorType && coneType !is ConeClassErrorType) {
print(coneType.nullability.suffix) print(coneType.nullability.suffix)
} }
@@ -11,23 +11,18 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.types.ConeKotlinType 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.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
sealed class FirImplicitBuiltinTypeRef( sealed class FirImplicitBuiltinTypeRef(
override val session: FirSession, override val session: FirSession,
override val psi: PsiElement?, override val psi: PsiElement?,
val id: ClassId val id: ClassId
) : FirImplicitTypeRef, FirResolvedTypeRef { ) : FirResolvedTypeRef {
override val annotations: List<FirAnnotationCall> override val annotations: List<FirAnnotationCall>
get() = emptyList() get() = emptyList()
override val type: ConeKotlinType = ConeClassTypeImpl(ConeClassLikeLookupTagImpl(id), emptyArray(), false) override val type: ConeKotlinType = ConeClassTypeImpl(ConeClassLikeLookupTagImpl(id), emptyArray(), false)
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitImplicitTypeRef(this, data)
} }
class FirImplicitUnitTypeRef( class FirImplicitUnitTypeRef(