[AA-FE1.0] Flatten spread arguments in annotations.
This requires plumbing a Fe10AnalysisContext through to the KtFe10AnnotationsList, so that the context's module descriptor and KotlinBuiltIns instance can be used to look up types correctly. This eliminates the difference between the FIR and FE1.0 AA implementations with regards to annotation spread argument handling.
This commit is contained in:
committed by
Yan Zhulanow
parent
212baf580c
commit
0c516f8483
+10
-6
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.annotations
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtAnnotationApplication
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtAnnotationApplication
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
||||||
@@ -21,13 +22,16 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
|||||||
internal class KtFe10AnnotationsList private constructor(
|
internal class KtFe10AnnotationsList private constructor(
|
||||||
private val fe10Annotations: Annotations,
|
private val fe10Annotations: Annotations,
|
||||||
private val annotationsToIgnore: Set<ClassId>,
|
private val annotationsToIgnore: Set<ClassId>,
|
||||||
override val token: KtLifetimeToken,
|
private val analysisContext: Fe10AnalysisContext
|
||||||
) : KtAnnotationsList() {
|
) : KtAnnotationsList() {
|
||||||
|
override val token: KtLifetimeToken
|
||||||
|
get() = analysisContext.token
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationApplication>
|
override val annotations: List<KtAnnotationApplication>
|
||||||
get() = withValidityAssertion {
|
get() = withValidityAssertion {
|
||||||
fe10Annotations.mapNotNull { annotation ->
|
fe10Annotations.mapNotNull { annotation ->
|
||||||
if (annotation.annotationClass.classId in annotationsToIgnore) null
|
if (annotation.annotationClass.classId in annotationsToIgnore) null
|
||||||
else annotation.toKtAnnotationApplication()
|
else annotation.toKtAnnotationApplication(analysisContext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,20 +63,20 @@ internal class KtFe10AnnotationsList private constructor(
|
|||||||
if (classId in annotationsToIgnore) return@withValidityAssertion emptyList()
|
if (classId in annotationsToIgnore) return@withValidityAssertion emptyList()
|
||||||
fe10Annotations.mapNotNull { annotation ->
|
fe10Annotations.mapNotNull { annotation ->
|
||||||
if (annotation.annotationClass?.maybeLocalClassId != classId) return@mapNotNull null
|
if (annotation.annotationClass?.maybeLocalClassId != classId) return@mapNotNull null
|
||||||
annotation.toKtAnnotationApplication()
|
annotation.toKtAnnotationApplication(analysisContext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun create(
|
fun create(
|
||||||
fe10Annotations: Annotations,
|
fe10Annotations: Annotations,
|
||||||
token: KtLifetimeToken,
|
analysisContext: Fe10AnalysisContext,
|
||||||
ignoreAnnotations: Set<ClassId> = emptySet(),
|
ignoreAnnotations: Set<ClassId> = emptySet(),
|
||||||
): KtAnnotationsList {
|
): KtAnnotationsList {
|
||||||
return if (!fe10Annotations.isEmpty()) {
|
return if (!fe10Annotations.isEmpty()) {
|
||||||
KtFe10AnnotationsList(fe10Annotations, ignoreAnnotations, token)
|
KtFe10AnnotationsList(fe10Annotations, ignoreAnnotations, analysisContext)
|
||||||
} else {
|
} else {
|
||||||
KtEmptyAnnotationsList(token)
|
KtEmptyAnnotationsList(analysisContext.token)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.base
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.annotations.KtFe10AnnotationsList
|
import org.jetbrains.kotlin.analysis.api.descriptors.annotations.KtFe10AnnotationsList
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
|
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
|
|
||||||
internal interface KtFe10AnnotatedSymbol : KtAnnotatedSymbol, KtFe10Symbol {
|
internal interface KtFe10AnnotatedSymbol : KtAnnotatedSymbol, KtFe10Symbol {
|
||||||
@@ -16,6 +16,6 @@ internal interface KtFe10AnnotatedSymbol : KtAnnotatedSymbol, KtFe10Symbol {
|
|||||||
|
|
||||||
override val annotationsList: KtAnnotationsList
|
override val annotationsList: KtAnnotationsList
|
||||||
get() = withValidityAssertion {
|
get() = withValidityAssertion {
|
||||||
KtFe10AnnotationsList.create(annotationsObject, token)
|
KtFe10AnnotationsList.create(annotationsObject, analysisContext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+35
-7
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
|||||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
|
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
@@ -404,9 +405,36 @@ internal fun ConstantValue<*>.toKtConstantValue(): KtConstantValue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun ConstantValue<*>.toKtAnnotationValue(): KtAnnotationValue {
|
internal tailrec fun KotlinBuiltIns.areSameArrayTypeIgnoringProjections(left: KotlinType, right: KotlinType): Boolean {
|
||||||
|
val leftIsArray = KotlinBuiltIns.isArrayOrPrimitiveArray(left)
|
||||||
|
val rightIsArray = KotlinBuiltIns.isArrayOrPrimitiveArray(right)
|
||||||
|
|
||||||
|
return when {
|
||||||
|
leftIsArray && rightIsArray -> areSameArrayTypeIgnoringProjections(getArrayElementType(left), getArrayElementType(right))
|
||||||
|
!leftIsArray && !rightIsArray -> left == right
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
internal fun List<ConstantValue<*>>.expandArrayAnnotationValue(containingArrayType: KotlinType, analysisContext: Fe10AnalysisContext)
|
||||||
|
: List<KtAnnotationValue> = flatMap { constantValue ->
|
||||||
|
val constantType = constantValue.getType(analysisContext.resolveSession.moduleDescriptor)
|
||||||
|
if (analysisContext.builtIns.areSameArrayTypeIgnoringProjections(containingArrayType, constantType)) {
|
||||||
|
// If an element in the array has the same type as the containing array, it's a spread component that needs
|
||||||
|
// to be expanded here. (It should have the array element type instead.)
|
||||||
|
(constantValue as ArrayValue).value.expandArrayAnnotationValue(containingArrayType, analysisContext)
|
||||||
|
} else {
|
||||||
|
listOf(constantValue.toKtAnnotationValue(analysisContext))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun ConstantValue<*>.toKtAnnotationValue(analysisContext: Fe10AnalysisContext): KtAnnotationValue {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is ArrayValue -> KtArrayAnnotationValue(value.map { it.toKtAnnotationValue() }, sourcePsi = null)
|
is ArrayValue -> {
|
||||||
|
val arrayType = getType(analysisContext.resolveSession.moduleDescriptor)
|
||||||
|
KtArrayAnnotationValue(value.expandArrayAnnotationValue(arrayType, analysisContext), sourcePsi = null)
|
||||||
|
}
|
||||||
is EnumValue -> KtEnumEntryAnnotationValue(CallableId(enumClassId, enumEntryName), sourcePsi = null)
|
is EnumValue -> KtEnumEntryAnnotationValue(CallableId(enumClassId, enumEntryName), sourcePsi = null)
|
||||||
is KClassValue -> when (val value = value) {
|
is KClassValue -> when (val value = value) {
|
||||||
is KClassValue.Value.LocalClass -> {
|
is KClassValue.Value.LocalClass -> {
|
||||||
@@ -422,7 +450,7 @@ internal fun ConstantValue<*>.toKtAnnotationValue(): KtAnnotationValue {
|
|||||||
value.annotationClass?.classId,
|
value.annotationClass?.classId,
|
||||||
psi = null,
|
psi = null,
|
||||||
useSiteTarget = null,
|
useSiteTarget = null,
|
||||||
arguments = value.getKtNamedAnnotationArguments(),
|
arguments = value.getKtNamedAnnotationArguments(analysisContext),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -569,18 +597,18 @@ internal fun createKtInitializerValue(
|
|||||||
return KtNonConstantInitializerValue(initializer)
|
return KtNonConstantInitializerValue(initializer)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun AnnotationDescriptor.toKtAnnotationApplication(): KtAnnotationApplication {
|
internal fun AnnotationDescriptor.toKtAnnotationApplication(analysisContext: Fe10AnalysisContext): KtAnnotationApplication {
|
||||||
return KtAnnotationApplication(
|
return KtAnnotationApplication(
|
||||||
annotationClass?.maybeLocalClassId,
|
annotationClass?.maybeLocalClassId,
|
||||||
(source as? PsiSourceElement)?.psi as? KtCallElement,
|
(source as? PsiSourceElement)?.psi as? KtCallElement,
|
||||||
(this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(),
|
(this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(),
|
||||||
getKtNamedAnnotationArguments(),
|
getKtNamedAnnotationArguments(analysisContext),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun AnnotationDescriptor.getKtNamedAnnotationArguments() =
|
internal fun AnnotationDescriptor.getKtNamedAnnotationArguments(analysisContext: Fe10AnalysisContext) =
|
||||||
allValueArguments.map { (name, value) ->
|
allValueArguments.map { (name, value) ->
|
||||||
KtNamedAnnotationValue(name, value.toKtAnnotationValue())
|
KtNamedAnnotationValue(name, value.toKtAnnotationValue(analysisContext))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -95,7 +95,7 @@ internal class KtFe10PsiDefaultPropertyGetterSymbol(
|
|||||||
|
|
||||||
override val annotationsList: KtAnnotationsList
|
override val annotationsList: KtAnnotationsList
|
||||||
get() = withValidityAssertion {
|
get() = withValidityAssertion {
|
||||||
descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token)
|
descriptor?.let { KtFe10AnnotationsList.create(it.annotations, analysisContext) } ?: KtEmptyAnnotationsList(token)
|
||||||
}
|
}
|
||||||
|
|
||||||
context(KtAnalysisSession)
|
context(KtAnalysisSession)
|
||||||
|
|||||||
+2
-2
@@ -103,7 +103,7 @@ internal class KtFe10PsiDefaultPropertySetterSymbol(
|
|||||||
|
|
||||||
override val annotationsList: KtAnnotationsList
|
override val annotationsList: KtAnnotationsList
|
||||||
get() = withValidityAssertion {
|
get() = withValidityAssertion {
|
||||||
descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token)
|
descriptor?.let { KtFe10AnnotationsList.create(it.annotations, analysisContext) } ?: KtEmptyAnnotationsList(token)
|
||||||
}
|
}
|
||||||
|
|
||||||
context(KtAnalysisSession)
|
context(KtAnalysisSession)
|
||||||
@@ -152,7 +152,7 @@ internal class KtFe10PsiDefaultPropertySetterSymbol(
|
|||||||
|
|
||||||
override val annotationsList: KtAnnotationsList
|
override val annotationsList: KtAnnotationsList
|
||||||
get() = withValidityAssertion {
|
get() = withValidityAssertion {
|
||||||
descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token)
|
descriptor?.let { KtFe10AnnotationsList.create(it.annotations, analysisContext) } ?: KtEmptyAnnotationsList(token)
|
||||||
}
|
}
|
||||||
|
|
||||||
context(KtAnalysisSession)
|
context(KtAnalysisSession)
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ internal class KtFe10CapturedType(
|
|||||||
override val fe10Type: CapturedType,
|
override val fe10Type: CapturedType,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtCapturedType(), KtFe10Type {
|
) : KtCapturedType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val nullability: KtTypeNullability
|
override val nullability: KtTypeNullability
|
||||||
get() = withValidityAssertion { fe10Type.ktNullability }
|
get() = withValidityAssertion { fe10Type.ktNullability }
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ internal class KtFe10ClassErrorType(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val errorMessage: String
|
override val errorMessage: String
|
||||||
get() = withValidityAssertion { fe10Type.debugMessage }
|
get() = withValidityAssertion { fe10Type.debugMessage }
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ internal class KtFe10DefinitelyNotNullType(
|
|||||||
override val fe10Type: DefinitelyNotNullType,
|
override val fe10Type: DefinitelyNotNullType,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtDefinitelyNotNullType(), KtFe10Type {
|
) : KtDefinitelyNotNullType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val original: KtType
|
override val original: KtType
|
||||||
get() = withValidityAssertion { fe10Type.original.toKtType(analysisContext) }
|
get() = withValidityAssertion { fe10Type.original.toKtType(analysisContext) }
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ internal class KtFe10DynamicType(
|
|||||||
override val fe10Type: DynamicType,
|
override val fe10Type: DynamicType,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtDynamicType(), KtFe10Type {
|
) : KtDynamicType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val nullability: KtTypeNullability
|
override val nullability: KtTypeNullability
|
||||||
get() = withValidityAssertion { fe10Type.ktNullability }
|
get() = withValidityAssertion { fe10Type.ktNullability }
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ internal class KtFe10FlexibleType(
|
|||||||
override val fe10Type: FlexibleType,
|
override val fe10Type: FlexibleType,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtFlexibleType(), KtFe10Type {
|
) : KtFlexibleType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val lowerBound: KtType
|
override val lowerBound: KtType
|
||||||
get() = withValidityAssertion { fe10Type.lowerBound.toKtType(analysisContext) }
|
get() = withValidityAssertion { fe10Type.lowerBound.toKtType(analysisContext) }
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ internal class KtFe10FunctionalType(
|
|||||||
private val descriptor: FunctionClassDescriptor,
|
private val descriptor: FunctionClassDescriptor,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtFunctionalType(), KtFe10Type {
|
) : KtFunctionalType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val nullability: KtTypeNullability
|
override val nullability: KtTypeNullability
|
||||||
get() = withValidityAssertion { fe10Type.ktNullability }
|
get() = withValidityAssertion { fe10Type.ktNullability }
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ internal class KtFe10IntersectionType(
|
|||||||
private val supertypes: Collection<KotlinType>,
|
private val supertypes: Collection<KotlinType>,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtIntersectionType(), KtFe10Type {
|
) : KtIntersectionType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val conjuncts: List<KtType> by cached {
|
override val conjuncts: List<KtType> by cached {
|
||||||
val result = ArrayList<KtType>(supertypes.size)
|
val result = ArrayList<KtType>(supertypes.size)
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ internal class KtFe10NewCapturedType(
|
|||||||
override val fe10Type: NewCapturedType,
|
override val fe10Type: NewCapturedType,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtCapturedType(), KtFe10Type {
|
) : KtCapturedType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val nullability: KtTypeNullability
|
override val nullability: KtTypeNullability
|
||||||
get() = withValidityAssertion { fe10Type.ktNullability }
|
get() = withValidityAssertion { fe10Type.ktNullability }
|
||||||
|
|||||||
+1
-1
@@ -33,7 +33,7 @@ internal class KtFe10TypeErrorType(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val errorMessage: String
|
override val errorMessage: String
|
||||||
get() = withValidityAssertion { fe10Type.debugMessage }
|
get() = withValidityAssertion { fe10Type.debugMessage }
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ internal class KtFe10TypeParameterType(
|
|||||||
private val parameter: TypeParameterDescriptor,
|
private val parameter: TypeParameterDescriptor,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtTypeParameterType(), KtFe10Type {
|
) : KtTypeParameterType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val name: Name
|
override val name: Name
|
||||||
get() = withValidityAssertion { parameter.name }
|
get() = withValidityAssertion { parameter.name }
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ internal class KtFe10UsualClassType(
|
|||||||
private val descriptor: ClassDescriptor,
|
private val descriptor: ClassDescriptor,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtUsualClassType(), KtFe10Type {
|
) : KtUsualClassType(), KtFe10Type {
|
||||||
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() }
|
override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) }
|
||||||
|
|
||||||
override val qualifiers: List<KtClassTypeQualifier.KtResolvedClassTypeQualifier>
|
override val qualifiers: List<KtClassTypeQualifier.KtResolvedClassTypeQualifier>
|
||||||
get() = withValidityAssertion {
|
get() = withValidityAssertion {
|
||||||
|
|||||||
+3
-3
@@ -27,7 +27,7 @@ internal interface KtFe10Type : KtLifetimeOwner, KtAnnotated {
|
|||||||
get() = withValidityAssertion {
|
get() = withValidityAssertion {
|
||||||
KtFe10AnnotationsList.create(
|
KtFe10AnnotationsList.create(
|
||||||
fe10Type.annotations,
|
fe10Type.annotations,
|
||||||
token,
|
analysisContext,
|
||||||
ignoreAnnotations = setOf(
|
ignoreAnnotations = setOf(
|
||||||
StandardClassIds.Annotations.ExtensionFunctionType,
|
StandardClassIds.Annotations.ExtensionFunctionType,
|
||||||
StandardClassIds.Annotations.ContextFunctionTypeParams,
|
StandardClassIds.Annotations.ContextFunctionTypeParams,
|
||||||
@@ -39,7 +39,7 @@ internal interface KtFe10Type : KtLifetimeOwner, KtAnnotated {
|
|||||||
get() = analysisContext.token
|
get() = analysisContext.token
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun KotlinType.asStringForDebugging(): String {
|
internal fun KotlinType.asStringForDebugging(analysisContext: Fe10AnalysisContext): String {
|
||||||
val renderer = KtFe10DebugTypeRenderer()
|
val renderer = KtFe10DebugTypeRenderer()
|
||||||
return prettyPrint { renderer.render(this@asStringForDebugging, this) }
|
return prettyPrint { with(analysisContext) { renderer.render(this@asStringForDebugging, this@prettyPrint) } }
|
||||||
}
|
}
|
||||||
+15
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.analysis.api.descriptors.utils
|
package org.jetbrains.kotlin.analysis.api.descriptors.utils
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.annotations.*
|
import org.jetbrains.kotlin.analysis.api.annotations.*
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getKtNamedAnnotationArguments
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getKtNamedAnnotationArguments
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
||||||
@@ -35,10 +36,12 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
const val ERROR_TYPE_TEXT = "ERROR_TYPE"
|
const val ERROR_TYPE_TEXT = "ERROR_TYPE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
fun render(type: KotlinType, consumer: PrettyPrinter) {
|
fun render(type: KotlinType, consumer: PrettyPrinter) {
|
||||||
consumer.renderType(type)
|
consumer.renderType(type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderType(type: KotlinType) {
|
private fun PrettyPrinter.renderType(type: KotlinType) {
|
||||||
renderTypeAnnotationsDebug(type)
|
renderTypeAnnotationsDebug(type)
|
||||||
when (val unwrappedType = type.unwrap()) {
|
when (val unwrappedType = type.unwrap()) {
|
||||||
@@ -72,6 +75,7 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderTypeAnnotationsDebug(type: KotlinType) {
|
private fun PrettyPrinter.renderTypeAnnotationsDebug(type: KotlinType) {
|
||||||
val annotations = type.annotations
|
val annotations = type.annotations
|
||||||
.filter { it.annotationClass?.classId != StandardClassIds.Annotations.ExtensionFunctionType }
|
.filter { it.annotationClass?.classId != StandardClassIds.Annotations.ExtensionFunctionType }
|
||||||
@@ -79,8 +83,9 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
printCollectionIfNotEmpty(annotations, separator = " ", postfix = " ") { renderTypeAnnotationDebug(it) }
|
printCollectionIfNotEmpty(annotations, separator = " ", postfix = " ") { renderTypeAnnotationDebug(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderTypeAnnotationDebug(annotation: AnnotationDescriptor) {
|
private fun PrettyPrinter.renderTypeAnnotationDebug(annotation: AnnotationDescriptor) {
|
||||||
val namedValues = annotation.getKtNamedAnnotationArguments()
|
val namedValues = annotation.getKtNamedAnnotationArguments(this@Fe10AnalysisContext)
|
||||||
renderAnnotationDebug(annotation.annotationClass?.classId, namedValues)
|
renderAnnotationDebug(annotation.annotationClass?.classId, namedValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,12 +119,14 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderFlexibleType(type: FlexibleType) {
|
private fun PrettyPrinter.renderFlexibleType(type: FlexibleType) {
|
||||||
val lowerBoundText = prettyPrint { renderType(type.lowerBound) }
|
val lowerBoundText = prettyPrint { renderType(type.lowerBound) }
|
||||||
val upperBoundText = prettyPrint { renderType(type.upperBound) }
|
val upperBoundText = prettyPrint { renderType(type.upperBound) }
|
||||||
append(DescriptorRenderer.COMPACT.renderFlexibleType(lowerBoundText, upperBoundText, type.builtIns))
|
append(DescriptorRenderer.COMPACT.renderFlexibleType(lowerBoundText, upperBoundText, type.builtIns))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderDefinitelyNotNullType(type: DefinitelyNotNullType) {
|
private fun PrettyPrinter.renderDefinitelyNotNullType(type: DefinitelyNotNullType) {
|
||||||
renderType(type.original)
|
renderType(type.original)
|
||||||
append(" & Any")
|
append(" & Any")
|
||||||
@@ -129,12 +136,14 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
append(ERROR_TYPE_TEXT)
|
append(ERROR_TYPE_TEXT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderCapturedType(type: CapturedType) {
|
private fun PrettyPrinter.renderCapturedType(type: CapturedType) {
|
||||||
append("CapturedType(")
|
append("CapturedType(")
|
||||||
renderTypeProjection(type.typeProjection)
|
renderTypeProjection(type.typeProjection)
|
||||||
append(")")
|
append(")")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderCapturedType(type: NewCapturedType) {
|
private fun PrettyPrinter.renderCapturedType(type: NewCapturedType) {
|
||||||
append("CapturedType(")
|
append("CapturedType(")
|
||||||
renderTypeProjection(type.constructor.projection)
|
renderTypeProjection(type.constructor.projection)
|
||||||
@@ -146,11 +155,13 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
append("TypeVariable(").append(name.asString()).append(")")
|
append("TypeVariable(").append(name.asString()).append(")")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderIntersectionType(typeConstructor: IntersectionTypeConstructor) {
|
private fun PrettyPrinter.renderIntersectionType(typeConstructor: IntersectionTypeConstructor) {
|
||||||
append("it")
|
append("it")
|
||||||
printCollection(typeConstructor.supertypes, separator = " & ", prefix = "(", postfix = ")") { renderType(it) }
|
printCollection(typeConstructor.supertypes, separator = " & ", prefix = "(", postfix = ")") { renderType(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderFunctionType(type: SimpleType) {
|
private fun PrettyPrinter.renderFunctionType(type: SimpleType) {
|
||||||
if (type.isSuspendFunctionType || type.isKSuspendFunctionType) {
|
if (type.isSuspendFunctionType || type.isKSuspendFunctionType) {
|
||||||
append("suspend ")
|
append("suspend ")
|
||||||
@@ -181,12 +192,14 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
append(descriptor.name.render())
|
append(descriptor.name.render())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderOrdinaryType(type: SimpleType) {
|
private fun PrettyPrinter.renderOrdinaryType(type: SimpleType) {
|
||||||
val nestedType = KtFe10JvmTypeMapperContext.getNestedType(type)
|
val nestedType = KtFe10JvmTypeMapperContext.getNestedType(type)
|
||||||
renderTypeSegment(nestedType.root)
|
renderTypeSegment(nestedType.root)
|
||||||
printCollectionIfNotEmpty(nestedType.nested, separator = ".", prefix = ".", postfix = "") { renderTypeSegment(it) }
|
printCollectionIfNotEmpty(nestedType.nested, separator = ".", prefix = ".", postfix = "") { renderTypeSegment(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderTypeSegment(typeSegment: PossiblyInnerType) {
|
private fun PrettyPrinter.renderTypeSegment(typeSegment: PossiblyInnerType) {
|
||||||
val classifier = typeSegment.classifierDescriptor
|
val classifier = typeSegment.classifierDescriptor
|
||||||
|
|
||||||
@@ -200,6 +213,7 @@ internal class KtFe10DebugTypeRenderer {
|
|||||||
printCollection(fqName.pathSegments(), separator = ".") { append(it.render()) }
|
printCollection(fqName.pathSegments(), separator = ".") { append(it.render()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fe10AnalysisContext)
|
||||||
private fun PrettyPrinter.renderTypeProjection(projection: TypeProjection) {
|
private fun PrettyPrinter.renderTypeProjection(projection: TypeProjection) {
|
||||||
if (projection.isStarProjection) {
|
if (projection.isStarProjection) {
|
||||||
append("*")
|
append("*")
|
||||||
|
|||||||
+3
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.analysis.api.descriptors.utils
|
package org.jetbrains.kotlin.analysis.api.descriptors.utils
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.annotations.renderAsSourceCode
|
import org.jetbrains.kotlin.analysis.api.annotations.renderAsSourceCode
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtAnnotationValue
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtAnnotationValue
|
||||||
import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter
|
import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter
|
||||||
@@ -20,6 +21,7 @@ internal fun PrettyPrinter.renderFe10Annotations(
|
|||||||
annotations: Annotations,
|
annotations: Annotations,
|
||||||
isSingleLineAnnotations: Boolean,
|
isSingleLineAnnotations: Boolean,
|
||||||
renderAnnotationWithShortNames: Boolean,
|
renderAnnotationWithShortNames: Boolean,
|
||||||
|
analysisContext: Fe10AnalysisContext,
|
||||||
predicate: (ClassId) -> Boolean = { true }
|
predicate: (ClassId) -> Boolean = { true }
|
||||||
) {
|
) {
|
||||||
val separator = if (isSingleLineAnnotations) " " else "\n"
|
val separator = if (isSingleLineAnnotations) " " else "\n"
|
||||||
@@ -39,7 +41,7 @@ internal fun PrettyPrinter.renderFe10Annotations(
|
|||||||
printCollectionIfNotEmpty(valueArguments, separator = ", ", prefix = "(", postfix = ")") { (name, value) ->
|
printCollectionIfNotEmpty(valueArguments, separator = ", ", prefix = "(", postfix = ")") { (name, value) ->
|
||||||
append(name.render())
|
append(name.render())
|
||||||
append(" = ")
|
append(" = ")
|
||||||
append(value.toKtAnnotationValue().renderAsSourceCode())
|
append(value.toKtAnnotationValue(analysisContext).renderAsSourceCode())
|
||||||
}
|
}
|
||||||
|
|
||||||
append(separator)
|
append(separator)
|
||||||
|
|||||||
-5
@@ -1,5 +0,0 @@
|
|||||||
KtDeclaration: KtClass Foo
|
|
||||||
annotations: [
|
|
||||||
A(strings = [["foo", "bar"], "baz", ["quux"]])
|
|
||||||
psi: KtAnnotationEntry
|
|
||||||
]
|
|
||||||
Reference in New Issue
Block a user