Delegation resolved refactored for reuse
BindingContext.DELEGATED key replaced with kind == DELEGATION
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user