diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/QualifierReceiver.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/QualifierReceiver.kt index 91b12eb5264..a1c0d9e8746 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/QualifierReceiver.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/QualifierReceiver.kt @@ -61,7 +61,11 @@ public class QualifierReceiver( fun getNestedClassesAndPackageMembersScope(): JetScope { val scopes = ArrayList(3) - scopes.addIfNotNull(classifier?.getClassObjectType()?.getMemberScope()) + val classObjectDescriptor = (classifier as? ClassDescriptor)?.getClassObjectDescriptor() + if (classObjectDescriptor != null) { + // non-static members are resolved through class object receiver + scopes.add(DescriptorUtils.getStaticNestedClassesScope(classObjectDescriptor)) + } scopes.addIfNotNull(packageView?.getMemberScope()) diff --git a/compiler/testData/resolvedCalls/objectsAndClassObjects/classObject.kt b/compiler/testData/resolvedCalls/objectsAndClassObjects/classObject.kt new file mode 100644 index 00000000000..48b3002325d --- /dev/null +++ b/compiler/testData/resolvedCalls/objectsAndClassObjects/classObject.kt @@ -0,0 +1,11 @@ +class Foo { + class object { + val baz = Foo() + } +} + +fun test() { + Foo.baz +} + + diff --git a/compiler/testData/resolvedCalls/objectsAndClassObjects/classObject.txt b/compiler/testData/resolvedCalls/objectsAndClassObjects/classObject.txt new file mode 100644 index 00000000000..aff5500a574 --- /dev/null +++ b/compiler/testData/resolvedCalls/objectsAndClassObjects/classObject.txt @@ -0,0 +1,18 @@ +class Foo { + class object { + val baz = Foo() + } +} + +fun test() { + Foo.baz +} + + +Resolved call: + +Resulting descriptor: val baz: Foo + +Explicit receiver kind = THIS_OBJECT +This object = Foo {} +Receiver argument = NO_RECEIVER \ No newline at end of file diff --git a/compiler/testData/resolvedCalls/objectsAndClassObjects/kt5308IntRangeConstant.kt b/compiler/testData/resolvedCalls/objectsAndClassObjects/kt5308IntRangeConstant.kt new file mode 100644 index 00000000000..bc23c8bff58 --- /dev/null +++ b/compiler/testData/resolvedCalls/objectsAndClassObjects/kt5308IntRangeConstant.kt @@ -0,0 +1,4 @@ +//KT-5308 Wrong ExplicitReceiverKind when access to IntRange.EMPTY +fun test() { + IntRange.EMPTY +} \ No newline at end of file diff --git a/compiler/testData/resolvedCalls/objectsAndClassObjects/kt5308IntRangeConstant.txt b/compiler/testData/resolvedCalls/objectsAndClassObjects/kt5308IntRangeConstant.txt new file mode 100644 index 00000000000..836c2f90207 --- /dev/null +++ b/compiler/testData/resolvedCalls/objectsAndClassObjects/kt5308IntRangeConstant.txt @@ -0,0 +1,13 @@ +//KT-5308 Wrong ExplicitReceiverKind when access to IntRange.EMPTY +fun test() { + IntRange.EMPTY +} + + +Resolved call: + +Resulting descriptor: val EMPTY: IntRange + +Explicit receiver kind = THIS_OBJECT +This object = IntRange {} +Receiver argument = NO_RECEIVER \ No newline at end of file diff --git a/compiler/testData/resolvedCalls/objectsAndClassObjects/object.kt b/compiler/testData/resolvedCalls/objectsAndClassObjects/object.kt new file mode 100644 index 00000000000..fbae155c49c --- /dev/null +++ b/compiler/testData/resolvedCalls/objectsAndClassObjects/object.kt @@ -0,0 +1,9 @@ +object Foo { + val baz = 42 +} + +fun test() { + Foo.baz +} + + diff --git a/compiler/testData/resolvedCalls/objectsAndClassObjects/object.txt b/compiler/testData/resolvedCalls/objectsAndClassObjects/object.txt new file mode 100644 index 00000000000..453e3443393 --- /dev/null +++ b/compiler/testData/resolvedCalls/objectsAndClassObjects/object.txt @@ -0,0 +1,16 @@ +object Foo { + val baz = 42 +} + +fun test() { + Foo.baz +} + + +Resolved call: + +Resulting descriptor: val baz: Int + +Explicit receiver kind = THIS_OBJECT +This object = Foo {Foo} +Receiver argument = NO_RECEIVER \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/resolve/calls/ResolvedCallsTestGenerated.java b/compiler/tests/org/jetbrains/jet/resolve/calls/ResolvedCallsTestGenerated.java index 8dde061ea55..27f47647607 100644 --- a/compiler/tests/org/jetbrains/jet/resolve/calls/ResolvedCallsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/resolve/calls/ResolvedCallsTestGenerated.java @@ -28,7 +28,7 @@ import java.util.regex.Pattern; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("compiler/testData/resolvedCalls") -@InnerTestClasses({ResolvedCallsTestGenerated.Arguments.class, ResolvedCallsTestGenerated.DifferentCallElements.class, ResolvedCallsTestGenerated.FunctionTypes.class, ResolvedCallsTestGenerated.Invoke.class, ResolvedCallsTestGenerated.RealExamples.class, ResolvedCallsTestGenerated.Resolve.class, ResolvedCallsTestGenerated.ThisOrSuper.class}) +@InnerTestClasses({ResolvedCallsTestGenerated.Arguments.class, ResolvedCallsTestGenerated.DifferentCallElements.class, ResolvedCallsTestGenerated.FunctionTypes.class, ResolvedCallsTestGenerated.Invoke.class, ResolvedCallsTestGenerated.ObjectsAndClassObjects.class, ResolvedCallsTestGenerated.RealExamples.class, ResolvedCallsTestGenerated.Resolve.class, ResolvedCallsTestGenerated.ThisOrSuper.class}) public class ResolvedCallsTestGenerated extends AbstractResolvedCallsTest { public void testAllFilesPresentInResolvedCalls() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/resolvedCalls"), Pattern.compile("^(.+)\\.kt$"), true); @@ -356,6 +356,29 @@ public class ResolvedCallsTestGenerated extends AbstractResolvedCallsTest { } + @TestMetadata("compiler/testData/resolvedCalls/objectsAndClassObjects") + public static class ObjectsAndClassObjects extends AbstractResolvedCallsTest { + public void testAllFilesPresentInObjectsAndClassObjects() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/resolvedCalls/objectsAndClassObjects"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("classObject.kt") + public void testClassObject() throws Exception { + doTest("compiler/testData/resolvedCalls/objectsAndClassObjects/classObject.kt"); + } + + @TestMetadata("kt5308IntRangeConstant.kt") + public void testKt5308IntRangeConstant() throws Exception { + doTest("compiler/testData/resolvedCalls/objectsAndClassObjects/kt5308IntRangeConstant.kt"); + } + + @TestMetadata("object.kt") + public void testObject() throws Exception { + doTest("compiler/testData/resolvedCalls/objectsAndClassObjects/object.kt"); + } + + } + @TestMetadata("compiler/testData/resolvedCalls/realExamples") public static class RealExamples extends AbstractResolvedCallsTest { public void testAllFilesPresentInRealExamples() throws Exception { @@ -427,6 +450,7 @@ public class ResolvedCallsTestGenerated extends AbstractResolvedCallsTest { suite.addTestSuite(DifferentCallElements.class); suite.addTestSuite(FunctionTypes.class); suite.addTestSuite(Invoke.class); + suite.addTestSuite(ObjectsAndClassObjects.class); suite.addTestSuite(RealExamples.class); suite.addTestSuite(Resolve.class); suite.addTestSuite(ThisOrSuper.class);