getObjectDescriptors() for lazy classes
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
+15
-6
@@ -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
|
||||
}
|
||||
+6
-3
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user