From f94dad70058f4d1e14b7fa5652995efe75147346 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 20 Sep 2021 14:30:10 -0700 Subject: [PATCH] FIR IDE: migrate annotation parameter conversion util --- .../fir/renderer/FirAnnotationsIdeRenderer.kt | 2 +- .../symbols/annotations/firAnnotationUtils.kt | 46 +++++++++++++++++-- .../kotlin/analysis/api/fir/utils/firUtils.kt | 34 -------------- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirAnnotationsIdeRenderer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirAnnotationsIdeRenderer.kt index 781e55abd9b..f099cfd21ab 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirAnnotationsIdeRenderer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirAnnotationsIdeRenderer.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.fir.renderer +import org.jetbrains.kotlin.analysis.api.fir.symbols.annotations.mapAnnotationParameters import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId @@ -12,7 +13,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef -import org.jetbrains.kotlin.analysis.api.fir.utils.mapAnnotationParameters internal fun StringBuilder.renderAnnotations( coneTypeIdeRenderer: ConeTypeIdeRenderer, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/annotations/firAnnotationUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/annotations/firAnnotationUtils.kt index b2c1f526e8c..f7febdd66ee 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/annotations/firAnnotationUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/annotations/firAnnotationUtils.kt @@ -6,14 +6,19 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.annotations import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck +import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration -import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.fir.expressions.coneClassLikeType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.types.classId -import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType -import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.resolved +import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor +import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.name.ClassId internal fun FirAnnotation.getClassId(session: FirSession): ClassId? = @@ -34,3 +39,36 @@ internal fun FirRefWithValidityCheck.getAnnotationClass withFirByType(ResolveType.AnnotationType) { fir -> fir.annotations.mapNotNull { it.getClassId(fir.moduleData.session) } } + +internal fun mapAnnotationParameters(annotation: FirAnnotation, session: FirSession): Map { + if (annotation.resolved) return annotation.argumentMapping.mapping.mapKeys { (name, _) -> name.identifier } + if (annotation !is FirAnnotationCall) return emptyMap() + val annotationCone = annotation.annotationTypeRef.coneType as? ConeClassLikeType ?: return emptyMap() + + val annotationPrimaryCtor = (annotationCone.lookupTag.toSymbol(session)?.fir as? FirRegularClass)?.primaryConstructor + val annotationCtorParameterNames = annotationPrimaryCtor?.valueParameters?.map { it.name } + + val resultMap = mutableMapOf() + + val namesSequence = annotationCtorParameterNames?.asSequence()?.iterator() + + for (argument in annotation.argumentList.arguments.filterIsInstance()) { + resultMap[argument.name.asString()] = argument.expression + } + + if (namesSequence != null) { + for (argument in annotation.argumentList.arguments) { + if (argument is FirNamedArgumentExpression) continue + + while (namesSequence.hasNext()) { + val name = namesSequence.next().asString() + if (!resultMap.contains(name)) { + resultMap[name] = argument + break + } + } + } + } + + return resultMap +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt index 96d22ec0b50..fd0e85d8a8e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt @@ -9,13 +9,10 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.classKind import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol -import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor -import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError -import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.types.* @@ -59,37 +56,6 @@ internal fun FirNamedReference.getReferencedElementType(resolveState: FirModuleR } } -internal fun mapAnnotationParameters(annotation: FirAnnotation, session: FirSession): Map { - if (annotation.resolved) return annotation.argumentMapping.mapping.mapKeys { (name, _) -> name.identifier } - if (annotation !is FirAnnotationCall) return emptyMap() - val annotationCone = annotation.annotationTypeRef.coneType as? ConeClassLikeType ?: return emptyMap() - - val annotationPrimaryCtor = (annotationCone.lookupTag.toSymbol(session)?.fir as? FirRegularClass)?.primaryConstructor - val annotationCtorParameterNames = annotationPrimaryCtor?.valueParameters?.map { it.name } - - val resultSet = mutableMapOf() - - val namesSequence = annotationCtorParameterNames?.asSequence()?.iterator() - - for (argument in annotation.argumentList.arguments.filterIsInstance()) { - resultSet[argument.name.asString()] = argument.expression - } - - for (argument in annotation.argumentList.arguments) { - if (argument is FirNamedArgumentExpression) continue - - while (namesSequence != null && namesSequence.hasNext()) { - val name = namesSequence.next().asString() - if (!resultSet.contains(name)) { - resultSet[name] = argument - break - } - } - } - - return resultSet -} - internal fun KtTypeNullability.toConeNullability() = when (this) { KtTypeNullability.NULLABLE -> ConeNullability.NULLABLE KtTypeNullability.NON_NULLABLE -> ConeNullability.NOT_NULL