From ea7e7f01fb56a9b5bb47713893cbc9ef51da01b9 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 23 Jul 2012 13:43:35 +0400 Subject: [PATCH] Qualified "this" supported by lazy resolve: - Appropriate scope methods implemented - Class declarations recorded in the binding trace --- .../resolve/lazy/AbstractLazyMemberScope.java | 3 +- .../resolve/lazy/LazyClassDescriptor.java | 4 +++ .../lazyResolve/diagnostics/QualifiedThis.txt | 30 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/lazyResolve/diagnostics/QualifiedThis.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java index f07d59febe3..ff6294d9f67 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java @@ -187,7 +187,8 @@ public abstract class AbstractLazyMemberScope getDeclarationsByLabel(@NotNull LabelName labelName) { - throw new UnsupportedOperationException(); // TODO + // A member scope has no labels + return Collections.emptySet(); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java index 81591737296..5cb5e2fd6dc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.AnnotationResolver; +import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.lazy.data.FilteringClassLikeInfo; @@ -85,6 +86,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes @NotNull JetClassLikeInfo classLikeInfo ) { this.resolveSession = resolveSession; + this.resolveSession.getTrace().record(BindingContext.CLASS, classLikeInfo.getCorrespondingClassOrObject(), this); + this.originalClassInfo = classLikeInfo; JetClassLikeInfo classLikeInfoForMembers = classLikeInfo.getClassKind() != ClassKind.ENUM_CLASS ? classLikeInfo : noEnumEntries(classLikeInfo); @@ -138,6 +141,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes if (scopeForMemberDeclarationResolution == null) { WritableScopeImpl scope = new WritableScopeImpl( getScopeForMemberLookup(), this, RedeclarationHandler.DO_NOTHING, "Member Declaration Resolution"); + scope.addLabeledDeclaration(this); scope.importScope(getScopeForClassHeaderResolution()); scope.changeLockLevel(WritableScope.LockLevel.READING); diff --git a/compiler/testData/lazyResolve/diagnostics/QualifiedThis.txt b/compiler/testData/lazyResolve/diagnostics/QualifiedThis.txt new file mode 100644 index 00000000000..3137f2fff19 --- /dev/null +++ b/compiler/testData/lazyResolve/diagnostics/QualifiedThis.txt @@ -0,0 +1,30 @@ +namespace + +// +namespace closures + +internal final class closures.A : jet.Any { + public final /*constructor*/ fun (/*0*/ a: jet.Int): closures.A + internal final val a: jet.Int + internal final class closures.A.B : jet.Any { + public final /*constructor*/ fun (): closures.A.B + internal final fun jet.Char.xx(): jet.Any + internal final val jet.Int.xx: jet.Int + internal final val x: closures.A.B + internal final val y: closures.A + internal final val z: closures.A.B + } +} +// +internal final class A : jet.Any { + public final /*constructor*/ fun (): A + internal final fun foo(): jet.Tuple0 + internal final val x: jet.Tuple0 + internal final val y: jet.Tuple0 + internal final val z: jet.Tuple0 +} +internal final class Dup : jet.Any { + public final /*constructor*/ fun (): Dup + internal final fun Dup(): jet.Tuple0 +} +internal final fun foo1(): jet.Tuple0