getObjectDescriptors() for lazy classes

This commit is contained in:
Nikolay Krasko
2012-08-08 17:36:04 +04:00
parent 79ffea63a6
commit fea73b3dce
5 changed files with 39 additions and 11 deletions
@@ -41,7 +41,8 @@ import javax.inject.Inject;
import java.util.*;
import static org.jetbrains.jet.lang.diagnostics.Errors.*;
import static org.jetbrains.jet.lang.resolve.BindingContext.*;
import static org.jetbrains.jet.lang.resolve.BindingContext.FQNAME_TO_CLASS_DESCRIPTOR;
import static org.jetbrains.jet.lang.resolve.BindingContext.TYPE;
/**
* @author abreslav
@@ -228,6 +229,7 @@ public class TypeHierarchyResolver {
@Override
public void visitObjectDeclaration(JetObjectDeclaration declaration) {
final MutableClassDescriptor objectDescriptor = createClassDescriptorForObject(declaration, owner, outerScope);
owner.addObjectDescriptor(objectDescriptor);
trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(declaration), objectDescriptor);
}
@@ -307,7 +309,6 @@ public class TypeHierarchyResolver {
prepareForDeferredCall(classScope, mutableClassDescriptor, declaration);
createPrimaryConstructorForObject(declaration, mutableClassDescriptor);
owner.addObjectDescriptor(mutableClassDescriptor);
trace.record(BindingContext.CLASS, declaration, mutableClassDescriptor);
return mutableClassDescriptor;
}
@@ -42,6 +42,8 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
protected boolean allDescriptorsComputed = false;
private final Map<Name, ClassDescriptor> classDescriptors = Maps.newHashMap();
private final Map<Name, ClassDescriptor> objectDescriptors = Maps.newHashMap();
private final Map<Name, Set<FunctionDescriptor>> functionDescriptors = Maps.newHashMap();
private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap();
@@ -58,8 +60,8 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
}
@Nullable
private ClassDescriptor getClassOrObjectDescriptor(@NotNull Name name, boolean object) {
ClassDescriptor known = classDescriptors.get(name);
private ClassDescriptor getClassOrObjectDescriptor(@NotNull Map<Name, ClassDescriptor> cache, @NotNull Name name, boolean object) {
ClassDescriptor known = cache.get(name);
if (known != null) return known;
if (allDescriptorsComputed) return null;
@@ -72,7 +74,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
ClassDescriptor classDescriptor = new LazyClassDescriptor(resolveSession, thisDescriptor, name,
JetClassInfoUtil.createClassLikeInfo(classOrObjectDeclaration));
classDescriptors.put(name, classDescriptor);
cache.put(name, classDescriptor);
if (!object) {
allDescriptors.add(classDescriptor);
}
@@ -82,13 +84,13 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@Override
public ClassifierDescriptor getClassifier(@NotNull Name name) {
return getClassOrObjectDescriptor(name, false);
return getClassOrObjectDescriptor(classDescriptors, name, false);
}
@Override
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
// TODO: We shouldn't really allow objects in classes...
return getClassOrObjectDescriptor(name, true);
return getClassOrObjectDescriptor(objectDescriptors, name, true);
}
@NotNull
@@ -170,7 +172,14 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@NotNull
@Override
public Collection<ClassDescriptor> getObjectDescriptors() {
throw new UnsupportedOperationException(); // TODO
for (JetDeclaration declaration : declarationProvider.getAllDeclarations()) {
if (declaration instanceof JetObjectDeclaration) {
JetObjectDeclaration objectDeclaration = (JetObjectDeclaration) declaration;
getObjectDescriptor(objectDeclaration.getNameAsName());
}
}
return objectDescriptors.values();
}
@Override
@@ -0,0 +1,9 @@
package test
class A {
object B {
fun foo(a: Int) : String {
return ""
}
}
}
@@ -0,0 +1,6 @@
namespace test
internal final class test.A : jet.Any {
public final /*constructor*/ fun <init>(): test.A
internal final val B: test.A.B
}
@@ -1269,9 +1269,7 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
@TestMetadata("compiler/testData/lazyResolve/namespaceComparator")
public static class NamespaceComparator extends AbstractLazyResolveNamespaceComparingTest {
public void testAllFilesPresentInNamespaceComparator() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(),
"org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest",
new File("compiler/testData/lazyResolve/namespaceComparator"), "kt", false);
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest", new File("compiler/testData/lazyResolve/namespaceComparator"), "kt", false);
}
@TestMetadata("enum.kt")
@@ -1294,6 +1292,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
doTestSinglePackage("compiler/testData/lazyResolve/namespaceComparator/innerObject.kt");
}
@TestMetadata("objectInClass.kt")
public void testObjectInClass() throws Exception {
doTestSinglePackage("compiler/testData/lazyResolve/namespaceComparator/objectInClass.kt");
}
@TestMetadata("objectMembers.kt")
public void testObjectMembers() throws Exception {
doTestSinglePackage("compiler/testData/lazyResolve/namespaceComparator/objectMembers.kt");