Stable member sorting.

This commit is contained in:
Evgeny Gerashchenko
2013-07-12 18:10:49 +04:00
parent 5c8f87658a
commit b6e7dcbb02
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.renderer.DescriptorRendererBuilder;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@@ -25,6 +26,8 @@ import java.util.List;
public class MemberComparator implements Comparator<DeclarationDescriptor> { public class MemberComparator implements Comparator<DeclarationDescriptor> {
public static final MemberComparator INSTANCE = new MemberComparator(); public static final MemberComparator INSTANCE = new MemberComparator();
private static final DescriptorRenderer RENDERER = new DescriptorRendererBuilder().setWithDefinedIn(false).setVerbose(true).build();
private MemberComparator() { private MemberComparator() {
} }
@@ -77,8 +80,8 @@ public class MemberComparator implements Comparator<DeclarationDescriptor> {
ReceiverParameterDescriptor c2ReceiverParameter = c2.getReceiverParameter(); ReceiverParameterDescriptor c2ReceiverParameter = c2.getReceiverParameter();
assert (c1ReceiverParameter != null) == (c2ReceiverParameter != null); assert (c1ReceiverParameter != null) == (c2ReceiverParameter != null);
if (c1ReceiverParameter != null) { if (c1ReceiverParameter != null) {
String r1 = DescriptorRenderer.TEXT.renderType(c1ReceiverParameter.getType()); String r1 = RENDERER.renderType(c1ReceiverParameter.getType());
String r2 = DescriptorRenderer.TEXT.renderType(c2ReceiverParameter.getType()); String r2 = RENDERER.renderType(c2ReceiverParameter.getType());
int receiversCompareTo = r1.compareTo(r2); int receiversCompareTo = r1.compareTo(r2);
if (receiversCompareTo != 0) { if (receiversCompareTo != 0) {
return receiversCompareTo; return receiversCompareTo;
@@ -88,8 +91,8 @@ public class MemberComparator implements Comparator<DeclarationDescriptor> {
List<ValueParameterDescriptor> c1ValueParameters = c1.getValueParameters(); List<ValueParameterDescriptor> c1ValueParameters = c1.getValueParameters();
List<ValueParameterDescriptor> c2ValueParameters = c2.getValueParameters(); List<ValueParameterDescriptor> c2ValueParameters = c2.getValueParameters();
for (int i = 0; i < Math.min(c1ValueParameters.size(), c2ValueParameters.size()); i++) { for (int i = 0; i < Math.min(c1ValueParameters.size(), c2ValueParameters.size()); i++) {
String p1 = DescriptorRenderer.TEXT.renderType(c1ValueParameters.get(i).getType()); String p1 = RENDERER.renderType(c1ValueParameters.get(i).getType());
String p2 = DescriptorRenderer.TEXT.renderType(c2ValueParameters.get(i).getType()); String p2 = RENDERER.renderType(c2ValueParameters.get(i).getType());
int parametersCompareTo = p1.compareTo(p2); int parametersCompareTo = p1.compareTo(p2);
if (parametersCompareTo != 0) { if (parametersCompareTo != 0) {
return parametersCompareTo; return parametersCompareTo;
@@ -104,8 +107,8 @@ public class MemberComparator implements Comparator<DeclarationDescriptor> {
List<TypeParameterDescriptor> c1TypeParameters = c1.getTypeParameters(); List<TypeParameterDescriptor> c1TypeParameters = c1.getTypeParameters();
List<TypeParameterDescriptor> c2TypeParameters = c2.getTypeParameters(); List<TypeParameterDescriptor> c2TypeParameters = c2.getTypeParameters();
for (int i = 0; i < Math.min(c1TypeParameters.size(), c2TypeParameters.size()); i++) { for (int i = 0; i < Math.min(c1TypeParameters.size(), c2TypeParameters.size()); i++) {
String p1 = DescriptorRenderer.TEXT.renderType(c1TypeParameters.get(i).getUpperBoundsAsType()); String p1 = RENDERER.renderType(c1TypeParameters.get(i).getUpperBoundsAsType());
String p2 = DescriptorRenderer.TEXT.renderType(c2TypeParameters.get(i).getUpperBoundsAsType()); String p2 = RENDERER.renderType(c2TypeParameters.get(i).getUpperBoundsAsType());
int parametersCompareTo = p1.compareTo(p2); int parametersCompareTo = p1.compareTo(p2);
if (parametersCompareTo != 0) { if (parametersCompareTo != 0) {
return parametersCompareTo; return parametersCompareTo;
@@ -120,9 +123,12 @@ public class MemberComparator implements Comparator<DeclarationDescriptor> {
if (c1 instanceof CallableMemberDescriptor && c2 instanceof CallableMemberDescriptor) { if (c1 instanceof CallableMemberDescriptor && c2 instanceof CallableMemberDescriptor) {
CallableMemberDescriptor.Kind c1Kind = ((CallableMemberDescriptor) c1).getKind(); CallableMemberDescriptor.Kind c1Kind = ((CallableMemberDescriptor) c1).getKind();
CallableMemberDescriptor.Kind c2Kind = ((CallableMemberDescriptor) c2).getKind(); CallableMemberDescriptor.Kind c2Kind = ((CallableMemberDescriptor) c2).getKind();
return c1Kind.ordinal() - c2Kind.ordinal(); int kindsCompareTo = c1Kind.ordinal() - c2Kind.ordinal();
if (kindsCompareTo != 0) {
return kindsCompareTo;
}
} }
return 0; return RENDERER.render(o1).compareTo(RENDERER.render(o2));
} }
} }