[FIR] Adapt AllOpenVisibilityTransformer to work with unresolved annotation arguments

This commit is contained in:
Dmitriy Novozhilov
2021-09-21 12:39:29 +03:00
committed by TeamCityServer
parent e011ca183d
commit 84dab9230e
3 changed files with 24 additions and 27 deletions
@@ -8,21 +8,19 @@ package org.jetbrains.kotlin.fir.plugin
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirPluginKey import org.jetbrains.kotlin.fir.declarations.FirPluginKey
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.arguments import org.jetbrains.kotlin.fir.expressions.arguments
import org.jetbrains.kotlin.fir.extensions.FirStatusTransformerExtension import org.jetbrains.kotlin.fir.extensions.FirStatusTransformerExtension
import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate
import org.jetbrains.kotlin.fir.extensions.predicate.hasOrUnder import org.jetbrains.kotlin.fir.extensions.predicate.hasOrUnder
import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
import org.jetbrains.kotlin.fir.extensions.transform import org.jetbrains.kotlin.fir.extensions.transform
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.fir.types.coneTypeSafe
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -59,10 +57,9 @@ class AllOpenVisibilityTransformer(session: FirSession) : FirStatusTransformerEx
val annotation = annotations.firstOrNull { val annotation = annotations.firstOrNull {
it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == AllPublicClassId it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == AllPublicClassId
} as? FirAnnotationCall ?: return null } as? FirAnnotationCall ?: return null
val argument = annotation.arguments.firstOrNull() as? FirQualifiedAccessExpression ?: return null val argument = annotation.arguments.firstOrNull() as? FirPropertyAccessExpression ?: return null
val symbol = (argument.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol<*> ?: return null val reference = argument.calleeReference as? FirNamedReference ?: return null
val name = symbol.takeIf { it.containingClass()?.classId == VisibilityClassId }?.callableId?.callableName ?: return null return when (reference.name) {
return when (name) {
PublicName -> Visibilities.Public PublicName -> Visibilities.Public
InternalName -> Visibilities.Internal InternalName -> Visibilities.Internal
PrivateName -> Visibilities.Private PrivateName -> Visibilities.Private
@@ -1,43 +1,43 @@
FILE: visibilityTransformation.kt FILE: visibilityTransformation.kt
@R|org/jetbrains/kotlin/fir/plugin/AllPublic|(visibility = Q|org/jetbrains/kotlin/fir/plugin/Visibility|.R|org/jetbrains/kotlin/fir/plugin/Visibility.Protected|) public final class A : R|kotlin/Any| { @R|org/jetbrains/kotlin/fir/plugin/AllPublic|(visibility = Q|org/jetbrains/kotlin/fir/plugin/Visibility|.R|org/jetbrains/kotlin/fir/plugin/Visibility.Protected|) protected final class A : R|kotlin/Any| {
public constructor(): R|A| { protected constructor(): R|A| {
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }
public final val x: R|kotlin/String| = String() protected final val x: R|kotlin/String| = String()
public get(): R|kotlin/String| protected get(): R|kotlin/String|
public final fun foo(): R|kotlin/Unit| { protected final fun foo(): R|kotlin/Unit| {
} }
public final class Nested : R|kotlin/Any| { protected final class Nested : R|kotlin/Any| {
public constructor(): R|A.Nested| { protected constructor(): R|A.Nested| {
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }
public final fun bar(): R|kotlin/Unit| { protected final fun bar(): R|kotlin/Unit| {
} }
} }
} }
@R|org/jetbrains/kotlin/fir/plugin/AllPublic|(visibility = Q|org/jetbrains/kotlin/fir/plugin/Visibility|.R|org/jetbrains/kotlin/fir/plugin/Visibility.Private|) public final class B : R|kotlin/Any| { @R|org/jetbrains/kotlin/fir/plugin/AllPublic|(visibility = Q|org/jetbrains/kotlin/fir/plugin/Visibility|.R|org/jetbrains/kotlin/fir/plugin/Visibility.Private|) private final class B : R|kotlin/Any| {
public constructor(): R|B| { private constructor(): R|B| {
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }
public final val x: R|kotlin/String| = String() private final val x: R|kotlin/String| = String()
public get(): R|kotlin/String| private get(): R|kotlin/String|
public final fun foo(): R|kotlin/Unit| { private final fun foo(): R|kotlin/Unit| {
} }
public final class Nested : R|kotlin/Any| { private final class Nested : R|kotlin/Any| {
public constructor(): R|B.Nested| { private constructor(): R|B.Nested| {
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }
public final fun bar(): R|kotlin/Unit| { private final fun bar(): R|kotlin/Unit| {
} }
} }
@@ -3,7 +3,7 @@ import org.jetbrains.kotlin.fir.plugin.Visibility
@AllPublic(Visibility.Protected) @AllPublic(Visibility.Protected)
class A { class A {
val x: String val x: String = ""
fun foo() {} fun foo() {}
@@ -16,7 +16,7 @@ class A {
@AllPublic(Visibility.Private) @AllPublic(Visibility.Private)
class B { class B {
val x: String val x: String = ""
fun foo() { fun foo() {
@@ -27,4 +27,4 @@ class B {
} }
} }
} }