diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java index 4c5a570afa7..b811ac936f9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java @@ -609,8 +609,11 @@ public abstract class CodegenContext { withinInliningContext, superCallTarget != null); PropertySetterDescriptor setter = propertyDescriptor.getSetter(); - int setterAccessFlag = setter == null ? propertyAccessFlag - : propertyAccessFlag | getVisibilityAccessFlag(setter); + + int setterAccessFlag = propertyAccessFlag; + if (setter != null && setter.getVisibility().normalize() != Visibilities.INVISIBLE_FAKE) { + setterAccessFlag = propertyAccessFlag | getVisibilityAccessFlag(setter); + } boolean setterAccessorRequired = isAccessorRequired(setterAccessFlag, unwrappedDescriptor, descriptorContext, withinInliningContext, superCallTarget != null); diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/privateSetter.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/privateSetter.kt new file mode 100644 index 00000000000..b4335ce390e --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/privateSetter.kt @@ -0,0 +1,17 @@ +open class X(s : String) { + public var n: String = s + private set + +} + +class Z : X("subclass") { + fun print(): String { + n = n + return n; + } +} + + +fun box() : String { + return Z().print() //error +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/privateSetter.txt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/privateSetter.txt new file mode 100644 index 00000000000..1fdf8edd098 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/privateSetter.txt @@ -0,0 +1,20 @@ +package + +public fun box(): kotlin.String + +public open class X { + public constructor X(/*0*/ s: kotlin.String) + public final var n: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Z : X { + public constructor Z() + public final override /*1*/ /*fake_override*/ var n: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun print(): kotlin.String + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index e11f2b4984d..f67130801be 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -3411,6 +3411,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("privateSetter.kt") + public void testPrivateSetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlFlowAnalysis/privateSetter.kt"); + doTest(fileName); + } + @TestMetadata("propertiesInitWithOtherInstance.kt") public void testPropertiesInitWithOtherInstance() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlFlowAnalysis/propertiesInitWithOtherInstance.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java index 46f2935be8e..5cef2fd0d3c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -259,7 +259,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp substitutedDescriptor.setType(outType, substitutedTypeParameters, substitutedDispatchReceiver, substitutedReceiverType); PropertyGetterDescriptorImpl newGetter = getter == null ? null : new PropertyGetterDescriptorImpl( - substitutedDescriptor, getter.getAnnotations(), newModality, getter.getVisibility(), + substitutedDescriptor, getter.getAnnotations(), newModality, normalizeVisibility(getter.getVisibility(), kind), getter.isDefault(), getter.isExternal(), kind, original == null ? null : original.getGetter(), SourceElement.NO_SOURCE ); @@ -269,7 +269,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp newGetter.initialize(returnType != null ? substitutor.substitute(returnType, Variance.OUT_VARIANCE) : null); } PropertySetterDescriptorImpl newSetter = setter == null ? null : new PropertySetterDescriptorImpl( - substitutedDescriptor, setter.getAnnotations(), newModality, setter.getVisibility(), + substitutedDescriptor, setter.getAnnotations(), newModality, normalizeVisibility(setter.getVisibility(), kind), setter.isDefault(), setter.isExternal(), kind, original == null ? null : original.getSetter(), SourceElement.NO_SOURCE ); @@ -308,6 +308,13 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp return substitutedDescriptor; } + private static Visibility normalizeVisibility(Visibility prev, Kind kind) { + if (kind == Kind.FAKE_OVERRIDE && Visibilities.isPrivate(prev.normalize())) { + return Visibilities.INVISIBLE_FAKE; + } + return prev; + } + private static FunctionDescriptor getSubstitutedInitialSignatureDescriptor( @NotNull TypeSubstitutor substitutor, @NotNull PropertyAccessorDescriptor accessorDescriptor