KAPT+IR: support nullability for error types
#KT-49682
This commit is contained in:
@@ -29,7 +29,11 @@ abstract class IrType : KotlinTypeMarker, IrAnnotationContainer {
|
|||||||
abstract override fun hashCode(): Int
|
abstract override fun hashCode(): Int
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class IrErrorType(kotlinType: KotlinType?, private val errorClassStubSymbol: IrClassSymbol) : IrTypeBase(kotlinType), SimpleTypeMarker {
|
abstract class IrErrorType(
|
||||||
|
kotlinType: KotlinType?,
|
||||||
|
private val errorClassStubSymbol: IrClassSymbol,
|
||||||
|
val isMarkedNullable: Boolean = false
|
||||||
|
) : IrTypeBase(kotlinType), SimpleTypeMarker {
|
||||||
val symbol: IrClassSymbol
|
val symbol: IrClassSymbol
|
||||||
get() = errorClassStubSymbol
|
get() = errorClassStubSymbol
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ fun IrType.isNullable(): Boolean =
|
|||||||
else -> error("Unsupported classifier: $classifier")
|
else -> error("Unsupported classifier: $classifier")
|
||||||
}
|
}
|
||||||
is IrDynamicType -> true
|
is IrDynamicType -> true
|
||||||
|
is IrErrorType -> this.isMarkedNullable
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.ir.types.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||||
|
import org.jetbrains.kotlin.ir.IrFileEntry
|
||||||
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
object IrErrorClassImpl : IrClassImpl(
|
||||||
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.ERROR_CLASS, IrClassSymbolImpl(),
|
||||||
|
Name.special("<error>"), ClassKind.CLASS, DescriptorVisibilities.DEFAULT_VISIBILITY, Modality.FINAL
|
||||||
|
) {
|
||||||
|
override var parent: IrDeclarationParent
|
||||||
|
get() = object : IrFile() {
|
||||||
|
override val startOffset: Int
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
override val endOffset: Int
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
override var annotations: List<IrConstructorCall>
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
set(_) {}
|
||||||
|
override val declarations: MutableList<IrDeclaration>
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
override val symbol: IrFileSymbol
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
override val module: IrModuleFragment
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
override val fileEntry: IrFileEntry
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
set(_) {}
|
||||||
|
|
||||||
|
@ObsoleteDescriptorBasedAPI
|
||||||
|
override val packageFragmentDescriptor: PackageFragmentDescriptor
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
override val fqName: FqName
|
||||||
|
get() = FqName.ROOT
|
||||||
|
}
|
||||||
|
set(_) = TODO()
|
||||||
|
}
|
||||||
@@ -5,26 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.types.impl
|
package org.jetbrains.kotlin.ir.types.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
|
||||||
import org.jetbrains.kotlin.ir.IrFileEntry
|
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.name.SpecialNames
|
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.types.model.CaptureStatus
|
import org.jetbrains.kotlin.types.model.CaptureStatus
|
||||||
@@ -40,46 +25,13 @@ class IrErrorTypeImpl(
|
|||||||
kotlinType: KotlinType?,
|
kotlinType: KotlinType?,
|
||||||
override val annotations: List<IrConstructorCall>,
|
override val annotations: List<IrConstructorCall>,
|
||||||
override val variance: Variance,
|
override val variance: Variance,
|
||||||
) : IrErrorType(kotlinType, IrErrorClassImpl.symbol) {
|
isMarkedNullable: Boolean = false
|
||||||
|
) : IrErrorType(kotlinType, IrErrorClassImpl.symbol, isMarkedNullable) {
|
||||||
override fun equals(other: Any?): Boolean = other is IrErrorTypeImpl
|
override fun equals(other: Any?): Boolean = other is IrErrorTypeImpl
|
||||||
|
|
||||||
override fun hashCode(): Int = IrErrorTypeImpl::class.java.hashCode()
|
override fun hashCode(): Int = IrErrorTypeImpl::class.java.hashCode()
|
||||||
}
|
}
|
||||||
|
|
||||||
object IrErrorClassImpl : IrClassImpl(
|
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.ERROR_CLASS, IrClassSymbolImpl(),
|
|
||||||
Name.special("<error>"), ClassKind.CLASS, DescriptorVisibilities.DEFAULT_VISIBILITY, Modality.FINAL
|
|
||||||
) {
|
|
||||||
override var parent: IrDeclarationParent
|
|
||||||
get() = object: IrFile() {
|
|
||||||
override val startOffset: Int
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override val endOffset: Int
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override var annotations: List<IrConstructorCall>
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
set(_) {}
|
|
||||||
override val declarations: MutableList<IrDeclaration>
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override val symbol: IrFileSymbol
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override val module: IrModuleFragment
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override val fileEntry: IrFileEntry
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override var metadata: MetadataSource?
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
set(_) {}
|
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
|
||||||
override val packageFragmentDescriptor: PackageFragmentDescriptor
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override val fqName: FqName
|
|
||||||
get() = FqName.ROOT
|
|
||||||
}
|
|
||||||
set(_) = TODO()
|
|
||||||
}
|
|
||||||
|
|
||||||
class IrDynamicTypeImpl(
|
class IrDynamicTypeImpl(
|
||||||
kotlinType: KotlinType?,
|
kotlinType: KotlinType?,
|
||||||
override val annotations: List<IrConstructorCall>,
|
override val annotations: List<IrConstructorCall>,
|
||||||
@@ -90,7 +42,6 @@ class IrDynamicTypeImpl(
|
|||||||
override fun hashCode(): Int = IrDynamicTypeImpl::class.java.hashCode()
|
override fun hashCode(): Int = IrDynamicTypeImpl::class.java.hashCode()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val IrType.originalKotlinType: KotlinType?
|
val IrType.originalKotlinType: KotlinType?
|
||||||
get() = safeAs<IrTypeBase>()?.kotlinType
|
get() = safeAs<IrTypeBase>()?.kotlinType
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ abstract class TypeTranslator(
|
|||||||
approximatedType,
|
approximatedType,
|
||||||
translateTypeAnnotations(approximatedType),
|
translateTypeAnnotations(approximatedType),
|
||||||
variance,
|
variance,
|
||||||
|
isMarkedNullable = approximatedType.isMarkedNullable,
|
||||||
)
|
)
|
||||||
approximatedType.isDynamic() ->
|
approximatedType.isDynamic() ->
|
||||||
return IrDynamicTypeImpl(approximatedType, translateTypeAnnotations(approximatedType), variance)
|
return IrDynamicTypeImpl(approximatedType, translateTypeAnnotations(approximatedType), variance)
|
||||||
|
|||||||
Reference in New Issue
Block a user