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:
+4
-4
@@ -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)
|
||||
}
|
||||
|
||||
+1
-6
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user