[FIR] Split cone types declarations into multiple files
This commit is contained in:
committed by
teamcity
parent
84913772ec
commit
9c6292db6f
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* 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.fir.types
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.types.model.TypeConstructorMarker
|
||||||
|
|
||||||
|
abstract class ConeIntegerLiteralType(
|
||||||
|
val value: Long,
|
||||||
|
val isUnsigned: Boolean,
|
||||||
|
override val nullability: ConeNullability
|
||||||
|
) : ConeSimpleKotlinType(), TypeConstructorMarker {
|
||||||
|
abstract val possibleTypes: Collection<ConeClassLikeType>
|
||||||
|
abstract val supertypes: List<ConeClassLikeType>
|
||||||
|
|
||||||
|
override val typeArguments: Array<out ConeTypeProjection> = emptyArray()
|
||||||
|
|
||||||
|
abstract fun getApproximatedType(expectedType: ConeKotlinType? = null): ConeClassLikeType
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as ConeIntegerLiteralType
|
||||||
|
|
||||||
|
if (possibleTypes != other.possibleTypes) return false
|
||||||
|
if (nullability != other.nullability) return false
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return 31 * possibleTypes.hashCode() + nullability.hashCode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun ConeIntegerLiteralType.canBeInt(): Boolean {
|
||||||
|
return value in Int.MIN_VALUE..Int.MAX_VALUE
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* 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.fir.types
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.types.model.TypeArgumentMarker
|
||||||
|
|
||||||
|
enum class ProjectionKind {
|
||||||
|
STAR, IN, OUT, INVARIANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class ConeTypeProjection : TypeArgumentMarker {
|
||||||
|
abstract val kind: ProjectionKind
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val EMPTY_ARRAY = arrayOf<ConeTypeProjection>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object ConeStarProjection : ConeTypeProjection() {
|
||||||
|
override val kind: ProjectionKind
|
||||||
|
get() = ProjectionKind.STAR
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class ConeKotlinTypeProjection : ConeTypeProjection() {
|
||||||
|
abstract val type: ConeKotlinType
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (other !is ConeKotlinTypeProjection) return false
|
||||||
|
|
||||||
|
if (kind != other.kind) return false
|
||||||
|
if (type != other.type) return false
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return type.hashCode() * 31 + kind.hashCode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ConeKotlinTypeProjectionIn(override val type: ConeKotlinType) : ConeKotlinTypeProjection() {
|
||||||
|
override val kind: ProjectionKind
|
||||||
|
get() = ProjectionKind.IN
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ConeKotlinTypeProjectionOut(override val type: ConeKotlinType) : ConeKotlinTypeProjection() {
|
||||||
|
override val kind: ProjectionKind
|
||||||
|
get() = ProjectionKind.OUT
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ConeKotlinTypeConflictingProjection(override val type: ConeKotlinType) : ConeKotlinTypeProjection() {
|
||||||
|
override val kind: ProjectionKind
|
||||||
|
get() = ProjectionKind.INVARIANT
|
||||||
|
}
|
||||||
|
|
||||||
|
val ConeTypeProjection.type: ConeKotlinType?
|
||||||
|
get() = when (this) {
|
||||||
|
ConeStarProjection -> null
|
||||||
|
is ConeKotlinTypeProjection -> type
|
||||||
|
is ConeKotlinType -> this
|
||||||
|
}
|
||||||
|
|
||||||
|
val ConeTypeProjection.isStarProjection: Boolean
|
||||||
|
get() = this == ConeStarProjection
|
||||||
+125
@@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* 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.fir.types
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.types.model.*
|
||||||
|
|
||||||
|
// ----------------------------------- Type variable type -----------------------------------
|
||||||
|
|
||||||
|
class ConeTypeVariableType(
|
||||||
|
override val nullability: ConeNullability,
|
||||||
|
override val lookupTag: ConeTypeVariableTypeConstructor,
|
||||||
|
override val attributes: ConeAttributes = ConeAttributes.Empty,
|
||||||
|
) : ConeLookupTagBasedType() {
|
||||||
|
override val typeArguments: Array<out ConeTypeProjection> get() = emptyArray()
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (other !is ConeTypeVariableType) return false
|
||||||
|
|
||||||
|
if (nullability != other.nullability) return false
|
||||||
|
if (lookupTag != other.lookupTag) return false
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
var result = 0
|
||||||
|
result = 31 * result + nullability.hashCode()
|
||||||
|
result = 31 * result + lookupTag.hashCode()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConeTypeVariableTypeConstructor(
|
||||||
|
val debugName: String,
|
||||||
|
val originalTypeParameter: TypeParameterMarker?
|
||||||
|
) : ConeClassifierLookupTag(), TypeVariableTypeConstructorMarker {
|
||||||
|
override val name: Name get() = Name.identifier(debugName)
|
||||||
|
|
||||||
|
var isContainedInInvariantOrContravariantPositions: Boolean = false
|
||||||
|
private set
|
||||||
|
|
||||||
|
fun recordInfoAboutTypeVariableUsagesAsInvariantOrContravariantParameter() {
|
||||||
|
isContainedInInvariantOrContravariantPositions = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------- Stub types -----------------------------------
|
||||||
|
|
||||||
|
data class ConeStubTypeConstructor(
|
||||||
|
val variable: ConeTypeVariable,
|
||||||
|
val isTypeVariableInSubtyping: Boolean,
|
||||||
|
val isForFixation: Boolean = false,
|
||||||
|
) : TypeConstructorMarker
|
||||||
|
|
||||||
|
sealed class ConeStubType(val constructor: ConeStubTypeConstructor, override val nullability: ConeNullability) : StubTypeMarker,
|
||||||
|
ConeSimpleKotlinType() {
|
||||||
|
|
||||||
|
override val typeArguments: Array<out ConeTypeProjection>
|
||||||
|
get() = emptyArray()
|
||||||
|
|
||||||
|
override val attributes: ConeAttributes
|
||||||
|
get() = ConeAttributes.Empty
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as ConeStubType
|
||||||
|
|
||||||
|
if (constructor != other.constructor) return false
|
||||||
|
if (nullability != other.nullability) return false
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
var result = 0
|
||||||
|
result = 31 * result + constructor.hashCode()
|
||||||
|
result = 31 * result + nullability.hashCode()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class ConeStubTypeForChainInference(
|
||||||
|
constructor: ConeStubTypeConstructor,
|
||||||
|
nullability: ConeNullability
|
||||||
|
) : ConeStubType(constructor, nullability) {
|
||||||
|
constructor(variable: ConeTypeVariable, nullability: ConeNullability) : this(
|
||||||
|
ConeStubTypeConstructor(
|
||||||
|
variable,
|
||||||
|
isTypeVariableInSubtyping = false
|
||||||
|
), nullability
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConeStubTypeForSyntheticFixation(
|
||||||
|
constructor: ConeStubTypeConstructor,
|
||||||
|
nullability: ConeNullability
|
||||||
|
) : ConeStubTypeForChainInference(constructor, nullability)
|
||||||
|
|
||||||
|
class ConeStubTypeForTypeVariableInSubtyping(
|
||||||
|
constructor: ConeStubTypeConstructor,
|
||||||
|
nullability: ConeNullability
|
||||||
|
) : ConeStubType(constructor, nullability) {
|
||||||
|
constructor(variable: ConeTypeVariable, nullability: ConeNullability) : this(
|
||||||
|
ConeStubTypeConstructor(
|
||||||
|
variable,
|
||||||
|
isTypeVariableInSubtyping = true
|
||||||
|
), nullability
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
open class ConeTypeVariable(name: String, originalTypeParameter: TypeParameterMarker? = null) : TypeVariableMarker {
|
||||||
|
val typeConstructor = ConeTypeVariableTypeConstructor(name, originalTypeParameter)
|
||||||
|
val defaultType = ConeTypeVariableType(ConeNullability.NOT_NULL, typeConstructor)
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return defaultType.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,70 +9,9 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
|||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.types.model.*
|
import org.jetbrains.kotlin.types.model.*
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.foldMap
|
import org.jetbrains.kotlin.utils.addToStdlib.foldMap
|
||||||
|
|
||||||
enum class ProjectionKind {
|
|
||||||
STAR, IN, OUT, INVARIANT;
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed class ConeTypeProjection : TypeArgumentMarker {
|
|
||||||
abstract val kind: ProjectionKind
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
val EMPTY_ARRAY = arrayOf<ConeTypeProjection>()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object ConeStarProjection : ConeTypeProjection() {
|
|
||||||
override val kind: ProjectionKind
|
|
||||||
get() = ProjectionKind.STAR
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed class ConeKotlinTypeProjection : ConeTypeProjection() {
|
|
||||||
abstract val type: ConeKotlinType
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (other !is ConeKotlinTypeProjection) return false
|
|
||||||
|
|
||||||
if (kind != other.kind) return false
|
|
||||||
if (type != other.type) return false
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
return type.hashCode() * 31 + kind.hashCode()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ConeKotlinTypeProjectionIn(override val type: ConeKotlinType) : ConeKotlinTypeProjection() {
|
|
||||||
override val kind: ProjectionKind
|
|
||||||
get() = ProjectionKind.IN
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ConeKotlinTypeProjectionOut(override val type: ConeKotlinType) : ConeKotlinTypeProjection() {
|
|
||||||
override val kind: ProjectionKind
|
|
||||||
get() = ProjectionKind.OUT
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ConeKotlinTypeConflictingProjection(override val type: ConeKotlinType) : ConeKotlinTypeProjection() {
|
|
||||||
override val kind: ProjectionKind
|
|
||||||
get() = ProjectionKind.INVARIANT
|
|
||||||
}
|
|
||||||
|
|
||||||
val ConeTypeProjection.type: ConeKotlinType?
|
|
||||||
get() = when (this) {
|
|
||||||
ConeStarProjection -> null
|
|
||||||
is ConeKotlinTypeProjection -> type
|
|
||||||
is ConeKotlinType -> this
|
|
||||||
}
|
|
||||||
|
|
||||||
val ConeTypeProjection.isStarProjection: Boolean
|
|
||||||
get() = this == ConeStarProjection
|
|
||||||
|
|
||||||
// We assume type IS an invariant type projection to prevent additional wrapper here
|
// We assume type IS an invariant type projection to prevent additional wrapper here
|
||||||
// (more exactly, invariant type projection contains type)
|
// (more exactly, invariant type projection contains type)
|
||||||
sealed class ConeKotlinType : ConeKotlinTypeProjection(), KotlinTypeMarker, TypeArgumentListMarker {
|
sealed class ConeKotlinType : ConeKotlinTypeProjection(), KotlinTypeMarker, TypeArgumentListMarker {
|
||||||
@@ -237,31 +176,6 @@ data class ConeCapturedType(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ConeTypeVariableType(
|
|
||||||
override val nullability: ConeNullability,
|
|
||||||
override val lookupTag: ConeTypeVariableTypeConstructor,
|
|
||||||
override val attributes: ConeAttributes = ConeAttributes.Empty,
|
|
||||||
) : ConeLookupTagBasedType() {
|
|
||||||
override val typeArguments: Array<out ConeTypeProjection> get() = emptyArray()
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (other !is ConeTypeVariableType) return false
|
|
||||||
|
|
||||||
if (nullability != other.nullability) return false
|
|
||||||
if (lookupTag != other.lookupTag) return false
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
var result = 0
|
|
||||||
result = 31 * result + nullability.hashCode()
|
|
||||||
result = 31 * result + lookupTag.hashCode()
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ConeDefinitelyNotNullType(val original: ConeSimpleKotlinType) : ConeSimpleKotlinType(), DefinitelyNotNullTypeMarker {
|
data class ConeDefinitelyNotNullType(val original: ConeSimpleKotlinType) : ConeSimpleKotlinType(), DefinitelyNotNullTypeMarker {
|
||||||
override val typeArguments: Array<out ConeTypeProjection>
|
override val typeArguments: Array<out ConeTypeProjection>
|
||||||
@@ -328,123 +242,3 @@ fun ConeIntersectionType.withAlternative(alternativeType: ConeKotlinType): ConeI
|
|||||||
fun ConeIntersectionType.mapTypes(func: (ConeKotlinType) -> ConeKotlinType): ConeIntersectionType {
|
fun ConeIntersectionType.mapTypes(func: (ConeKotlinType) -> ConeKotlinType): ConeIntersectionType {
|
||||||
return ConeIntersectionType(intersectedTypes.map(func), alternativeType?.let(func))
|
return ConeIntersectionType(intersectedTypes.map(func), alternativeType?.let(func))
|
||||||
}
|
}
|
||||||
|
|
||||||
data class ConeStubTypeConstructor(
|
|
||||||
val variable: ConeTypeVariable,
|
|
||||||
val isTypeVariableInSubtyping: Boolean,
|
|
||||||
val isForFixation: Boolean = false,
|
|
||||||
) : TypeConstructorMarker
|
|
||||||
|
|
||||||
sealed class ConeStubType(val constructor: ConeStubTypeConstructor, override val nullability: ConeNullability) : StubTypeMarker,
|
|
||||||
ConeSimpleKotlinType() {
|
|
||||||
|
|
||||||
override val typeArguments: Array<out ConeTypeProjection>
|
|
||||||
get() = emptyArray()
|
|
||||||
|
|
||||||
override val attributes: ConeAttributes
|
|
||||||
get() = ConeAttributes.Empty
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (javaClass != other?.javaClass) return false
|
|
||||||
|
|
||||||
other as ConeStubType
|
|
||||||
|
|
||||||
if (constructor != other.constructor) return false
|
|
||||||
if (nullability != other.nullability) return false
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
var result = 0
|
|
||||||
result = 31 * result + constructor.hashCode()
|
|
||||||
result = 31 * result + nullability.hashCode()
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class ConeStubTypeForChainInference(
|
|
||||||
constructor: ConeStubTypeConstructor,
|
|
||||||
nullability: ConeNullability
|
|
||||||
) : ConeStubType(constructor, nullability) {
|
|
||||||
constructor(variable: ConeTypeVariable, nullability: ConeNullability) : this(
|
|
||||||
ConeStubTypeConstructor(
|
|
||||||
variable,
|
|
||||||
isTypeVariableInSubtyping = false
|
|
||||||
), nullability
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class ConeStubTypeForSyntheticFixation(
|
|
||||||
constructor: ConeStubTypeConstructor,
|
|
||||||
nullability: ConeNullability
|
|
||||||
) : ConeStubTypeForChainInference(constructor, nullability)
|
|
||||||
|
|
||||||
class ConeStubTypeForTypeVariableInSubtyping(
|
|
||||||
constructor: ConeStubTypeConstructor,
|
|
||||||
nullability: ConeNullability
|
|
||||||
) : ConeStubType(constructor, nullability) {
|
|
||||||
constructor(variable: ConeTypeVariable, nullability: ConeNullability) : this(
|
|
||||||
ConeStubTypeConstructor(
|
|
||||||
variable,
|
|
||||||
isTypeVariableInSubtyping = true
|
|
||||||
), nullability
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
open class ConeTypeVariable(name: String, originalTypeParameter: TypeParameterMarker? = null) : TypeVariableMarker {
|
|
||||||
val typeConstructor = ConeTypeVariableTypeConstructor(name, originalTypeParameter)
|
|
||||||
val defaultType = ConeTypeVariableType(ConeNullability.NOT_NULL, typeConstructor)
|
|
||||||
|
|
||||||
override fun toString(): String {
|
|
||||||
return defaultType.toString()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ConeTypeVariableTypeConstructor(
|
|
||||||
val debugName: String,
|
|
||||||
val originalTypeParameter: TypeParameterMarker?
|
|
||||||
) : ConeClassifierLookupTag(), TypeVariableTypeConstructorMarker {
|
|
||||||
override val name: Name get() = Name.identifier(debugName)
|
|
||||||
|
|
||||||
var isContainedInInvariantOrContravariantPositions: Boolean = false
|
|
||||||
private set
|
|
||||||
|
|
||||||
fun recordInfoAboutTypeVariableUsagesAsInvariantOrContravariantParameter() {
|
|
||||||
isContainedInInvariantOrContravariantPositions = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class ConeIntegerLiteralType(
|
|
||||||
val value: Long,
|
|
||||||
val isUnsigned: Boolean,
|
|
||||||
override val nullability: ConeNullability
|
|
||||||
) : ConeSimpleKotlinType(), TypeConstructorMarker {
|
|
||||||
abstract val possibleTypes: Collection<ConeClassLikeType>
|
|
||||||
abstract val supertypes: List<ConeClassLikeType>
|
|
||||||
|
|
||||||
override val typeArguments: Array<out ConeTypeProjection> = emptyArray()
|
|
||||||
|
|
||||||
abstract fun getApproximatedType(expectedType: ConeKotlinType? = null): ConeClassLikeType
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (javaClass != other?.javaClass) return false
|
|
||||||
|
|
||||||
other as ConeIntegerLiteralType
|
|
||||||
|
|
||||||
if (possibleTypes != other.possibleTypes) return false
|
|
||||||
if (nullability != other.nullability) return false
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
return 31 * possibleTypes.hashCode() + nullability.hashCode()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ConeIntegerLiteralType.canBeInt(): Boolean {
|
|
||||||
return value in Int.MIN_VALUE..Int.MAX_VALUE
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user