From f1363cbf8823011b41c3aea77182adbfb363f008 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 28 Jun 2016 12:33:25 +0300 Subject: [PATCH] Fix visibility checks for constructor call based on type alias Constructor is invisible iff. either underlying constructor or corresposing type alias is invisible #KT-12888 Fixed --- .../constructorCallThroughPrivateAlias.kt | 29 +++++++++++++++++++ .../constructorCallThroughPrivateAlias.txt | 20 +++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++ .../kotlin/descriptors/Visibilities.java | 9 ++++++ 4 files changed, 64 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.txt diff --git a/compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.kt b/compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.kt new file mode 100644 index 00000000000..7d6ae58cb01 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.kt @@ -0,0 +1,29 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE +// !CHECK_TYPE +// FILE: a.kt +package a + +class B(x: String) +typealias A1 = B +private typealias A2 = B +private typealias A3 = B + +fun A3(x: Any) = "OK" + +fun bar() { + A3("") checkType { _() } +} + +// FILE: main.kt +package usage + +import a.B + +fun baz() { + a.A1("") // resolved to B constructor, OK + a.A2("") // resolved to B constructor, INVISIBLE_MEMBER because type alias is private, OK + + a.A3("") checkType { _() } + + val x: a.A2 = B("") // A2 is unresolved because it's private in file, OK +} diff --git a/compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.txt b/compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.txt new file mode 100644 index 00000000000..d1336a7339f --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.txt @@ -0,0 +1,20 @@ +package + +package a { + public typealias A1 = a.B + private typealias A2 = a.B + private typealias A3 = a.B + public fun A3(/*0*/ x: kotlin.Any): kotlin.String + public fun bar(): kotlin.Unit + + public final class B { + public constructor B(/*0*/ x: 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 + } +} + +package usage { + public fun baz(): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 868133f9479..83c86044c33 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -19635,6 +19635,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("constructorCallThroughPrivateAlias.kt") + public void testConstructorCallThroughPrivateAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/constructorCallThroughPrivateAlias.kt"); + doTest(fileName); + } + @TestMetadata("exposedExpandedType.kt") public void testExposedExpandedType() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/exposedExpandedType.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java index 5424b00d6a8..c1a7133983e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.descriptors; import kotlin.collections.SetsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.kotlin.resolve.scopes.receivers.SuperCallReceiverValue; @@ -315,6 +316,14 @@ public class Visibilities { } parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class); } + + if (what instanceof TypeAliasConstructorDescriptor) { + DeclarationDescriptorWithVisibility invisibleMember = + findInvisibleMember(receiver, ((TypeAliasConstructorDescriptor) what).getTypeAliasDescriptor(), from); + + if (invisibleMember != null) return invisibleMember; + } + return null; }