KT-315 I need list of FunctionDEscriptors to be taken from traits
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package org.jetbrains.jet.lang.descriptors;
|
package org.jetbrains.jet.lang.descriptors;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
@@ -11,6 +12,7 @@ import org.jetbrains.jet.lang.types.TypeSubstitutor;
|
|||||||
import org.jetbrains.jet.lang.types.Variance;
|
import org.jetbrains.jet.lang.types.Variance;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -20,6 +22,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member
|
|||||||
private final Modality modality;
|
private final Modality modality;
|
||||||
private final boolean isVar;
|
private final boolean isVar;
|
||||||
private final ReceiverDescriptor receiver;
|
private final ReceiverDescriptor receiver;
|
||||||
|
private final Set<PropertyDescriptor> overriddenProperties = Sets.newLinkedHashSet();
|
||||||
private final List<TypeParameterDescriptor> typeParemeters = Lists.newArrayListWithCapacity(0);
|
private final List<TypeParameterDescriptor> typeParemeters = Lists.newArrayListWithCapacity(0);
|
||||||
private final PropertyDescriptor original;
|
private final PropertyDescriptor original;
|
||||||
private PropertyGetterDescriptor getter;
|
private PropertyGetterDescriptor getter;
|
||||||
@@ -145,4 +148,14 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member
|
|||||||
public PropertyDescriptor getOriginal() {
|
public PropertyDescriptor getOriginal() {
|
||||||
return original;
|
return original;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addOverriddenDescriptor(PropertyDescriptor overridden) {
|
||||||
|
overriddenProperties.add(overridden);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Set<? extends CallableDescriptor> getOverriddenDescriptors() {
|
||||||
|
return overriddenProperties;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void bindOverridesInAClass(MutableClassDescriptor classDescriptor) {
|
private void bindOverridesInAClass(MutableClassDescriptor classDescriptor) {
|
||||||
|
|
||||||
for (FunctionDescriptor declaredFunction : classDescriptor.getFunctions()) {
|
for (FunctionDescriptor declaredFunction : classDescriptor.getFunctions()) {
|
||||||
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
||||||
FunctionDescriptor overridden = findFunctionOverridableBy(declaredFunction, supertype);
|
FunctionDescriptor overridden = findFunctionOverridableBy(declaredFunction, supertype);
|
||||||
@@ -103,6 +102,15 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (PropertyDescriptor propertyDescriptor : classDescriptor.getProperties()) {
|
||||||
|
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
||||||
|
PropertyDescriptor overridden = findPropertyOverridableBy(propertyDescriptor, supertype);
|
||||||
|
if (overridden != null) {
|
||||||
|
propertyDescriptor.addOverriddenDescriptor(overridden);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -116,6 +124,32 @@ public class BodyResolver {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private PropertyDescriptor findPropertyOverridableBy(@NotNull PropertyDescriptor declaredProperty, @NotNull JetType supertype) {
|
||||||
|
PropertyDescriptor property = (PropertyDescriptor) supertype.getMemberScope().getVariable(declaredProperty.getName());
|
||||||
|
if (property == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (isOverridableBy(property, declaredProperty)) {
|
||||||
|
return property;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isOverridableBy(@NotNull PropertyDescriptor property, @NotNull PropertyDescriptor overrideCandidate) {
|
||||||
|
boolean var = property.isVar();
|
||||||
|
if (var && !overrideCandidate.isVar()) return false;
|
||||||
|
JetType propertyType = property.getReturnType();
|
||||||
|
JetType overrideType = overrideCandidate.getReturnType();
|
||||||
|
JetTypeChecker typeChecker = context.getSemanticServices().getTypeChecker();
|
||||||
|
if (var) {
|
||||||
|
return typeChecker.equalTypes(propertyType, overrideType);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return typeChecker.isSubtypeOf(overrideType, propertyType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void checkOverrides() {
|
private void checkOverrides() {
|
||||||
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
|
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
|
||||||
checkOverridesInAClass(entry.getValue(), entry.getKey());
|
checkOverridesInAClass(entry.getValue(), entry.getKey());
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class OverridingUtil {
|
||||||
|
|
||||||
|
public static Set<CallableDescriptor> getEffectiveMembers(@NotNull ClassDescriptor classDescriptor) {
|
||||||
|
Collection<DeclarationDescriptor> allDescriptors = classDescriptor.getDefaultType().getMemberScope().getAllDescriptors();
|
||||||
|
Set<CallableDescriptor> allMembers = Sets.newLinkedHashSet();
|
||||||
|
for (DeclarationDescriptor descriptor : allDescriptors) {
|
||||||
|
assert !(descriptor instanceof ConstructorDescriptor);
|
||||||
|
if (descriptor instanceof CallableDescriptor) {
|
||||||
|
CallableDescriptor callableDescriptor = (CallableDescriptor) descriptor;
|
||||||
|
allMembers.add(callableDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filterOverrides(allMembers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <D extends CallableDescriptor> Set<D> filterOverrides(Set<D> candidateSet) {
|
||||||
|
Set<D> candidates = Sets.newLinkedHashSet(candidateSet);
|
||||||
|
for (D descriptor : candidateSet) {
|
||||||
|
candidates.removeAll(descriptor.getOverriddenDescriptors());
|
||||||
|
}
|
||||||
|
return candidates;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <Descriptor extends CallableDescriptor> boolean overrides(@NotNull Descriptor f, @NotNull Descriptor g) {
|
||||||
|
Set<CallableDescriptor> overriddenDescriptors = Sets.newHashSet();
|
||||||
|
getAllOverriddenDescriptors(f.getOriginal(), overriddenDescriptors);
|
||||||
|
CallableDescriptor originalG = g.getOriginal();
|
||||||
|
for (CallableDescriptor overriddenFunction : overriddenDescriptors) {
|
||||||
|
if (originalG.equals(overriddenFunction.getOriginal())) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void getAllOverriddenDescriptors(@NotNull CallableDescriptor current, @NotNull Set<CallableDescriptor> overriddenDescriptors) {
|
||||||
|
if (overriddenDescriptors.contains(current)) return;
|
||||||
|
for (CallableDescriptor descriptor : current.getOriginal().getOverriddenDescriptors()) {
|
||||||
|
getAllOverriddenDescriptors(descriptor, overriddenDescriptors);
|
||||||
|
overriddenDescriptors.add(descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -524,7 +524,7 @@ public class CallResolver {
|
|||||||
return OverloadResolutionResult.success(maximallySpecificGenericsDiscriminated);
|
return OverloadResolutionResult.success(maximallySpecificGenericsDiscriminated);
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<D> noOverrides = filterOverrides(successfulCandidates.keySet());
|
Set<D> noOverrides = OverridingUtil.filterOverrides(successfulCandidates.keySet());
|
||||||
if (dirtyCandidates.isEmpty()) {
|
if (dirtyCandidates.isEmpty()) {
|
||||||
// tracing.reportOverallResolutionError(trace, "Overload resolution ambiguity: "
|
// tracing.reportOverallResolutionError(trace, "Overload resolution ambiguity: "
|
||||||
// + makeErrorMessageForMultipleDescriptors(noOverrides));
|
// + makeErrorMessageForMultipleDescriptors(noOverrides));
|
||||||
@@ -547,7 +547,7 @@ public class CallResolver {
|
|||||||
}
|
}
|
||||||
else if (!failedCandidates.isEmpty()) {
|
else if (!failedCandidates.isEmpty()) {
|
||||||
if (failedCandidates.size() != 1) {
|
if (failedCandidates.size() != 1) {
|
||||||
Set<D> noOverrides = filterOverrides(failedCandidates);
|
Set<D> noOverrides = OverridingUtil.filterOverrides(failedCandidates);
|
||||||
if (noOverrides.size() != 1) {
|
if (noOverrides.size() != 1) {
|
||||||
// tracing.reportOverallResolutionError(trace, "None of the following functions can be called with the arguments supplied: "
|
// tracing.reportOverallResolutionError(trace, "None of the following functions can be called with the arguments supplied: "
|
||||||
// + makeErrorMessageForMultipleDescriptors(noOverrides));
|
// + makeErrorMessageForMultipleDescriptors(noOverrides));
|
||||||
@@ -568,20 +568,6 @@ public class CallResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private <D extends CallableDescriptor> Set<D> filterOverrides(Set<D> candidateSet) {
|
|
||||||
Set<D> candidates = Sets.newLinkedHashSet();
|
|
||||||
outerLoop:
|
|
||||||
for (D me : candidateSet) {
|
|
||||||
for (D other : candidateSet) {
|
|
||||||
if (OverloadingConflictResolver.overrides(other, me)) {
|
|
||||||
continue outerLoop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
candidates.add(me);
|
|
||||||
}
|
|
||||||
return candidates;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkValueArgumentTypes(JetScope scope, JetTypeInferrer.Services temporaryServices, Map<ValueArgument, ValueParameterDescriptor> argumentsToParameters, Flag dirty, Function<ValueParameterDescriptor, ValueParameterDescriptor> parameterMap) {
|
private boolean checkValueArgumentTypes(JetScope scope, JetTypeInferrer.Services temporaryServices, Map<ValueArgument, ValueParameterDescriptor> argumentsToParameters, Flag dirty, Function<ValueParameterDescriptor, ValueParameterDescriptor> parameterMap) {
|
||||||
boolean result = true;
|
boolean result = true;
|
||||||
for (Map.Entry<ValueArgument, ValueParameterDescriptor> entry : argumentsToParameters.entrySet()) {
|
for (Map.Entry<ValueArgument, ValueParameterDescriptor> entry : argumentsToParameters.entrySet()) {
|
||||||
|
|||||||
+3
-22
@@ -1,13 +1,13 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.calls;
|
package org.jetbrains.jet.lang.resolve.calls;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
|
import org.jetbrains.jet.lang.resolve.OverridingUtil;
|
||||||
import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace;
|
import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
import org.jetbrains.jet.lang.types.JetStandardLibrary;
|
import org.jetbrains.jet.lang.types.JetStandardLibrary;
|
||||||
@@ -15,7 +15,6 @@ import org.jetbrains.jet.lang.types.JetType;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -57,8 +56,8 @@ import java.util.Set;
|
|||||||
* Int < Short < Byte
|
* Int < Short < Byte
|
||||||
*/
|
*/
|
||||||
private <Descriptor extends CallableDescriptor> boolean moreSpecific(Descriptor f, Descriptor g, boolean discriminateGenericDescriptors) {
|
private <Descriptor extends CallableDescriptor> boolean moreSpecific(Descriptor f, Descriptor g, boolean discriminateGenericDescriptors) {
|
||||||
if (overrides(f, g)) return true;
|
if (OverridingUtil.overrides(f, g)) return true;
|
||||||
if (overrides(g, f)) return false;
|
if (OverridingUtil.overrides(g, f)) return false;
|
||||||
|
|
||||||
ReceiverDescriptor receiverOfF = f.getReceiver();
|
ReceiverDescriptor receiverOfF = f.getReceiver();
|
||||||
ReceiverDescriptor receiverOfG = g.getReceiver();
|
ReceiverDescriptor receiverOfG = g.getReceiver();
|
||||||
@@ -121,22 +120,4 @@ import java.util.Set;
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <Descriptor extends CallableDescriptor> boolean overrides(@NotNull Descriptor f, @NotNull Descriptor g) {
|
|
||||||
Set<CallableDescriptor> overriddenDescriptors = Sets.newHashSet();
|
|
||||||
getAllOverriddenDescriptors(f.getOriginal(), overriddenDescriptors);
|
|
||||||
CallableDescriptor originalG = g.getOriginal();
|
|
||||||
for (CallableDescriptor overriddenFunction : overriddenDescriptors) {
|
|
||||||
if (originalG.equals(overriddenFunction.getOriginal())) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void getAllOverriddenDescriptors(@NotNull CallableDescriptor current, @NotNull Set<CallableDescriptor> overriddenDescriptors) {
|
|
||||||
if (overriddenDescriptors.contains(current)) return;
|
|
||||||
for (CallableDescriptor descriptor : current.getOriginal().getOverriddenDescriptors()) {
|
|
||||||
getAllOverriddenDescriptors(descriptor, overriddenDescriptors);
|
|
||||||
overriddenDescriptors.add(descriptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user