From fa8ca4e78191651084386a0e40d7cdb40ea2a148 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 30 Sep 2013 15:13:18 +0400 Subject: [PATCH] Refactor: Improve code clarity in DelegationResolver Filter out non-overridable descriptors earlier for possible optimization Report error to trace even if name identifier is null --- .../jet/lang/resolve/DelegationResolver.java | 112 +++++++++--------- .../descriptors/LazyClassMemberScope.java | 10 +- 2 files changed, 65 insertions(+), 57 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java index 291cfe76aef..07b60aefae4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java @@ -47,13 +47,14 @@ public final class DelegationResolver { @NotNull final BindingTrace trace, @NotNull JetClassOrObject jetClassOrObject ) { - Callback eagerResolveCallback = new Callback() { + TypeResolver eagerTypeResolver = new TypeResolver() { @Nullable @Override - public JetType getTypeByTypeReference(@NotNull JetTypeReference reference) { + public JetType resolve(@NotNull JetTypeReference reference) { return trace.get(BindingContext.TYPE, reference); } - + }; + MemberExtractor eagerExtractor = new MemberExtractor() { @NotNull @Override public Collection getMembersByType(@NotNull JetType type) { @@ -64,7 +65,7 @@ public final class DelegationResolver { }; Set existingMembers = classDescriptor.getAllCallableMembers(); Collection delegatedMembers = - generateDelegatedMembers(jetClassOrObject, classDescriptor, existingMembers, trace, eagerResolveCallback); + generateDelegatedMembers(jetClassOrObject, classDescriptor, existingMembers, trace, eagerExtractor, eagerTypeResolver); for (CallableMemberDescriptor descriptor : delegatedMembers) { if (descriptor instanceof PropertyDescriptor) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; @@ -84,30 +85,35 @@ public final class DelegationResolver { @NotNull ClassDescriptor ownerDescriptor, @NotNull Collection existingMembers, @NotNull BindingTrace trace, - @NotNull Callback callback + @NotNull MemberExtractor memberExtractor, + @NotNull TypeResolver typeResolver ) { - return new DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, callback).generateDelegatedMembers(); + return new DelegationResolver(classOrObject, ownerDescriptor, existingMembers, trace, memberExtractor, typeResolver) + .generateDelegatedMembers(); } + @NotNull private final JetClassOrObject classOrObject; @NotNull private final ClassDescriptor ownerDescriptor; @NotNull private final Collection existingMembers; @NotNull private final BindingTrace trace; - - @NotNull private final Callback callback; + @NotNull private final MemberExtractor memberExtractor; + @NotNull private final TypeResolver typeResolver; private DelegationResolver( @NotNull JetClassOrObject classOrObject, @NotNull ClassDescriptor ownerDescriptor, @NotNull Collection existingMembers, @NotNull BindingTrace trace, - @NotNull Callback callback + @NotNull MemberExtractor extractor, + @NotNull TypeResolver resolver ) { this.classOrObject = classOrObject; this.ownerDescriptor = ownerDescriptor; this.existingMembers = existingMembers; this.trace = trace; - this.callback = callback; + this.memberExtractor = extractor; + this.typeResolver = resolver; } @NotNull @@ -122,18 +128,18 @@ public final class DelegationResolver { if (typeReference == null) { continue; } - JetType delegatedTraitType = callback.getTypeByTypeReference(typeReference); + JetType delegatedTraitType = typeResolver.resolve(typeReference); if (delegatedTraitType == null) { continue; } - Collection delegatesForTrait = generateDelegatesForOneTrait(delegatedMembers, delegatedTraitType); + Collection delegatesForTrait = generateDelegatesForTrait(delegatedMembers, delegatedTraitType); delegatedMembers.addAll(delegatesForTrait); } return delegatedMembers; } @NotNull - private Collection generateDelegatesForOneTrait( + private Collection generateDelegatesForTrait( @NotNull Collection existingDelegates, @NotNull JetType delegatedTraitType ) { @@ -153,21 +159,18 @@ public final class DelegationResolver { return result; } - private boolean checkClashWithOtherDelegatedMember( - @NotNull Collection delegatedMembers, - @NotNull T candidate - ) { - for (CallableMemberDescriptor alreadyDelegatedMember : delegatedMembers) { - if (haveSameSignatures(alreadyDelegatedMember, candidate)) { - //trying to delegate to many traits with the same methods - PsiElement nameIdentifier = classOrObject.getNameIdentifier(); - if (nameIdentifier != null) { - trace.report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, classOrObject, alreadyDelegatedMember)); - } - return true; - } + @NotNull + private Collection generateDelegationCandidates(@NotNull JetType delegatedTraitType) { + Collection descriptorsToDelegate = overridableMembersNotFromSuperClassOfTrait(delegatedTraitType); + Collection result = Lists.newArrayList(); + for (T memberDescriptor : descriptorsToDelegate) { + Modality modality = DescriptorUtils.convertModality(memberDescriptor.getModality(), true); + @SuppressWarnings("unchecked") + T copy = (T) memberDescriptor.copy(ownerDescriptor, modality, memberDescriptor.getVisibility(), + CallableMemberDescriptor.Kind.DELEGATION, false); + result.add(copy); } - return false; + return result; } private static boolean existingMemberOverridesDelegatedMember( @@ -182,32 +185,33 @@ public final class DelegationResolver { return false; } - @NotNull - private Collection generateDelegationCandidates(@NotNull JetType delegatedTraitType) { - Collection descriptorsToDelegate = filterMembersFromSuperClassOfDelegatedTrait(delegatedTraitType); - Collection result = Lists.newArrayList(); - for (T memberDescriptor : descriptorsToDelegate) { - if (memberDescriptor.getModality().isOverridable()) { - Modality modality = DescriptorUtils.convertModality(memberDescriptor.getModality(), true); - @SuppressWarnings("unchecked") - T copy = (T) memberDescriptor.copy(ownerDescriptor, modality, memberDescriptor.getVisibility(), - CallableMemberDescriptor.Kind.DELEGATION, false); - result.add(copy); + private boolean checkClashWithOtherDelegatedMember( + @NotNull Collection delegatedMembers, + @NotNull T candidate + ) { + for (CallableMemberDescriptor alreadyDelegatedMember : delegatedMembers) { + if (haveSameSignatures(alreadyDelegatedMember, candidate)) { + //trying to delegate to many traits with the same methods + PsiElement nameIdentifier = classOrObject.getNameIdentifier(); + PsiElement element = nameIdentifier != null ? nameIdentifier : classOrObject; + trace.report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(element, classOrObject, alreadyDelegatedMember)); + return true; } } - return result; + return false; } @NotNull - private Collection filterMembersFromSuperClassOfDelegatedTrait( - @NotNull JetType delegatedTraitType - ) { - final Collection membersToSkip = getMembersFromClassSupertypeOfTrait(delegatedTraitType); + private Collection overridableMembersNotFromSuperClassOfTrait(@NotNull JetType trait) { + final Collection membersToSkip = getMembersFromClassSupertypeOfTrait(trait); return Collections2.filter( - callback.getMembersByType(delegatedTraitType), + memberExtractor.getMembersByType(trait), new Predicate() { @Override - public boolean apply(@Nullable CallableMemberDescriptor descriptor) { + public boolean apply(CallableMemberDescriptor descriptor) { + if (!descriptor.getModality().isOverridable()) { + return false; + } for (CallableMemberDescriptor memberToSkip : membersToSkip) { if (haveSameSignatures(memberToSkip, descriptor)) { return false; @@ -224,18 +228,18 @@ public final class DelegationResolver { } @NotNull - private Collection getMembersFromClassSupertypeOfTrait(@NotNull JetType delegateTraitType) { + private Collection getMembersFromClassSupertypeOfTrait(@NotNull JetType traitType) { JetType classSupertype = null; - for (JetType supertype : TypeUtils.getAllSupertypes(delegateTraitType)) { + for (JetType supertype : TypeUtils.getAllSupertypes(traitType)) { if (isNotTrait(supertype.getConstructor().getDeclarationDescriptor())) { classSupertype = supertype; break; } } - return classSupertype != null ? callback.getMembersByType(classSupertype) : Collections.emptyList(); + return classSupertype != null ? memberExtractor.getMembersByType(classSupertype) : Collections.emptyList(); } - private static boolean isNotTrait(@NotNull DeclarationDescriptor descriptor) { + private static boolean isNotTrait(@Nullable DeclarationDescriptor descriptor) { if (descriptor instanceof ClassDescriptor) { ClassKind kind = ((ClassDescriptor) descriptor).getKind(); return kind != ClassKind.TRAIT; @@ -243,11 +247,13 @@ public final class DelegationResolver { return false; } - public interface Callback { - @Nullable - JetType getTypeByTypeReference(@NotNull JetTypeReference reference); - + public interface MemberExtractor { @NotNull Collection getMembersByType(@NotNull JetType type); } + + public interface TypeResolver { + @Nullable + JetType resolve(@NotNull JetTypeReference reference); + } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java index f91bc8ee060..79e04c20e54 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java @@ -266,17 +266,18 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope lazyResolveCallback = new DelegationResolver.Callback() { + DelegationResolver.TypeResolver lazyTypeResolver = new DelegationResolver.TypeResolver() { @Nullable @Override - public JetType getTypeByTypeReference(@NotNull JetTypeReference reference) { + public JetType resolve(@NotNull JetTypeReference reference) { return resolveSession.getInjector().getTypeResolver().resolveType( thisDescriptor.getScopeForClassHeaderResolution(), reference, resolveSession.getTrace(), false); } - + }; + DelegationResolver.MemberExtractor lazyMemberExtractor = new DelegationResolver.MemberExtractor() { @NotNull @Override public Collection getMembersByType(@NotNull JetType type) { @@ -285,7 +286,8 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope