From d997a6cb35985f284f0a5e0c8332df64255df418 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Thu, 20 Nov 2014 17:01:21 +0300 Subject: [PATCH] Fix protected visibility in class object. --- .../tests/scopes/VisibilityInClassObject.kt | 33 +++++++++++++++++++ .../tests/scopes/VisibilityInClassObject.txt | 32 ++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++ .../jet/lang/descriptors/Visibilities.java | 3 ++ 4 files changed, 74 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.kt create mode 100644 compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.txt diff --git a/compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.kt b/compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.kt new file mode 100644 index 00000000000..fa1e3085ffe --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.kt @@ -0,0 +1,33 @@ +fun devNull(obj: Any?) {} + +open class A { + class object { + val internal_val = 1 + public val public_val: Int = 2 + private val private_val = 3 + protected val protected_val: Int = 5 + } + + fun fromClass() { + devNull(internal_val) + devNull(public_val) + devNull(private_val) + devNull(protected_val) + } +} + +fun fromOutside() { + devNull(A.internal_val) + devNull(A.public_val) + devNull(A.private_val) + devNull(A.protected_val) +} + +class B: A() { + fun fromSubclass() { + devNull(A.internal_val) + devNull(A.public_val) + devNull(A.private_val) + devNull(A.protected_val) + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.txt b/compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.txt new file mode 100644 index 00000000000..d3ae48e0e5a --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.txt @@ -0,0 +1,32 @@ +package + +internal fun devNull(/*0*/ obj: kotlin.Any?): kotlin.Unit +internal fun fromOutside(): kotlin.Unit + +internal open class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal final fun fromClass(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + internal class object { + private constructor () + internal final val internal_val: kotlin.Int = 1 + private final val private_val: kotlin.Int = 3 + protected final val protected_val: kotlin.Int = 5 + public final val public_val: kotlin.Int = 2 + 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 + } +} + +internal final class B : A { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal final override /*1*/ /*fake_override*/ fun fromClass(): kotlin.Unit + internal final fun fromSubclass(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 1a1f2a18e4f..d8ffbfbcd85 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -9396,6 +9396,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("VisibilityInClassObject.kt") + public void testVisibilityInClassObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/scopes/VisibilityInClassObject.kt"); + doTest(fileName); + } + @TestMetadata("VisibilityInheritModifier.kt") public void testVisibilityInheritModifier() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/scopes/VisibilityInheritModifier.kt"); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java index 1ce6fc3a03b..a9626a0406c 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java @@ -63,6 +63,9 @@ public class Visibilities { @Override protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { ClassDescriptor classDescriptor = DescriptorUtils.getParentOfType(what, ClassDescriptor.class); + if (DescriptorUtils.isClassObject(classDescriptor)) { + classDescriptor = DescriptorUtils.getParentOfType(classDescriptor, ClassDescriptor.class); + } if (classDescriptor == null) return false; ClassDescriptor fromClass = DescriptorUtils.getParentOfType(from, ClassDescriptor.class, false);