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> {
|
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)
|
||||||
}
|
}
|
||||||
|
|||||||
+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.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(
|
||||||
|
|||||||
Reference in New Issue
Block a user