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> {
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) {
@@ -710,7 +710,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
}
override fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef) {
print(if (implicitTypeRef is FirImplicitBuiltinTypeRef) "${implicitTypeRef.id}" else "<implicit>")
print("<implicit>")
}
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)
}
@@ -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<FirAnnotationCall>
get() = emptyList()
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(