diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java index c7eb0e83cd4..0e8a1aaff9a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java @@ -118,6 +118,14 @@ public final class DescriptorResolverUtils { return null; } + public static Visibility getConstructorVisibility(ClassDescriptor classDescriptor) { + Visibility containingClassVisibility = classDescriptor.getVisibility(); + if (containingClassVisibility == JavaDescriptorResolver.PROTECTED_STATIC_VISIBILITY) { + return Visibilities.PROTECTED; + } + return containingClassVisibility; + } + public static void checkPsiClassIsNotJet(@Nullable PsiClass psiClass) { if (psiClass instanceof JetJavaMirrorMarker) { throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass.getQualifiedName()); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java index cf1bc025f06..382bc9321a1 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java @@ -85,6 +85,7 @@ public final class JavaConstructorResolver { constructors.add(trace.get(BindingContext.CONSTRUCTOR, psiClass)); } else { + Visibility constructorVisibility = DescriptorResolverUtils.getConstructorVisibility(containingClass); // We need to create default constructors for classes and abstract classes. // Example: // class Kotlin() : Java() {} @@ -94,8 +95,7 @@ public final class JavaConstructorResolver { containingClass, Collections.emptyList(), true); - constructorDescriptor.initialize(typeParameters, Collections.emptyList(), containingClass - .getVisibility(), isStatic); + constructorDescriptor.initialize(typeParameters, Collections.emptyList(), constructorVisibility, isStatic); constructors.add(constructorDescriptor); trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); } @@ -137,7 +137,7 @@ public final class JavaConstructorResolver { } } - constructorDescriptor.initialize(typeParameters, valueParameters, containingClass.getVisibility(), isStatic); + constructorDescriptor.initialize(typeParameters, valueParameters, constructorVisibility, isStatic); constructors.add(constructorDescriptor); trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); } diff --git a/compiler/testData/loadJavaCustom/protectedStaticVisibility/constructor/ConstructorInProtectedStaticNestedClass.java b/compiler/testData/loadJavaCustom/protectedStaticVisibility/constructor/ConstructorInProtectedStaticNestedClass.java new file mode 100644 index 00000000000..71b1715ec3e --- /dev/null +++ b/compiler/testData/loadJavaCustom/protectedStaticVisibility/constructor/ConstructorInProtectedStaticNestedClass.java @@ -0,0 +1,7 @@ +package test; + +public class ConstructorInProtectedStaticNestedClass { + protected static class Inner { + + } +} diff --git a/compiler/testData/loadJavaCustom/protectedStaticVisibility/constructor/ConstructorInProtectedStaticNestedClass.txt b/compiler/testData/loadJavaCustom/protectedStaticVisibility/constructor/ConstructorInProtectedStaticNestedClass.txt new file mode 100644 index 00000000000..d72b7febebf --- /dev/null +++ b/compiler/testData/loadJavaCustom/protectedStaticVisibility/constructor/ConstructorInProtectedStaticNestedClass.txt @@ -0,0 +1,9 @@ +package test + +public open class ConstructorInProtectedStaticNestedClass : java.lang.Object { + public constructor ConstructorInProtectedStaticNestedClass() + + protected_static open class Inner : java.lang.Object { + protected constructor Inner() + } +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java index 769ae6cf1e8..d9eed260b48 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java @@ -94,6 +94,12 @@ public final class LoadJavaCustomTest extends KotlinTestWithEnvironment { doSimpleTest(); } + public void testProtectedStaticVisibility() throws Exception { + String dir = PATH + "/protectedStaticVisibility/constructor/"; + doTest(dir + "ConstructorInProtectedStaticNestedClass.txt", + dir + "ConstructorInProtectedStaticNestedClass.java"); + } + public void testStaticFinal() throws Exception { String dir = "/staticFinal/"; doTest(PATH + dir + "expected.txt",