diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 7662f478552..09daa6f4f83 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -16,9 +16,7 @@ package org.jetbrains.jet.lang.resolve; -import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; -import com.intellij.util.PlusMinus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -104,7 +102,6 @@ public interface BindingContext { /** Has type of current expression has been already resolved */ WritableSlice PROCESSED = Slices.createSimpleSetSlice(); WritableSlice STATEMENT = Slices.createRemovableSetSlice(); - WritableSlice DELEGATED = Slices.createRemovableSetSlice(); WritableSlice CAPTURED_IN_CLOSURE = Slices.createSimpleSetSlice(); 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 8d4004e7a20..31fcbf2f4d2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java @@ -16,16 +16,18 @@ package org.jetbrains.jet.lang.resolve; +import com.google.common.base.Predicates; +import com.google.common.collect.Collections2; +import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.types.JetType; import javax.inject.Inject; +import java.util.Collection; import java.util.Map; -import static org.jetbrains.jet.lang.resolve.BindingContext.DELEGATED; - /** * @author abreslav */ @@ -67,24 +69,19 @@ public class DelegationResolver { JetDelegatorByExpressionSpecifier specifier = (JetDelegatorByExpressionSpecifier) delegationSpecifier; JetType type = trace.get(BindingContext.TYPE, specifier.getTypeReference()); if (type != null) { - for (DeclarationDescriptor declarationDescriptor : type.getMemberScope().getAllDescriptors()) { - if (declarationDescriptor instanceof PropertyDescriptor) { - PropertyDescriptor propertyDescriptor = (PropertyDescriptor) declarationDescriptor; - if (propertyDescriptor.getModality().isOverridable()) { - Modality modality = DescriptorUtils.convertModality(propertyDescriptor.getModality(), true); - PropertyDescriptor copy = propertyDescriptor.copy(classDescriptor, modality, false, CallableMemberDescriptor.Kind.DELEGATION, true); - classDescriptor.getBuilder().addPropertyDescriptor(copy); - trace.record(DELEGATED, copy); - } + @SuppressWarnings("unchecked") + Collection callableDescriptors = (Collection) Collections2.filter( + type.getMemberScope().getAllDescriptors(), + Predicates.instanceOf(CallableMemberDescriptor.class)); + Collection descriptors = generateDelegatedMembers(classDescriptor, callableDescriptors); + for (CallableMemberDescriptor descriptor : descriptors) { + if (descriptor instanceof PropertyDescriptor) { + PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; + classDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor); } - else if (declarationDescriptor instanceof SimpleFunctionDescriptor) { - SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) declarationDescriptor; - if (functionDescriptor.getModality().isOverridable()) { - Modality modality = DescriptorUtils.convertModality(functionDescriptor.getModality(), true); - SimpleFunctionDescriptor copy = functionDescriptor.copy(classDescriptor, modality, false, CallableMemberDescriptor.Kind.DELEGATION, true); - classDescriptor.getBuilder().addFunctionDescriptor(copy); - trace.record(DELEGATED, copy); - } + else if (descriptor instanceof SimpleFunctionDescriptor) { + SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) descriptor; + classDescriptor.getBuilder().addFunctionDescriptor(functionDescriptor); } } } @@ -92,4 +89,17 @@ public class DelegationResolver { } } + public static Collection generateDelegatedMembers(DeclarationDescriptor newOwner, Collection delegatedDescriptors) { + Collection result = Lists.newArrayList(); + for (CallableMemberDescriptor memberDescriptor : delegatedDescriptors) { + if (memberDescriptor.getModality().isOverridable()) { + Modality modality = DescriptorUtils.convertModality(memberDescriptor.getModality(), true); + CallableMemberDescriptor copy = + memberDescriptor.copy(newOwner, modality, false, CallableMemberDescriptor.Kind.DELEGATION, true); + result.add(copy); + } + } + //noinspection unchecked + return (Collection) result; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index 62013b7a696..42a35e348ec 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -31,8 +31,6 @@ import javax.inject.Inject; import java.util.Collection; import java.util.Map; -import static org.jetbrains.jet.lang.resolve.BindingContext.DELEGATED; - /** * @author Stepan Koltsov */ @@ -196,7 +194,7 @@ public class OverloadResolver { if (!overloadable.isSuccess()) { JetDeclaration jetDeclaration = (JetDeclaration) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), member); if (jetDeclaration == null) { - assert trace.get(DELEGATED, member); + assert member.getKind() == CallableMemberDescriptor.Kind.DELEGATION; return; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index f07d4c85eb8..611a4c44687 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -39,7 +39,6 @@ import javax.inject.Inject; import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; -import static org.jetbrains.jet.lang.resolve.BindingContext.DELEGATED; import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE; /** @@ -392,11 +391,11 @@ public class OverrideResolver { private void checkOverrideForMember(@NotNull CallableMemberDescriptor declared) { JetNamedDeclaration member = (JetNamedDeclaration) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), declared); if (member == null) { - Boolean delegated = trace.get(DELEGATED, declared); - if (delegated == null || !delegated) + if (declared.getKind() != CallableMemberDescriptor.Kind.DELEGATION) throw new IllegalStateException( "decriptor is not resolved to declaration" + - " and it is not delegate: " + declared + ", DELEGATED: " + delegated); + " and it is not delegate: " + declared + ", DELEGATED: " + + (declared.getKind() == CallableMemberDescriptor.Kind.DELEGATION)); return; }