[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:
+2
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-3
@@ -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)
|
||||
}
|
||||
|
||||
-3
@@ -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
-1
@@ -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) }
|
||||
}
|
||||
+17
-3
@@ -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() }
|
||||
|
||||
+18
-5
@@ -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) } }
|
||||
}
|
||||
+6
-2
@@ -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) }
|
||||
}
|
||||
+43
@@ -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 }
|
||||
}
|
||||
+34
-6
@@ -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 }
|
||||
|
||||
+7
-1
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user