From 30e5748fec6eec59783899ea572926cc35a7e62f Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 12 May 2020 00:04:29 -0700 Subject: [PATCH] FIR: set proper visibility of property accessors. --- .../callableReferences/ifWithCR.txt | 4 +- .../converter/DeclarationsConverter.kt | 37 +++++++++++++++---- .../kotlin/fir/builder/RawFirBuilder.kt | 22 +++++++++-- .../testData/codegen/box/classes/kt2477.kt | 1 - .../jvm8/defaults/privateInDefaultImpls.kt | 1 - .../codegen/box/regressions/kt13381.kt | 1 - .../box/traits/traitWithPrivateMember.kt | 1 - .../traitWithPrivateMemberAccessFromLambda.kt | 1 - 8 files changed, 49 insertions(+), 19 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/ifWithCR.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/ifWithCR.txt index 1c0ffaeb609..5abb5b7265c 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/ifWithCR.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/ifWithCR.txt @@ -1,11 +1,11 @@ FILE: ifWithCR.kt private final var R|kotlin/Int|.readOnlyWrapper: R|kotlin/CharSequence?| - public get(): R|kotlin/CharSequence?| { + private get(): R|kotlin/CharSequence?| { ^ Null(null) } private set(value: R|kotlin/CharSequence?|): R|kotlin/Unit| private final var R|kotlin/Int|.mutableWrapper: R|kotlin/CharSequence?| - public get(): R|kotlin/CharSequence?| { + private get(): R|kotlin/CharSequence?| { ^ Null(null) } private set(value: R|kotlin/CharSequence?|): R|kotlin/Unit| diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index e2718ffe331..2ce98a6752e 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.KtNodeTypes.* import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.builder.Context @@ -664,7 +665,11 @@ class DeclarationsConverter( * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject * primaryConstructor branch */ - private fun convertPrimaryConstructor(primaryConstructor: LighterASTNode?, classWrapper: ClassWrapper, delegatedConstructorSource: FirLightSourceElement?): PrimaryConstructor? { + private fun convertPrimaryConstructor( + primaryConstructor: LighterASTNode?, + classWrapper: ClassWrapper, + delegatedConstructorSource: FirLightSourceElement? + ): PrimaryConstructor? { if (primaryConstructor == null && !classWrapper.isEnumEntry() && classWrapper.hasSecondaryConstructor) return null if (classWrapper.isInterface()) return null @@ -939,7 +944,8 @@ class DeclarationsConverter( } } - status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply { + val propertyVisibility = modifiers.getVisibility() + status = FirDeclarationStatusImpl(propertyVisibility, modifiers.getModality()).apply { isExpect = modifiers.hasExpect() isActual = modifiers.hasActual() isOverride = modifiers.hasOverride() @@ -948,13 +954,13 @@ class DeclarationsConverter( } - val convertedAccessors = accessors.map { convertGetterOrSetter(it, returnType) } + val convertedAccessors = accessors.map { convertGetterOrSetter(it, returnType, propertyVisibility) } this.getter = convertedAccessors.find { it.isGetter } - ?: FirDefaultPropertyGetter(null, session, FirDeclarationOrigin.Source, returnType, modifiers.getVisibility()) + ?: FirDefaultPropertyGetter(null, session, FirDeclarationOrigin.Source, returnType, propertyVisibility) this.setter = if (isVar) { convertedAccessors.find { it.isSetter } - ?: FirDefaultPropertySetter(null, session, FirDeclarationOrigin.Source, returnType, modifiers.getVisibility()) + ?: FirDefaultPropertySetter(null, session, FirDeclarationOrigin.Source, returnType, propertyVisibility) } else null val receiver = delegateExpression?.let { @@ -1027,7 +1033,11 @@ class DeclarationsConverter( /** * @see org.jetbrains.kotlin.parsing.KotlinParsing.parsePropertyGetterOrSetter */ - private fun convertGetterOrSetter(getterOrSetter: LighterASTNode, propertyTypeRef: FirTypeRef): FirPropertyAccessor { + private fun convertGetterOrSetter( + getterOrSetter: LighterASTNode, + propertyTypeRef: FirTypeRef, + propertyVisibility: Visibility + ): FirPropertyAccessor { var modifiers = Modifier() var isGetter = true var returnType: FirTypeRef? = null @@ -1051,10 +1061,21 @@ class DeclarationsConverter( } } + var accessorVisibility = modifiers.getVisibility() + if (accessorVisibility == Visibilities.UNKNOWN) { + accessorVisibility = propertyVisibility + } val sourceElement = getterOrSetter.toFirSourceElement() if (block == null && expression == null) { return FirDefaultPropertyAccessor - .createGetterOrSetter(sourceElement, baseSession, FirDeclarationOrigin.Source, propertyTypeRef, modifiers.getVisibility(), isGetter) + .createGetterOrSetter( + sourceElement, + baseSession, + FirDeclarationOrigin.Source, + propertyTypeRef, + accessorVisibility, + isGetter + ) .also { it.annotations += modifiers.annotations } @@ -1067,7 +1088,7 @@ class DeclarationsConverter( returnTypeRef = returnType ?: if (isGetter) propertyTypeRef else implicitUnitType symbol = FirPropertyAccessorSymbol() this.isGetter = isGetter - status = FirDeclarationStatusImpl(modifiers.getVisibility(), Modality.FINAL) + status = FirDeclarationStatusImpl(accessorVisibility, Modality.FINAL) context.firFunctionTargets += target annotations += modifiers.annotations diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 3abb3d85485..33bea388b92 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -267,11 +267,19 @@ class RawFirBuilder( propertyTypeRef: FirTypeRef, isGetter: Boolean, ): FirPropertyAccessor { + val accessorVisibility = + if (this?.visibility != null && this.visibility != Visibilities.UNKNOWN) this.visibility else property.visibility if (this == null || !hasBody()) { val propertySource = property.toFirSourceElement() - val accessorVisibility = this?.visibility ?: property.visibility return FirDefaultPropertyAccessor - .createGetterOrSetter(propertySource, baseSession, FirDeclarationOrigin.Source, propertyTypeRef, accessorVisibility, isGetter) + .createGetterOrSetter( + propertySource, + baseSession, + FirDeclarationOrigin.Source, + propertyTypeRef, + accessorVisibility, + isGetter + ) .also { if (this != null) { it.extractAnnotationsFrom(this) @@ -290,7 +298,7 @@ class RawFirBuilder( returnTypeReference.toFirOrUnitType() } this.isGetter = isGetter - status = FirDeclarationStatusImpl(visibility, Modality.FINAL) + status = FirDeclarationStatusImpl(accessorVisibility, Modality.FINAL) extractAnnotationsTo(this) this@RawFirBuilder.context.firFunctionTargets += accessorTarget extractValueParametersTo(this, propertyTypeRef) @@ -374,7 +382,13 @@ class RawFirBuilder( isLocal = false this.status = status getter = FirDefaultPropertyGetter(propertySource, baseSession, FirDeclarationOrigin.Source, type, visibility) - setter = if (isMutable) FirDefaultPropertySetter(propertySource, baseSession, FirDeclarationOrigin.Source, type, visibility) else null + setter = if (isMutable) FirDefaultPropertySetter( + propertySource, + baseSession, + FirDeclarationOrigin.Source, + type, + visibility + ) else null extractAnnotationsTo(this) } } diff --git a/compiler/testData/codegen/box/classes/kt2477.kt b/compiler/testData/codegen/box/classes/kt2477.kt index f775c6c99fb..8f45431717c 100644 --- a/compiler/testData/codegen/box/classes/kt2477.kt +++ b/compiler/testData/codegen/box/classes/kt2477.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR package test interface A { diff --git a/compiler/testData/codegen/box/jvm8/defaults/privateInDefaultImpls.kt b/compiler/testData/codegen/box/jvm8/defaults/privateInDefaultImpls.kt index 0af5014a709..a5ab5728745 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/privateInDefaultImpls.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/privateInDefaultImpls.kt @@ -1,5 +1,4 @@ // !JVM_DEFAULT_MODE: enable -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // JVM_TARGET: 1.8 // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/regressions/kt13381.kt b/compiler/testData/codegen/box/regressions/kt13381.kt index 6274447be56..b424d596455 100644 --- a/compiler/testData/codegen/box/regressions/kt13381.kt +++ b/compiler/testData/codegen/box/regressions/kt13381.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR interface A { // There must be no delegation methods for 'log' and 'bar' in C as they are private private val log: String get() = "O" diff --git a/compiler/testData/codegen/box/traits/traitWithPrivateMember.kt b/compiler/testData/codegen/box/traits/traitWithPrivateMember.kt index 07604d6cf0e..50debaa1e26 100644 --- a/compiler/testData/codegen/box/traits/traitWithPrivateMember.kt +++ b/compiler/testData/codegen/box/traits/traitWithPrivateMember.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR interface Z { fun testFun() : String { diff --git a/compiler/testData/codegen/box/traits/traitWithPrivateMemberAccessFromLambda.kt b/compiler/testData/codegen/box/traits/traitWithPrivateMemberAccessFromLambda.kt index 7628c5b4985..0b2a16072d3 100644 --- a/compiler/testData/codegen/box/traits/traitWithPrivateMemberAccessFromLambda.kt +++ b/compiler/testData/codegen/box/traits/traitWithPrivateMemberAccessFromLambda.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR interface Z { fun testFun(): String {