Skip to content

Commit

Permalink
...
Browse files Browse the repository at this point in the history
  • Loading branch information
IVIanuu committed Mar 11, 2025
1 parent 166990c commit f461bfc
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 39 deletions.
2 changes: 2 additions & 0 deletions compiler/src/main/kotlin/injekt/compiler/InjektFqNames.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

package injekt.compiler

import org.jetbrains.kotlin.builtins.*
import org.jetbrains.kotlin.name.*

object InjektFqNames {
Expand Down Expand Up @@ -34,4 +35,5 @@ object InjektFqNames {
val kSuspendFunction = StandardClassIds.BASE_COROUTINES_PACKAGE.child("KSuspendFunction".asNameId()).asString()
val composableFunction = FqName("androidx.compose.runtime.internal.ComposableFunction").asString()
val kComposableFunction = FqName("androidx.compose.runtime.internal.KComposableFunction").asString()
val Target = ClassId.topLevel(StandardNames.FqNames.target)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
package injekt.compiler.fir

import injekt.compiler.*
import org.jetbrains.kotlin.builtins.*
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
import org.jetbrains.kotlin.fir.declarations.*
Expand All @@ -34,52 +33,53 @@ class TagAnnotationTargetPatcher(
containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean
): FirDeclarationStatus {
val targetClassId = ClassId.topLevel(StandardNames.FqNames.target)
if (!regularClass.hasAnnotation(targetClassId, session)) {
val targetSymbol = targetClassId.toSymbol(session)!!
.cast<FirClassSymbol<*>>()
val targetConstructorSymbol =
targetSymbol.primaryConstructorSymbol(session)!!
val allowedTargetsValueParameterSymbol =
targetConstructorSymbol.valueParameterSymbols.single()
if (regularClass.hasAnnotation(InjektFqNames.Target, session))
return super.transformStatus(status, regularClass, containingClass, isLocal)

regularClass.replaceAnnotations(
regularClass.annotations + buildAnnotation {
source = regularClass.source
val targetSymbol = InjektFqNames.Target
.toSymbol(session)!!
.cast<FirClassSymbol<*>>()
val targetConstructorSymbol =
targetSymbol.primaryConstructorSymbol(session)!!
val allowedTargetsValueParameterSymbol =
targetConstructorSymbol.valueParameterSymbols.single()

annotationTypeRef = targetSymbol.defaultType().toFirResolvedTypeRef()
regularClass.replaceAnnotations(
regularClass.annotations + buildAnnotation {
source = regularClass.source

argumentMapping = buildAnnotationArgumentMapping {
mapping[Name.identifier("allowedTargets")] =
buildVarargArgumentsExpression {
coneTypeOrNull = allowedTargetsValueParameterSymbol.resolvedReturnType
coneElementTypeOrNull = allowedTargetsValueParameterSymbol.resolvedReturnType
.typeArguments
.single()
.type
annotationTypeRef = targetSymbol.defaultType().toFirResolvedTypeRef()

arguments += buildEnumEntryDeserializedAccessExpression {
enumClassId = StandardClassIds.AnnotationTarget
enumEntryName = Name.identifier("CLASS")
}
.toQualifiedPropertyAccessExpression(session)
argumentMapping = buildAnnotationArgumentMapping {
mapping[Name.identifier("allowedTargets")] =
buildVarargArgumentsExpression {
coneTypeOrNull = allowedTargetsValueParameterSymbol.resolvedReturnType
coneElementTypeOrNull = allowedTargetsValueParameterSymbol.resolvedReturnType
.typeArguments
.single()
.type

arguments += buildEnumEntryDeserializedAccessExpression {
enumClassId = StandardClassIds.AnnotationTarget
enumEntryName = Name.identifier("CONSTRUCTOR")
}
.toQualifiedPropertyAccessExpression(session)
arguments += buildEnumEntryDeserializedAccessExpression {
enumClassId = StandardClassIds.AnnotationTarget
enumEntryName = Name.identifier("CLASS")
}
.toQualifiedPropertyAccessExpression(session)

arguments += buildEnumEntryDeserializedAccessExpression {
enumClassId = StandardClassIds.AnnotationTarget
enumEntryName = Name.identifier("CONSTRUCTOR")
}
.toQualifiedPropertyAccessExpression(session)

arguments += buildEnumEntryDeserializedAccessExpression {
enumClassId = StandardClassIds.AnnotationTarget
enumEntryName = Name.identifier("TYPE")
}
.toQualifiedPropertyAccessExpression(session)
arguments += buildEnumEntryDeserializedAccessExpression {
enumClassId = StandardClassIds.AnnotationTarget
enumEntryName = Name.identifier("TYPE")
}
}
.toQualifiedPropertyAccessExpression(session)
}
}
)
}
}
)

return super.transformStatus(status, regularClass, containingClass, isLocal)
}
Expand Down

0 comments on commit f461bfc

Please sign in to comment.