From 84dab9230eac7d1f19e1cde6c510500e788b3707 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 21 Sep 2021 12:39:29 +0300 Subject: [PATCH] [FIR] Adapt AllOpenVisibilityTransformer to work with unresolved annotation arguments --- .../plugin/AllOpenVisibilityTransformer.kt | 13 +++----- .../status/visibilityTransformation.fir.txt | 32 +++++++++---------- .../status/visibilityTransformation.kt | 6 ++-- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt index 27b0ae18a85..1c9b88279c3 100644 --- a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt @@ -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()?.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 diff --git a/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.fir.txt b/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.fir.txt index c6afa23858a..255c0c3694c 100644 --- a/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.fir.txt +++ b/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.fir.txt @@ -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() } - 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() } - 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() } - 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() } - public final fun bar(): R|kotlin/Unit| { + private final fun bar(): R|kotlin/Unit| { } } diff --git a/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.kt b/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.kt index c79ff0d9fa9..69745b43a92 100644 --- a/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.kt +++ b/plugins/fir/fir-plugin-prototype/testData/status/visibilityTransformation.kt @@ -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 { } } -} \ No newline at end of file +}