Import all members from class object

This commit is contained in:
svtk
2012-01-10 22:20:02 +04:00
parent 2e0b1863cd
commit a22b78d60d
3 changed files with 48 additions and 4 deletions
@@ -100,7 +100,10 @@ public class ImportsResolver {
namespaceScope.importScope(ScopeBoundToReceiver.create(descriptor, type.getMemberScope())); namespaceScope.importScope(ScopeBoundToReceiver.create(descriptor, type.getMemberScope()));
} }
else if (descriptor instanceof ClassDescriptor) { 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; return;
@@ -22,6 +22,7 @@ public class ScopeBoundToReceiver implements JetScope {
private SetMultimap<String, VariableDescriptor> propertiesMap; private SetMultimap<String, VariableDescriptor> propertiesMap;
private SetMultimap<String, FunctionDescriptor> functionsMap; private SetMultimap<String, FunctionDescriptor> functionsMap;
private Map<String, ClassifierDescriptor> classMap;
private Map<DeclarationDescriptor, DeclarationDescriptor> descriptorsBoundToReceiver; private Map<DeclarationDescriptor, DeclarationDescriptor> descriptorsBoundToReceiver;
private Function<DeclarationDescriptor, DeclarationDescriptor> addBoundToReceiverFunction; private Function<DeclarationDescriptor, DeclarationDescriptor> addBoundToReceiverFunction;
@@ -38,7 +39,7 @@ public class ScopeBoundToReceiver implements JetScope {
return receiver; return receiver;
} }
public Function<DeclarationDescriptor, DeclarationDescriptor> getAddBoundToReceiverFunction() { private Function<DeclarationDescriptor, DeclarationDescriptor> getAddBoundToReceiverFunction() {
if (addBoundToReceiverFunction == null) { if (addBoundToReceiverFunction == null) {
addBoundToReceiverFunction = DescriptorUtils.getAddBoundToReceiverFunction(receiver); addBoundToReceiverFunction = DescriptorUtils.getAddBoundToReceiverFunction(receiver);
} }
@@ -59,6 +60,13 @@ public class ScopeBoundToReceiver implements JetScope {
return functionsMap; return functionsMap;
} }
private Map<String, ClassifierDescriptor> getClassMap() {
if (classMap == null) {
classMap = Maps.newHashMap();
}
return classMap;
}
private Map<DeclarationDescriptor, DeclarationDescriptor> getDescriptorsBoundToReceiver() { private Map<DeclarationDescriptor, DeclarationDescriptor> getDescriptorsBoundToReceiver() {
if (descriptorsBoundToReceiver == null) { if (descriptorsBoundToReceiver == null) {
descriptorsBoundToReceiver = Maps.newHashMap(); descriptorsBoundToReceiver = Maps.newHashMap();
@@ -69,7 +77,12 @@ public class ScopeBoundToReceiver implements JetScope {
@Nullable @Nullable
@Override @Override
public ClassifierDescriptor getClassifier(@NotNull String name) { 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 @Nullable
@@ -95,7 +108,9 @@ public class ScopeBoundToReceiver implements JetScope {
private <D extends DeclarationDescriptor> Set<D> getMembersBoundToReceiver(String name, SetMultimap<String, D> cache, Set<D> oldMembers) { private <D extends DeclarationDescriptor> Set<D> getMembersBoundToReceiver(String name, SetMultimap<String, D> cache, Set<D> oldMembers) {
for (D oldMember : 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); return cache.get(name);
} }
@@ -67,3 +67,29 @@ object N {
fun bar() {} fun bar() {}
} }
} }
//FILE:c.kt
// import all members from class object
package c
import A.*
import M.*
fun foo() {
val <!UNUSED_VARIABLE!>b<!>: B = B()
var <!UNUSED_VARIABLE!>r<!>: R = R()
}
class A() {
class object {
class B() {
class object {
}
}
}
}
object M {
fun foo() {}
class R() {}
}