From 0c516f848359fe0577b3ca3c6051fd47e9842d67 Mon Sep 17 00:00:00 2001 From: Justin Paupore Date: Tue, 3 Jan 2023 14:06:48 -0800 Subject: [PATCH] [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. --- .../annotations/KtFe10AnnotationsList.kt | 16 ++++--- .../symbols/base/KtFe10AnnotatedSymbol.kt | 4 +- .../descriptorBased/base/Kt1DescUtils.kt | 42 +++++++++++++++---- .../KtFe10PsiDefaultPropertyGetterSymbol.kt | 2 +- .../KtFe10PsiDefaultPropertySetterSymbol.kt | 4 +- .../descriptors/types/KtFe10CapturedType.kt | 2 +- .../descriptors/types/KtFe10ClassErrorType.kt | 2 +- .../types/KtFe10DefinitelyNotNullType.kt | 2 +- .../descriptors/types/KtFe10DynamicType.kt | 2 +- .../descriptors/types/KtFe10FlexibleType.kt | 2 +- .../descriptors/types/KtFe10FunctionalType.kt | 2 +- .../types/KtFe10IntersectionType.kt | 2 +- .../types/KtFe10NewCapturedType.kt | 2 +- .../descriptors/types/KtFe10TypeErrorType.kt | 2 +- .../types/KtFe10TypeParameterType.kt | 2 +- .../descriptors/types/KtFe10UsualClassType.kt | 2 +- .../api/descriptors/types/base/KtFe10Type.kt | 6 +-- .../utils/KtFe10DebugTypeRenderer.kt | 16 ++++++- .../descriptors/utils/renderAnnotations.kt | 4 +- .../varargSpreadParameter.descriptors.txt | 5 --- 20 files changed, 82 insertions(+), 39 deletions(-) delete mode 100644 analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.descriptors.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/annotations/KtFe10AnnotationsList.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/annotations/KtFe10AnnotationsList.kt index 7333edf6d20..07afaee6a41 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/annotations/KtFe10AnnotationsList.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/annotations/KtFe10AnnotationsList.kt @@ -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.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.toKtAnnotationApplication 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( private val fe10Annotations: Annotations, private val annotationsToIgnore: Set, - override val token: KtLifetimeToken, + private val analysisContext: Fe10AnalysisContext ) : KtAnnotationsList() { + override val token: KtLifetimeToken + get() = analysisContext.token + override val annotations: List get() = withValidityAssertion { fe10Annotations.mapNotNull { annotation -> 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() fe10Annotations.mapNotNull { annotation -> if (annotation.annotationClass?.maybeLocalClassId != classId) return@mapNotNull null - annotation.toKtAnnotationApplication() + annotation.toKtAnnotationApplication(analysisContext) } } companion object { fun create( fe10Annotations: Annotations, - token: KtLifetimeToken, + analysisContext: Fe10AnalysisContext, ignoreAnnotations: Set = emptySet(), ): KtAnnotationsList { return if (!fe10Annotations.isEmpty()) { - KtFe10AnnotationsList(fe10Annotations, ignoreAnnotations, token) + KtFe10AnnotationsList(fe10Annotations, ignoreAnnotations, analysisContext) } else { - KtEmptyAnnotationsList(token) + KtEmptyAnnotationsList(analysisContext.token) } } } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/base/KtFe10AnnotatedSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/base/KtFe10AnnotatedSymbol.kt index 47c4623a51e..c10ffb79b16 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/base/KtFe10AnnotatedSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/base/KtFe10AnnotatedSymbol.kt @@ -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.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.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.descriptors.annotations.Annotations internal interface KtFe10AnnotatedSymbol : KtAnnotatedSymbol, KtFe10Symbol { @@ -16,6 +16,6 @@ internal interface KtFe10AnnotatedSymbol : KtAnnotatedSymbol, KtFe10Symbol { override val annotationsList: KtAnnotationsList get() = withValidityAssertion { - KtFe10AnnotationsList.create(annotationsObject, token) + KtFe10AnnotationsList.create(annotationsObject, analysisContext) } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt index 229355d21c5..ce443aa7c43 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt @@ -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.KtTypeNullability 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.descriptors.* 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>.expandArrayAnnotationValue(containingArrayType: KotlinType, analysisContext: Fe10AnalysisContext) + : List = 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) { - 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 KClassValue -> when (val value = value) { is KClassValue.Value.LocalClass -> { @@ -422,7 +450,7 @@ internal fun ConstantValue<*>.toKtAnnotationValue(): KtAnnotationValue { value.annotationClass?.classId, psi = null, useSiteTarget = null, - arguments = value.getKtNamedAnnotationArguments(), + arguments = value.getKtNamedAnnotationArguments(analysisContext), ) ) } @@ -569,18 +597,18 @@ internal fun createKtInitializerValue( return KtNonConstantInitializerValue(initializer) } -internal fun AnnotationDescriptor.toKtAnnotationApplication(): KtAnnotationApplication { +internal fun AnnotationDescriptor.toKtAnnotationApplication(analysisContext: Fe10AnalysisContext): KtAnnotationApplication { return KtAnnotationApplication( annotationClass?.maybeLocalClassId, (source as? PsiSourceElement)?.psi as? KtCallElement, (this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(), - getKtNamedAnnotationArguments(), + getKtNamedAnnotationArguments(analysisContext), ) } -internal fun AnnotationDescriptor.getKtNamedAnnotationArguments() = +internal fun AnnotationDescriptor.getKtNamedAnnotationArguments(analysisContext: Fe10AnalysisContext) = allValueArguments.map { (name, value) -> - KtNamedAnnotationValue(name, value.toKtAnnotationValue()) + KtNamedAnnotationValue(name, value.toKtAnnotationValue(analysisContext)) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt index 547ce806029..fda9979a4a9 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt @@ -95,7 +95,7 @@ internal class KtFe10PsiDefaultPropertyGetterSymbol( override val annotationsList: KtAnnotationsList get() = withValidityAssertion { - descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token) + descriptor?.let { KtFe10AnnotationsList.create(it.annotations, analysisContext) } ?: KtEmptyAnnotationsList(token) } context(KtAnalysisSession) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt index 445051e61cd..ec4fd0d17da 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt @@ -103,7 +103,7 @@ internal class KtFe10PsiDefaultPropertySetterSymbol( override val annotationsList: KtAnnotationsList get() = withValidityAssertion { - descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token) + descriptor?.let { KtFe10AnnotationsList.create(it.annotations, analysisContext) } ?: KtEmptyAnnotationsList(token) } context(KtAnalysisSession) @@ -152,7 +152,7 @@ internal class KtFe10PsiDefaultPropertySetterSymbol( override val annotationsList: KtAnnotationsList get() = withValidityAssertion { - descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token) + descriptor?.let { KtFe10AnnotationsList.create(it.annotations, analysisContext) } ?: KtEmptyAnnotationsList(token) } context(KtAnalysisSession) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10CapturedType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10CapturedType.kt index 05d1685bcd2..aed9c0feb5d 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10CapturedType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10CapturedType.kt @@ -20,7 +20,7 @@ internal class KtFe10CapturedType( override val fe10Type: CapturedType, override val analysisContext: Fe10AnalysisContext ) : KtCapturedType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val nullability: KtTypeNullability get() = withValidityAssertion { fe10Type.ktNullability } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10ClassErrorType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10ClassErrorType.kt index 1667c5fe44c..ea509c322d1 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10ClassErrorType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10ClassErrorType.kt @@ -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 get() = withValidityAssertion { fe10Type.debugMessage } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DefinitelyNotNullType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DefinitelyNotNullType.kt index 9e0095d201c..b11d24795c2 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DefinitelyNotNullType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DefinitelyNotNullType.kt @@ -18,7 +18,7 @@ internal class KtFe10DefinitelyNotNullType( override val fe10Type: DefinitelyNotNullType, override val analysisContext: Fe10AnalysisContext ) : KtDefinitelyNotNullType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val original: KtType get() = withValidityAssertion { fe10Type.original.toKtType(analysisContext) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt index f8527245eb5..f16a339775f 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt @@ -18,7 +18,7 @@ internal class KtFe10DynamicType( override val fe10Type: DynamicType, override val analysisContext: Fe10AnalysisContext ) : KtDynamicType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val nullability: KtTypeNullability get() = withValidityAssertion { fe10Type.ktNullability } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FlexibleType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FlexibleType.kt index d97a7cd0312..c9073763f9d 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FlexibleType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FlexibleType.kt @@ -20,7 +20,7 @@ internal class KtFe10FlexibleType( override val fe10Type: FlexibleType, override val analysisContext: Fe10AnalysisContext ) : KtFlexibleType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val lowerBound: KtType get() = withValidityAssertion { fe10Type.lowerBound.toKtType(analysisContext) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt index 7f8b6dfec33..732d2eb6ee3 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt @@ -34,7 +34,7 @@ internal class KtFe10FunctionalType( private val descriptor: FunctionClassDescriptor, override val analysisContext: Fe10AnalysisContext ) : KtFunctionalType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val nullability: KtTypeNullability get() = withValidityAssertion { fe10Type.ktNullability } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10IntersectionType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10IntersectionType.kt index 83d2747c621..07123da69d6 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10IntersectionType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10IntersectionType.kt @@ -24,7 +24,7 @@ internal class KtFe10IntersectionType( private val supertypes: Collection, override val analysisContext: Fe10AnalysisContext ) : KtIntersectionType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val conjuncts: List by cached { val result = ArrayList(supertypes.size) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10NewCapturedType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10NewCapturedType.kt index a397a594a4d..a9abc542eae 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10NewCapturedType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10NewCapturedType.kt @@ -20,7 +20,7 @@ internal class KtFe10NewCapturedType( override val fe10Type: NewCapturedType, override val analysisContext: Fe10AnalysisContext ) : KtCapturedType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val nullability: KtTypeNullability get() = withValidityAssertion { fe10Type.ktNullability } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeErrorType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeErrorType.kt index 0cf82a6b88f..eadd05a6f8a 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeErrorType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeErrorType.kt @@ -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 get() = withValidityAssertion { fe10Type.debugMessage } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeParameterType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeParameterType.kt index 2e86aed1386..f9763452002 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeParameterType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10TypeParameterType.kt @@ -23,7 +23,7 @@ internal class KtFe10TypeParameterType( private val parameter: TypeParameterDescriptor, override val analysisContext: Fe10AnalysisContext ) : KtTypeParameterType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val name: Name get() = withValidityAssertion { parameter.name } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10UsualClassType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10UsualClassType.kt index 458750e27af..95e1f052700 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10UsualClassType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10UsualClassType.kt @@ -29,7 +29,7 @@ internal class KtFe10UsualClassType( private val descriptor: ClassDescriptor, override val analysisContext: Fe10AnalysisContext ) : KtUsualClassType(), KtFe10Type { - override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging() } + override fun asStringForDebugging(): String = withValidityAssertion { fe10Type.asStringForDebugging(analysisContext) } override val qualifiers: List get() = withValidityAssertion { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt index 8d26c86a728..0a56831b952 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt @@ -27,7 +27,7 @@ internal interface KtFe10Type : KtLifetimeOwner, KtAnnotated { get() = withValidityAssertion { KtFe10AnnotationsList.create( fe10Type.annotations, - token, + analysisContext, ignoreAnnotations = setOf( StandardClassIds.Annotations.ExtensionFunctionType, StandardClassIds.Annotations.ContextFunctionTypeParams, @@ -39,7 +39,7 @@ internal interface KtFe10Type : KtLifetimeOwner, KtAnnotated { get() = analysisContext.token } -internal fun KotlinType.asStringForDebugging(): String { +internal fun KotlinType.asStringForDebugging(analysisContext: Fe10AnalysisContext): String { val renderer = KtFe10DebugTypeRenderer() - return prettyPrint { renderer.render(this@asStringForDebugging, this) } + return prettyPrint { with(analysisContext) { renderer.render(this@asStringForDebugging, this@prettyPrint) } } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10DebugTypeRenderer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10DebugTypeRenderer.kt index 13a97866574..951b76aad9c 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10DebugTypeRenderer.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10DebugTypeRenderer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.utils 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.getKtNamedAnnotationArguments 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" } + context(Fe10AnalysisContext) fun render(type: KotlinType, consumer: PrettyPrinter) { consumer.renderType(type) } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderType(type: KotlinType) { renderTypeAnnotationsDebug(type) when (val unwrappedType = type.unwrap()) { @@ -72,6 +75,7 @@ internal class KtFe10DebugTypeRenderer { } } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderTypeAnnotationsDebug(type: KotlinType) { val annotations = type.annotations .filter { it.annotationClass?.classId != StandardClassIds.Annotations.ExtensionFunctionType } @@ -79,8 +83,9 @@ internal class KtFe10DebugTypeRenderer { printCollectionIfNotEmpty(annotations, separator = " ", postfix = " ") { renderTypeAnnotationDebug(it) } } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderTypeAnnotationDebug(annotation: AnnotationDescriptor) { - val namedValues = annotation.getKtNamedAnnotationArguments() + val namedValues = annotation.getKtNamedAnnotationArguments(this@Fe10AnalysisContext) renderAnnotationDebug(annotation.annotationClass?.classId, namedValues) } @@ -114,12 +119,14 @@ internal class KtFe10DebugTypeRenderer { } } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderFlexibleType(type: FlexibleType) { val lowerBoundText = prettyPrint { renderType(type.lowerBound) } val upperBoundText = prettyPrint { renderType(type.upperBound) } append(DescriptorRenderer.COMPACT.renderFlexibleType(lowerBoundText, upperBoundText, type.builtIns)) } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderDefinitelyNotNullType(type: DefinitelyNotNullType) { renderType(type.original) append(" & Any") @@ -129,12 +136,14 @@ internal class KtFe10DebugTypeRenderer { append(ERROR_TYPE_TEXT) } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderCapturedType(type: CapturedType) { append("CapturedType(") renderTypeProjection(type.typeProjection) append(")") } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderCapturedType(type: NewCapturedType) { append("CapturedType(") renderTypeProjection(type.constructor.projection) @@ -146,11 +155,13 @@ internal class KtFe10DebugTypeRenderer { append("TypeVariable(").append(name.asString()).append(")") } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderIntersectionType(typeConstructor: IntersectionTypeConstructor) { append("it") printCollection(typeConstructor.supertypes, separator = " & ", prefix = "(", postfix = ")") { renderType(it) } } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderFunctionType(type: SimpleType) { if (type.isSuspendFunctionType || type.isKSuspendFunctionType) { append("suspend ") @@ -181,12 +192,14 @@ internal class KtFe10DebugTypeRenderer { append(descriptor.name.render()) } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderOrdinaryType(type: SimpleType) { val nestedType = KtFe10JvmTypeMapperContext.getNestedType(type) renderTypeSegment(nestedType.root) printCollectionIfNotEmpty(nestedType.nested, separator = ".", prefix = ".", postfix = "") { renderTypeSegment(it) } } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderTypeSegment(typeSegment: PossiblyInnerType) { val classifier = typeSegment.classifierDescriptor @@ -200,6 +213,7 @@ internal class KtFe10DebugTypeRenderer { printCollection(fqName.pathSegments(), separator = ".") { append(it.render()) } } + context(Fe10AnalysisContext) private fun PrettyPrinter.renderTypeProjection(projection: TypeProjection) { if (projection.isStarProjection) { append("*") diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/renderAnnotations.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/renderAnnotations.kt index e939f8d47eb..9b7dddfb796 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/renderAnnotations.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/renderAnnotations.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.utils 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.toKtAnnotationValue import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter @@ -20,6 +21,7 @@ internal fun PrettyPrinter.renderFe10Annotations( annotations: Annotations, isSingleLineAnnotations: Boolean, renderAnnotationWithShortNames: Boolean, + analysisContext: Fe10AnalysisContext, predicate: (ClassId) -> Boolean = { true } ) { val separator = if (isSingleLineAnnotations) " " else "\n" @@ -39,7 +41,7 @@ internal fun PrettyPrinter.renderFe10Annotations( printCollectionIfNotEmpty(valueArguments, separator = ", ", prefix = "(", postfix = ")") { (name, value) -> append(name.render()) append(" = ") - append(value.toKtAnnotationValue().renderAsSourceCode()) + append(value.toKtAnnotationValue(analysisContext).renderAsSourceCode()) } append(separator) diff --git a/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.descriptors.txt b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.descriptors.txt deleted file mode 100644 index 9af69a98e27..00000000000 --- a/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.descriptors.txt +++ /dev/null @@ -1,5 +0,0 @@ -KtDeclaration: KtClass Foo -annotations: [ - A(strings = [["foo", "bar"], "baz", ["quux"]]) - psi: KtAnnotationEntry -]