[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.Visibility
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.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirPluginKey
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.extensions.FirStatusTransformerExtension
import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate
import org.jetbrains.kotlin.fir.extensions.predicate.hasOrUnder
import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
import org.jetbrains.kotlin.fir.extensions.transform
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneTypeSafe
import org.jetbrains.kotlin.name.ClassId
@@ -59,10 +57,9 @@ class AllOpenVisibilityTransformer(session: FirSession) : FirStatusTransformerEx
val annotation = annotations.firstOrNull {
it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == AllPublicClassId
} as? FirAnnotationCall ?: return null
val argument = annotation.arguments.firstOrNull() as? FirQualifiedAccessExpression ?: return null
val symbol = (argument.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol<*> ?: return null
val name = symbol.takeIf { it.containingClass()?.classId == VisibilityClassId }?.callableId?.callableName ?: return null
return when (name) {
val argument = annotation.arguments.firstOrNull() as? FirPropertyAccessExpression ?: return null
val reference = argument.calleeReference as? FirNamedReference ?: return null
return when (reference.name) {
PublicName -> Visibilities.Public
InternalName -> Visibilities.Internal
PrivateName -> Visibilities.Private
@@ -1,43 +1,43 @@
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| {
public constructor(): R|A| {
@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| {
protected constructor(): R|A| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/String| = String()
public get(): R|kotlin/String|
protected final val x: R|kotlin/String| = 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| {
public constructor(): R|A.Nested| {
protected final class Nested : R|kotlin/Any| {
protected constructor(): R|A.Nested| {
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| {
public constructor(): R|B| {
@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| {
private constructor(): R|B| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/String| = String()
public get(): R|kotlin/String|
private final val x: R|kotlin/String| = 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| {
public constructor(): R|B.Nested| {
private final class Nested : R|kotlin/Any| {
private constructor(): R|B.Nested| {
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)
class A {
val x: String
val x: String = ""
fun foo() {}
@@ -16,7 +16,7 @@ class A {
@AllPublic(Visibility.Private)
class B {
val x: String
val x: String = ""
fun foo() {
@@ -27,4 +27,4 @@ class B {
}
}
}
}