Fix default visibility for class object in eager and lazy resolve

This commit is contained in:
Pavel V. Talanov
2013-08-02 16:50:47 +04:00
parent 41254a926b
commit 0f8d50b44f
9 changed files with 186 additions and 2 deletions
@@ -241,6 +241,9 @@ public class ModifiersChecker {
if (kind == ClassKind.ENUM_ENTRY) {
return Visibilities.PRIVATE;
}
if (kind == ClassKind.CLASS_OBJECT) {
return ((ClassDescriptor) descriptor.getContainingDeclaration()).getVisibility();
}
return Visibilities.INTERNAL;
}
@@ -43,6 +43,8 @@ import static org.jetbrains.jet.lang.diagnostics.Errors.*;
import static org.jetbrains.jet.lang.resolve.BindingContext.FQNAME_TO_CLASS_DESCRIPTOR;
import static org.jetbrains.jet.lang.resolve.BindingContext.TYPE;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
import static org.jetbrains.jet.lang.resolve.ModifiersChecker.getDefaultClassVisibility;
import static org.jetbrains.jet.lang.resolve.ModifiersChecker.resolveVisibilityFromModifiers;
public class TypeHierarchyResolver {
@NotNull
@@ -181,7 +183,7 @@ public class TypeHierarchyResolver {
JetObjectDeclaration objectDeclaration = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
descriptor.setModality(Modality.FINAL);
descriptor.setVisibility(ModifiersChecker.resolveVisibilityFromModifiers(objectDeclaration));
descriptor.setVisibility(resolveVisibilityFromModifiers(objectDeclaration, getDefaultClassVisibility(descriptor)));
descriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
descriptor.createTypeConstructor();
}
@@ -516,7 +518,7 @@ public class TypeHierarchyResolver {
private void createClassObjectForEnumClass(JetClass klass, MutableClassDescriptor mutableClassDescriptor) {
if (mutableClassDescriptor.getKind() == ClassKind.ENUM_CLASS) {
MutableClassDescriptor classObjectDescriptor =
createClassObjectDescriptor(mutableClassDescriptor, ModifiersChecker.resolveVisibilityFromModifiers(klass));
createClassObjectDescriptor(mutableClassDescriptor, resolveVisibilityFromModifiers(klass));
mutableClassDescriptor.getBuilder().setClassObjectDescriptor(classObjectDescriptor);
classObjectDescriptor.getBuilder().addFunctionDescriptor(
DescriptorResolver.createEnumClassObjectValuesMethod(classObjectDescriptor, trace));
@@ -0,0 +1,14 @@
package test
public class Pub {
class object {}
}
private class Pri {
class object {}
}
class Int {
class object {}
}
@@ -0,0 +1,25 @@
package test
internal final class Int {
/*primary*/ public constructor Int()
internal class object <class-object-for-Int> {
/*primary*/ private constructor <class-object-for-Int>()
}
}
private final class Pri {
/*primary*/ public constructor Pri()
private class object <class-object-for-Pri> {
/*primary*/ private constructor <class-object-for-Pri>()
}
}
public final class Pub {
/*primary*/ public constructor Pub()
public class object <class-object-for-Pub> {
/*primary*/ private constructor <class-object-for-Pub>()
}
}
@@ -0,0 +1,37 @@
package test
public class PubPri {
private class object {}
}
public class PubInt {
internal class object {}
}
public class PubPub {
public class object {}
}
internal class IntPri {
private class object {}
}
internal class IntInt {
internal class object {}
}
internal class IntPub {
public class object {}
}
private class PriPri {
private class object {}
}
private class PriInt {
internal class object {}
}
private class PriPub {
public class object {}
}
@@ -0,0 +1,73 @@
package test
internal final class IntInt {
/*primary*/ public constructor IntInt()
internal class object <class-object-for-IntInt> {
/*primary*/ private constructor <class-object-for-IntInt>()
}
}
internal final class IntPri {
/*primary*/ public constructor IntPri()
private class object <class-object-for-IntPri> {
/*primary*/ private constructor <class-object-for-IntPri>()
}
}
internal final class IntPub {
/*primary*/ public constructor IntPub()
public class object <class-object-for-IntPub> {
/*primary*/ private constructor <class-object-for-IntPub>()
}
}
private final class PriInt {
/*primary*/ public constructor PriInt()
internal class object <class-object-for-PriInt> {
/*primary*/ private constructor <class-object-for-PriInt>()
}
}
private final class PriPri {
/*primary*/ public constructor PriPri()
private class object <class-object-for-PriPri> {
/*primary*/ private constructor <class-object-for-PriPri>()
}
}
private final class PriPub {
/*primary*/ public constructor PriPub()
public class object <class-object-for-PriPub> {
/*primary*/ private constructor <class-object-for-PriPub>()
}
}
public final class PubInt {
/*primary*/ public constructor PubInt()
internal class object <class-object-for-PubInt> {
/*primary*/ private constructor <class-object-for-PubInt>()
}
}
public final class PubPri {
/*primary*/ public constructor PubPri()
private class object <class-object-for-PubPri> {
/*primary*/ private constructor <class-object-for-PubPri>()
}
}
public final class PubPub {
/*primary*/ public constructor PubPub()
public class object <class-object-for-PubPub> {
/*primary*/ private constructor <class-object-for-PubPub>()
}
}
@@ -259,6 +259,16 @@ public class DescriptorSerializationTestGenerated extends AbstractDescriptorSeri
doTest("compiler/testData/loadKotlin/classObject/ClassObjectDeclaresVar.kt");
}
@TestMetadata("ClassObjectDefaultVisibility.kt")
public void testClassObjectDefaultVisibility() throws Exception {
doTest("compiler/testData/loadKotlin/classObject/ClassObjectDefaultVisibility.kt");
}
@TestMetadata("ClassObjectExplicitVisibility.kt")
public void testClassObjectExplicitVisibility() throws Exception {
doTest("compiler/testData/loadKotlin/classObject/ClassObjectExplicitVisibility.kt");
}
@TestMetadata("ClassObjectExtendsTrait.kt")
public void testClassObjectExtendsTrait() throws Exception {
doTest("compiler/testData/loadKotlin/classObject/ClassObjectExtendsTrait.kt");
@@ -415,6 +415,16 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT
doTestWithAccessors("compiler/testData/loadKotlin/classObject/ClassObjectDeclaresVar.kt");
}
@TestMetadata("ClassObjectDefaultVisibility.kt")
public void testClassObjectDefaultVisibility() throws Exception {
doTestWithAccessors("compiler/testData/loadKotlin/classObject/ClassObjectDefaultVisibility.kt");
}
@TestMetadata("ClassObjectExplicitVisibility.kt")
public void testClassObjectExplicitVisibility() throws Exception {
doTestWithAccessors("compiler/testData/loadKotlin/classObject/ClassObjectExplicitVisibility.kt");
}
@TestMetadata("ClassObjectExtendsTrait.kt")
public void testClassObjectExtendsTrait() throws Exception {
doTestWithAccessors("compiler/testData/loadKotlin/classObject/ClassObjectExtendsTrait.kt");
@@ -417,6 +417,16 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/ClassObjectDeclaresVar.kt");
}
@TestMetadata("ClassObjectDefaultVisibility.kt")
public void testClassObjectDefaultVisibility() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/ClassObjectDefaultVisibility.kt");
}
@TestMetadata("ClassObjectExplicitVisibility.kt")
public void testClassObjectExplicitVisibility() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/ClassObjectExplicitVisibility.kt");
}
@TestMetadata("ClassObjectExtendsTrait.kt")
public void testClassObjectExtendsTrait() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/ClassObjectExtendsTrait.kt");