From 1f4783efb31c2bde04e28f23cadaffcddad67763 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 19 Jul 2012 18:38:11 +0400 Subject: [PATCH] LR: Class objects are only allowed in a static context --- .../jet/lang/resolve/DescriptorUtils.java | 16 ++++++++++++ .../resolve/lazy/LazyClassDescriptor.java | 3 +++ .../diagnostics/InnerClassClassObject.txt | 26 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 compiler/testData/lazyResolve/diagnostics/InnerClassClassObject.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java index 69958b70473..e8e2469e739 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -333,4 +333,20 @@ public class DescriptorUtils { public static boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) { return !superClassDescriptor.equals(JetStandardClasses.getAny()); } + + public static boolean inStaticContext(@NotNull DeclarationDescriptor descriptor) { + DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + if (containingDeclaration instanceof NamespaceDescriptor) { + return true; + } + if (containingDeclaration instanceof ClassDescriptor) { + ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; + + if (classDescriptor.getKind() == ClassKind.OBJECT) { + return inStaticContext(classDescriptor.getContainingDeclaration()); + } + + } + return false; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java index d4444c29a28..81591737296 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java @@ -225,6 +225,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes @Nullable private JetClassLikeInfo getClassObjectInfo(JetClassObject classObject) { if (classObject != null) { + if (!DescriptorUtils.inStaticContext(this)) { + return null; + } JetObjectDeclaration objectDeclaration = classObject.getObjectDeclaration(); if (objectDeclaration != null) { return JetClassInfoUtil.createClassLikeInfo(objectDeclaration); diff --git a/compiler/testData/lazyResolve/diagnostics/InnerClassClassObject.txt b/compiler/testData/lazyResolve/diagnostics/InnerClassClassObject.txt new file mode 100644 index 00000000000..ef308954e57 --- /dev/null +++ b/compiler/testData/lazyResolve/diagnostics/InnerClassClassObject.txt @@ -0,0 +1,26 @@ +namespace + +internal final class A : jet.Any { + public final /*constructor*/ fun (): A + internal final class A.B : jet.Any { + public final /*constructor*/ fun (): A.B + } +} +internal final class B : jet.Any { + public final /*constructor*/ fun (): B + internal final class object B. : jet.Any { + internal final /*constructor*/ fun (): B. + internal final class B..B : jet.Any { + public final /*constructor*/ fun (): B..B + internal final class object B..B. : jet.Any { + internal final /*constructor*/ fun (): B..B. + internal final class B..B..C : jet.Any { + public final /*constructor*/ fun (): B..B..C + internal final class object B..B..C. : jet.Any { + internal final /*constructor*/ fun (): B..B..C. + } + } + } + } + } +}