[Analysis API] separate non-class error types from class error types and add information about type qualifiers

it's needed for type printing in renderer
This commit is contained in:
Ilya Kirillov
2022-10-14 15:35:03 +02:00
parent 210212c284
commit 725ae1fc65
35 changed files with 510 additions and 83 deletions
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.components
import org.jetbrains.kotlin.analysis.api.KtStarProjectionTypeArgument
import org.jetbrains.kotlin.analysis.api.KtStarTypeProjection
import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance
import org.jetbrains.kotlin.analysis.api.components.KtClassTypeBuilder
import org.jetbrains.kotlin.analysis.api.components.KtTypeCreator
@@ -60,7 +60,7 @@ internal class KtFe10TypeCreator(
val type = if (typeParameters.size == builder.arguments.size) {
val projections = builder.arguments.mapIndexed { index, arg ->
when (arg) {
is KtStarProjectionTypeArgument -> StarProjectionImpl(typeParameters[index])
is KtStarTypeProjection -> StarProjectionImpl(typeParameters[index])
is KtTypeArgumentWithVariance -> TypeProjectionImpl(arg.variance, (arg.type as KtFe10Type).type)
}
}
@@ -252,7 +252,12 @@ internal fun KotlinType.toKtType(analysisContext: Fe10AnalysisContext): KtType {
is DynamicType -> KtFe10DynamicType(unwrappedType, analysisContext)
is FlexibleType -> KtFe10FlexibleType(unwrappedType, analysisContext)
is DefinitelyNotNullType -> KtFe10DefinitelyNotNullType(unwrappedType, analysisContext)
is ErrorType -> KtFe10ClassErrorType(unwrappedType, analysisContext)
is ErrorType -> {
if (unwrappedType.kind.isUnresolved)
KtFe10ClassErrorType(unwrappedType, analysisContext)
else
KtFe10TypeErrorType(unwrappedType, analysisContext)
}
is CapturedType -> KtFe10CapturedType(unwrappedType, analysisContext)
is NewCapturedType -> KtFe10NewCapturedType(unwrappedType, analysisContext)
is SimpleType -> {
@@ -291,9 +296,9 @@ internal fun KotlinType.toKtType(analysisContext: Fe10AnalysisContext): KtType {
}
}
internal fun TypeProjection.toKtTypeArgument(analysisContext: Fe10AnalysisContext): KtTypeArgument {
internal fun TypeProjection.toKtTypeProjection(analysisContext: Fe10AnalysisContext): KtTypeProjection {
return if (isStarProjection) {
KtStarProjectionTypeArgument(analysisContext.token)
KtStarTypeProjection(analysisContext.token)
} else {
KtTypeArgumentWithVariance(type.toKtType(analysisContext), this.projectionKind, analysisContext.token)
}
@@ -9,11 +9,8 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
import org.jetbrains.kotlin.analysis.api.descriptors.types.KtFe10ClassErrorType
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.cfg.getElementParentDeclaration
import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes
import org.jetbrains.kotlin.descriptors.Modality
@@ -5,9 +5,10 @@
package org.jetbrains.kotlin.analysis.api.descriptors.types
import org.jetbrains.kotlin.analysis.api.KtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
import org.jetbrains.kotlin.analysis.api.types.KtCapturedType
@@ -23,4 +24,7 @@ internal class KtFe10CapturedType(
override val nullability: KtTypeNullability
get() = withValidityAssertion { type.ktNullability }
override val projection: KtTypeProjection
get() = withValidityAssertion { type.typeProjection.toKtTypeProjection(analysisContext) }
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.analysis.api.descriptors.types
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
@@ -14,16 +13,31 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.error.ErrorType
internal class KtFe10ClassErrorType(
override val type: ErrorType,
override val analysisContext: Fe10AnalysisContext
) : KtClassErrorType(), KtFe10Type {
init {
check(type.kind.isUnresolved) {
"Expected unresolved ErrorType but ${type.kind} found for $type"
}
}
override val qualifiers: List<KtClassTypeQualifier.KtUnresolvedClassTypeQualifier>
get() = withValidityAssertion {
type.formatParams.first().split('.').map {
KtClassTypeQualifier.KtUnresolvedClassTypeQualifier(Name.guessByFirstCharacter(it), emptyList(), token)
}
}
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
override val error: String
get() = withValidityAssertion { "Type \"${type.debugMessage}\" is unresolved" }
override val errorMessage: String
get() = withValidityAssertion { type.debugMessage }
override val candidateClassSymbols: Collection<KtClassLikeSymbol>
get() = withValidityAssertion { emptyList() }
@@ -5,20 +5,22 @@
package org.jetbrains.kotlin.analysis.api.descriptors.types
import org.jetbrains.kotlin.analysis.api.KtTypeArgument
import org.jetbrains.kotlin.analysis.api.KtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescNamedClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeArgument
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10JvmTypeMapperContext
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
@@ -36,6 +38,17 @@ internal class KtFe10FunctionalType(
override val nullability: KtTypeNullability
get() = withValidityAssertion { type.ktNullability }
override val qualifiers: List<KtClassTypeQualifier.KtResolvedClassTypeQualifier>
get() = withValidityAssertion {
KtFe10JvmTypeMapperContext.getNestedType(type).allInnerTypes.map { innerType ->
KtClassTypeQualifier.KtResolvedClassTypeQualifier(
innerType.classDescriptor.toKtClassSymbol(analysisContext),
innerType.arguments.map { it.toKtTypeProjection(analysisContext) },
token
)
}
}
override val isSuspend: Boolean
get() = withValidityAssertion { descriptor.functionKind.isSuspendType }
@@ -65,6 +78,6 @@ internal class KtFe10FunctionalType(
override val classSymbol: KtClassLikeSymbol
get() = withValidityAssertion { KtFe10DescNamedClassOrObjectSymbol(descriptor, analysisContext) }
override val typeArguments: List<KtTypeArgument>
get() = withValidityAssertion { type.arguments.map { it.toKtTypeArgument(analysisContext) } }
override val ownTypeArguments: List<KtTypeProjection>
get() = withValidityAssertion { type.arguments.map { it.toKtTypeProjection(analysisContext) } }
}
@@ -5,14 +5,15 @@
package org.jetbrains.kotlin.analysis.api.descriptors.types
import org.jetbrains.kotlin.analysis.api.KtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.types.KtCapturedType
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.types.checker.NewCapturedType
internal class KtFe10NewCapturedType(
@@ -23,4 +24,7 @@ internal class KtFe10NewCapturedType(
override val nullability: KtTypeNullability
get() = withValidityAssertion { type.ktNullability }
override val projection: KtTypeProjection
get() = withValidityAssertion { type.constructor.projection.toKtTypeProjection(analysisContext) }
}
@@ -0,0 +1,43 @@
/*
* Copyright 2010-2021 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.analysis.api.descriptors.types
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.types.KtTypeErrorType
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
import org.jetbrains.kotlin.types.error.ErrorType
import org.jetbrains.kotlin.types.error.ErrorTypeKind
internal class KtFe10TypeErrorType(
override val type: ErrorType,
override val analysisContext: Fe10AnalysisContext
) : KtTypeErrorType(), KtFe10Type {
init {
check(!type.kind.isUnresolved) {
"Expected unresolved ErrorType but ${type.kind} found for $type"
}
}
override fun tryRenderAsNonErrorType(): String? = withValidityAssertion {
when (type.kind) {
ErrorTypeKind.UNINFERRED_TYPE_VARIABLE -> type.formatParams.first()
else -> null
}
}
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
override val errorMessage: String
get() = withValidityAssertion { type.debugMessage }
override val nullability: KtTypeNullability
get() = withValidityAssertion { type.ktNullability }
}
@@ -5,19 +5,21 @@
package org.jetbrains.kotlin.analysis.api.descriptors.types
import org.jetbrains.kotlin.analysis.api.KtTypeArgument
import org.jetbrains.kotlin.analysis.api.KtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescNamedClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeArgument
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeProjection
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10JvmTypeMapperContext
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
import org.jetbrains.kotlin.analysis.api.types.KtUsualClassType
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.types.SimpleType
@@ -29,14 +31,40 @@ internal class KtFe10UsualClassType(
) : KtUsualClassType(), KtFe10Type {
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
override val qualifiers: List<KtClassTypeQualifier.KtResolvedClassTypeQualifier>
get() = withValidityAssertion {
val nestedType = KtFe10JvmTypeMapperContext.getNestedType(type)
val nonInnerQualifiers =
generateSequence(nestedType.root.classifierDescriptor.containingDeclaration as? ClassDescriptor) { it.containingDeclaration as? ClassDescriptor }
buildList {
nonInnerQualifiers.mapTo(this) {
KtClassTypeQualifier.KtResolvedClassTypeQualifier(
it.toKtClassSymbol(analysisContext),
emptyList(),
token
)
}
nestedType.allInnerTypes.mapTo(this) { innerType ->
KtClassTypeQualifier.KtResolvedClassTypeQualifier(
innerType.classDescriptor.toKtClassSymbol(analysisContext),
innerType.arguments.map { it.toKtTypeProjection(analysisContext) },
token
)
}
}
}
override val classId: ClassId
get() = withValidityAssertion { descriptor.maybeLocalClassId }
override val classSymbol: KtClassLikeSymbol
get() = withValidityAssertion { KtFe10DescNamedClassOrObjectSymbol(descriptor, analysisContext) }
override val typeArguments: List<KtTypeArgument>
get() = withValidityAssertion { type.arguments.map { it.toKtTypeArgument(analysisContext) } }
override val ownTypeArguments: List<KtTypeProjection>
get() = withValidityAssertion { type.arguments.map { it.toKtTypeProjection(analysisContext) } }
override val nullability: KtTypeNullability
get() = withValidityAssertion { type.ktNullability }
@@ -43,7 +43,13 @@ internal class KtFe10JvmTypeMapperContext(private val resolveSession: ResolveSes
}
}
class NestedType(val root: PossiblyInnerType, val nested: List<PossiblyInnerType>)
class NestedType(val root: PossiblyInnerType, val nested: List<PossiblyInnerType>) {
val allInnerTypes: List<PossiblyInnerType>
get() = buildList {
add(root)
addAll(nested)
}
}
override val typeContext = KtFe10TypeSystemCommonBackendContextForTypeMapping(resolveSession)