From 5056c439756893390520a06b2869fa0296088c89 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 28 Mar 2016 16:19:35 +0300 Subject: [PATCH] Do not check receiver for protected constructor calls Checks for protected constructors should be performed manually, because they are rather complex --- .../protectedVisibility/constructors.kt | 22 +++++++++ .../protectedVisibility/constructors.txt | 43 +++++++++++++++++ .../protectedVisibility/constructorsInner.kt | 19 ++++++++ .../protectedVisibility/constructorsInner.txt | 47 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 12 +++++ .../kotlin/descriptors/Visibilities.java | 2 + 6 files changed, 145 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.kt create mode 100644 compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.txt create mode 100644 compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt create mode 100644 compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.txt diff --git a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.kt b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.kt new file mode 100644 index 00000000000..a73ccd49bb3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.kt @@ -0,0 +1,22 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +open class A protected constructor(x: Int) { + protected constructor() : this(1) + protected constructor(x: String) : this(2) + public constructor(x: Double) : this(3) +} + +fun foo() { + A() + A(1.0) +} + +class B1 : A(1) {} +class B2 : A() {} +class B3 : A("") {} + +class B4 : A { + constructor() : super(1) + constructor(x: Int) : super() + constructor(x: Int, y: Int) : super("") +} diff --git a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.txt b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.txt new file mode 100644 index 00000000000..20c750647af --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.txt @@ -0,0 +1,43 @@ +package + +public fun foo(): kotlin.Unit + +public open class A { + protected constructor A() + public constructor A(/*0*/ x: kotlin.Double) + protected constructor A(/*0*/ x: kotlin.Int) + protected constructor A(/*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 +} + +public final class B1 : A { + public constructor B1() + 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 B2 : A { + public constructor B2() + 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 B3 : A { + public constructor B3() + 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 B4 : A { + public constructor B4() + public constructor B4(/*0*/ x: kotlin.Int) + public constructor B4(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int) + 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 +} diff --git a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt new file mode 100644 index 00000000000..5c7bc221ee5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt @@ -0,0 +1,19 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +open class Outer { + inner open class A protected constructor(x: Int) { + protected constructor() : this(1) + + protected constructor(x: String) : this(2) + } + + inner class B1 : A(1) {} + inner class B2 : A() {} + inner class B3 : A("") {} + + inner class B4 : A { + constructor() : super(1) + constructor(x: Int) : super() + constructor(x: Int, y: Int) : super("") + } +} + diff --git a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.txt b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.txt new file mode 100644 index 00000000000..77d43414c16 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.txt @@ -0,0 +1,47 @@ +package + +public open class Outer { + public constructor Outer() + 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 open inner class A { + protected constructor A() + protected constructor A(/*0*/ x: kotlin.Int) + protected constructor A(/*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 + } + + public final inner class B1 : Outer.A { + public constructor B1() + 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 inner class B2 : Outer.A { + public constructor B2() + 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 inner class B3 : Outer.A { + public constructor B3() + 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 inner class B4 : Outer.A { + public constructor B4() + public constructor B4(/*0*/ x: kotlin.Int) + public constructor B4(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int) + 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 + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 8faff68d66b..cb57d310cba 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -15470,6 +15470,18 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("constructors.kt") + public void testConstructors() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructors.kt"); + doTest(fileName); + } + + @TestMetadata("constructorsInner.kt") + public void testConstructorsInner() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt"); + doTest(fileName); + } + @TestMetadata("innerClassInJava.kt") public void testInnerClassInJava() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/scopes/protectedVisibility/innerClassInJava.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java index dd30332f3e0..afa807a830c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java @@ -162,6 +162,8 @@ public class Visibilities { ) { // Do not check receiver for non-callable declarations if (!(whatDeclaration instanceof CallableMemberDescriptor)) return true; + // Constructor accessibility check is performed manually + if (whatDeclaration instanceof ConstructorDescriptor) return true; // See Visibility.isVisible contract if (receiver == ALWAYS_SUITABLE_RECEIVER) return true;