diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java index d51a7eff87a..3eca5209219 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java @@ -100,7 +100,10 @@ public class ImportsResolver { namespaceScope.importScope(ScopeBoundToReceiver.create(descriptor, type.getMemberScope())); } else if (descriptor instanceof ClassDescriptor) { - namespaceScope.importScope(ScopeBoundToReceiver.create(descriptor, ((ClassDescriptor) descriptor).getDefaultType().getMemberScope())); + JetType classObjectType = ((ClassDescriptor) descriptor).getClassObjectType(); + if (classObjectType != null) { + namespaceScope.importScope(ScopeBoundToReceiver.create(descriptor, classObjectType.getMemberScope())); + } } } return; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ScopeBoundToReceiver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ScopeBoundToReceiver.java index 0c475073dc6..c6008d732a7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ScopeBoundToReceiver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ScopeBoundToReceiver.java @@ -22,6 +22,7 @@ public class ScopeBoundToReceiver implements JetScope { private SetMultimap propertiesMap; private SetMultimap functionsMap; + private Map classMap; private Map descriptorsBoundToReceiver; private Function addBoundToReceiverFunction; @@ -38,7 +39,7 @@ public class ScopeBoundToReceiver implements JetScope { return receiver; } - public Function getAddBoundToReceiverFunction() { + private Function getAddBoundToReceiverFunction() { if (addBoundToReceiverFunction == null) { addBoundToReceiverFunction = DescriptorUtils.getAddBoundToReceiverFunction(receiver); } @@ -59,6 +60,13 @@ public class ScopeBoundToReceiver implements JetScope { return functionsMap; } + private Map getClassMap() { + if (classMap == null) { + classMap = Maps.newHashMap(); + } + return classMap; + } + private Map getDescriptorsBoundToReceiver() { if (descriptorsBoundToReceiver == null) { descriptorsBoundToReceiver = Maps.newHashMap(); @@ -69,7 +77,12 @@ public class ScopeBoundToReceiver implements JetScope { @Nullable @Override public ClassifierDescriptor getClassifier(@NotNull String name) { - return getMemberBoundToReceiver(scope.getClassifier(name)); + if (getClassMap().containsKey(name)) { + return getClassMap().get(name); + } + ClassifierDescriptor result = getMemberBoundToReceiver(scope.getClassifier(name)); + getClassMap().put(name, result); + return result; } @Nullable @@ -95,7 +108,9 @@ public class ScopeBoundToReceiver implements JetScope { private Set getMembersBoundToReceiver(String name, SetMultimap cache, Set oldMembers) { for (D oldMember : oldMembers) { - cache.put(name, getMemberBoundToReceiver(oldMember)); + D memberBoundToReceiver = getMemberBoundToReceiver(oldMember); + cache.put(name, memberBoundToReceiver); + getDescriptorsBoundToReceiver().put(oldMember, memberBoundToReceiver); } return cache.get(name); } diff --git a/compiler/testData/diagnostics/tests/scopes/kt900.jet b/compiler/testData/diagnostics/tests/scopes/kt900.jet index ab9cd880977..e37074bb2b6 100644 --- a/compiler/testData/diagnostics/tests/scopes/kt900.jet +++ b/compiler/testData/diagnostics/tests/scopes/kt900.jet @@ -67,3 +67,29 @@ object N { fun bar() {} } } + +//FILE:c.kt +// import all members from class object +package c + +import A.* +import M.* + +fun foo() { + val b: B = B() + var r: R = R() +} + +class A() { + class object { + class B() { + class object { + } + } + } +} + +object M { + fun foo() {} + class R() {} +}