From abec6933cf5740da8d616c18c2b0083067c0e719 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 10 Nov 2011 12:59:29 +0400 Subject: [PATCH] KT-499 allow class object in static inner classes like this: === class A { class object { class B { class object { } } } } === --- .../lang/descriptors/MutableClassDescriptor.java | 13 ++++++++++++- .../quick/InnerClassClassObject.jet | 13 +++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 3e500172016..0a32795967a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -61,7 +61,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme @Override public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { if (this.classObjectDescriptor != null) return ClassObjectStatus.DUPLICATE; - if (!(this.getContainingDeclaration() instanceof NamespaceDescriptor)) { + if (!isStatic(this.getContainingDeclaration())) { return ClassObjectStatus.NOT_ALLOWED; } assert classObjectDescriptor.getKind() == ClassKind.OBJECT; @@ -69,6 +69,17 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme return ClassObjectStatus.OK; } + private static boolean isStatic(DeclarationDescriptor declarationDescriptor) { + if (declarationDescriptor instanceof NamespaceDescriptor) { + return true; + } else if (declarationDescriptor instanceof ClassDescriptor) { + ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor; + return classDescriptor.getKind() == ClassKind.OBJECT || classDescriptor.getKind() == ClassKind.ENUM_CLASS; + } else { + return false; + } + } + @Nullable public MutableClassDescriptor getClassObjectDescriptor() { return classObjectDescriptor; diff --git a/compiler/testData/checkerWithErrorTypes/quick/InnerClassClassObject.jet b/compiler/testData/checkerWithErrorTypes/quick/InnerClassClassObject.jet index 0d8f5da30f2..39ff4413733 100644 --- a/compiler/testData/checkerWithErrorTypes/quick/InnerClassClassObject.jet +++ b/compiler/testData/checkerWithErrorTypes/quick/InnerClassClassObject.jet @@ -5,3 +5,16 @@ class A { class object { } } } + +class B { + class object { + class B { + class object { + class C { + class object { } + } + } + } + } +} +