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()));
}
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;
@@ -22,6 +22,7 @@ public class ScopeBoundToReceiver implements JetScope {
private SetMultimap<String, VariableDescriptor> propertiesMap;
private SetMultimap<String, FunctionDescriptor> functionsMap;
private Map<String, ClassifierDescriptor> classMap;
private Map<DeclarationDescriptor, DeclarationDescriptor> descriptorsBoundToReceiver;
private Function<DeclarationDescriptor, DeclarationDescriptor> addBoundToReceiverFunction;
@@ -38,7 +39,7 @@ public class ScopeBoundToReceiver implements JetScope {
return receiver;
}
public Function<DeclarationDescriptor, DeclarationDescriptor> getAddBoundToReceiverFunction() {
private Function<DeclarationDescriptor, DeclarationDescriptor> getAddBoundToReceiverFunction() {
if (addBoundToReceiverFunction == null) {
addBoundToReceiverFunction = DescriptorUtils.getAddBoundToReceiverFunction(receiver);
}
@@ -59,6 +60,13 @@ public class ScopeBoundToReceiver implements JetScope {
return functionsMap;
}
private Map<String, ClassifierDescriptor> getClassMap() {
if (classMap == null) {
classMap = Maps.newHashMap();
}
return classMap;
}
private Map<DeclarationDescriptor, DeclarationDescriptor> 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 <D extends DeclarationDescriptor> Set<D> getMembersBoundToReceiver(String name, SetMultimap<String, D> cache, Set<D> 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);
}
@@ -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 <!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() {}
}