Delegation resolved refactored for reuse

BindingContext.DELEGATED key replaced with kind == DELEGATION
This commit is contained in:
Andrey Breslav
2012-07-19 16:46:24 +04:00
parent 75b149f184
commit 67900e9dfa
4 changed files with 33 additions and 29 deletions
@@ -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<JetExpression, Boolean> PROCESSED = Slices.createSimpleSetSlice();
WritableSlice<JetElement, Boolean> STATEMENT = Slices.createRemovableSetSlice();
WritableSlice<CallableMemberDescriptor, Boolean> DELEGATED = Slices.createRemovableSetSlice();
WritableSlice<VariableDescriptor, Boolean> CAPTURED_IN_CLOSURE = Slices.createSimpleSetSlice();
@@ -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<CallableMemberDescriptor> callableDescriptors = (Collection) Collections2.filter(
type.getMemberScope().getAllDescriptors(),
Predicates.instanceOf(CallableMemberDescriptor.class));
Collection<CallableMemberDescriptor> 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 <T extends CallableMemberDescriptor> Collection<T> generateDelegatedMembers(DeclarationDescriptor newOwner, Collection<T> delegatedDescriptors) {
Collection<CallableMemberDescriptor> 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;
}
}
@@ -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;
}
@@ -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;
}