FIR IDE: migrate annotation parameter conversion util
This commit is contained in:
committed by
Ilya Kirillov
parent
0f16a2cb92
commit
f94dad7005
+1
-1
@@ -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,
|
||||
|
||||
+42
-4
@@ -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<FirAnnotatedDeclaration>.getAnnotationClass
|
||||
withFirByType(ResolveType.AnnotationType) { fir ->
|
||||
fir.annotations.mapNotNull { it.getClassId(fir.moduleData.session) }
|
||||
}
|
||||
|
||||
internal fun mapAnnotationParameters(annotation: FirAnnotation, session: FirSession): Map<String, FirExpression> {
|
||||
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<String, FirExpression>()
|
||||
|
||||
val namesSequence = annotationCtorParameterNames?.asSequence()?.iterator()
|
||||
|
||||
for (argument in annotation.argumentList.arguments.filterIsInstance<FirNamedArgumentExpression>()) {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -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<String, FirExpression> {
|
||||
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<String, FirExpression>()
|
||||
|
||||
val namesSequence = annotationCtorParameterNames?.asSequence()?.iterator()
|
||||
|
||||
for (argument in annotation.argumentList.arguments.filterIsInstance<FirNamedArgumentExpression>()) {
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user