diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java index 65eb3d4c992..425f2c50596 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java @@ -55,9 +55,7 @@ class JavaDescriptorResolverHelper { processFields(); processMethods(); } - if (psiPackage != null) { - processNeighborClasses(); - } + processObjectClasses(); } private NamedMembers getNamedMembers(Name name) { @@ -210,17 +208,18 @@ class JavaDescriptorResolverHelper { } } - private void processNeighborClasses() { - for (PsiClass neighborPsiClass : psiPackage.getClasses()) { - if (!neighborPsiClass.isPhysical()) { // to filter out JetLightClasses + private void processObjectClasses() { + PsiClass[] classes = psiPackage != null ? psiPackage.getClasses() : psiClass.getPsiClass().getInnerClasses(); + for (PsiClass psiClass : classes) { + if (!psiClass.isPhysical()) { // to filter out JetLightClasses continue; } - if (JetClassAnnotation.get(neighborPsiClass).kind() != JvmStdlibNames.FLAG_CLASS_KIND_OBJECT) { + if (JetClassAnnotation.get(psiClass).kind() != JvmStdlibNames.FLAG_CLASS_KIND_OBJECT) { continue; } - PsiField instanceField = neighborPsiClass.findFieldByName(JvmAbi.INSTANCE_FIELD, false); + PsiField instanceField = psiClass.findFieldByName(JvmAbi.INSTANCE_FIELD, false); if (instanceField != null) { - NamedMembers namedMembers = getNamedMembers(Name.identifier(neighborPsiClass.getName())); + NamedMembers namedMembers = getNamedMembers(Name.identifier(psiClass.getName())); TypeSource type = new TypeSource("", instanceField.getType(), instanceField); namedMembers.addPropertyAccessor(new PropertyAccessorData(new PsiFieldWrapper(instanceField), type, null)); 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 5da0a811f2a..19499cb78b7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.resolve; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.DescriptorSubstitutor; import org.jetbrains.jet.lang.types.JetType; @@ -366,11 +368,15 @@ public class DescriptorUtils { @SuppressWarnings("unchecked") public static Collection getInnerClasses(ClassDescriptor classDescriptor) { - Collection innerClasses = classDescriptor.getUnsubstitutedInnerClassesScope().getAllDescriptors(); - for (DeclarationDescriptor inner : innerClasses) { + JetScope innerClassesScope = classDescriptor.getUnsubstitutedInnerClassesScope(); + Collection inners = innerClassesScope.getAllDescriptors(); + for (DeclarationDescriptor inner : inners) { assert inner instanceof ClassDescriptor : "Not a class in inner classes scope of " + classDescriptor + ": " + inner; } - return (Collection) innerClasses; + return new ImmutableList.Builder() + .addAll((Collection) inners) + .addAll(innerClassesScope.getObjectDescriptors()) + .build(); } } diff --git a/compiler/testData/loadKotlin/class/NamedObjectInNamedObject.kt b/compiler/testData/loadKotlin/class/NamedObjectInNamedObject.kt new file mode 100644 index 00000000000..9ef2e937aeb --- /dev/null +++ b/compiler/testData/loadKotlin/class/NamedObjectInNamedObject.kt @@ -0,0 +1,8 @@ +package test + +public object Outer { + public object Obj { + public val v: String = "val" + public fun f(): String = "fun" + } +} diff --git a/compiler/testData/loadKotlin/class/NamedObjectInNamedObject.txt b/compiler/testData/loadKotlin/class/NamedObjectInNamedObject.txt new file mode 100644 index 00000000000..e8f44ff8507 --- /dev/null +++ b/compiler/testData/loadKotlin/class/NamedObjectInNamedObject.txt @@ -0,0 +1,12 @@ +namespace test + +public final object test.Outer : jet.Any { + private final /*constructor*/ fun (): test.Outer + public final val Obj: test.Outer.Obj + public final object test.Outer.Obj : jet.Any { + private final /*constructor*/ fun (): test.Outer.Obj + public final fun f(): jet.String + public final val v: jet.String + } +} +public final val Outer: test.Outer diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java index 332429d0003..0d75f506bf3 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java @@ -140,6 +140,11 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT doTest("compiler/testData/loadKotlin/class/NamedObject.kt"); } + @TestMetadata("NamedObjectInNamedObject.kt") + public void testNamedObjectInNamedObject() throws Exception { + doTest("compiler/testData/loadKotlin/class/NamedObjectInNamedObject.kt"); + } + @TestMetadata("NamedObjectWithAnotherTopLevelProperty.kt") public void testNamedObjectWithAnotherTopLevelProperty() throws Exception { doTest("compiler/testData/loadKotlin/class/NamedObjectWithAnotherTopLevelProperty.kt");