From 79a8c4ae9bee3733b8c81d211f62287db9200008 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 23 Mar 2012 19:46:56 +0400 Subject: [PATCH] Improved sorting members in DecompiledDataFactory. --- .../libraries/DecompiledDataFactory.java | 54 ++++++++++++++++++- .../libraries/JetSourceNavigationHelper.java | 6 ++- .../ClassWithAbstractAndOpenMembers.kt | 8 +-- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index 00b2e64167c..58840c81b17 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.resolve.DescriptorRenderer; import java.util.*; @@ -114,12 +115,63 @@ class DecompiledDataFactory { return new JetDecompiledData(jetFile, myClsElementsToJetElements); } + private static int getDeclarationPriority(DeclarationDescriptor descriptor) { + if (descriptor instanceof ClassDescriptor) { + return 4; + } else if (descriptor instanceof PropertyDescriptor) { + return 3; + } else if (descriptor instanceof FunctionDescriptor) { + FunctionDescriptor fun = (FunctionDescriptor)descriptor; + if (fun.getReceiverParameter() == ReceiverDescriptor.NO_RECEIVER) { + return 2; + } else { + return 1; + } + } + return 0; + } + private static List sortDeclarations(Collection input) { ArrayList r = new ArrayList(input); Collections.sort(r, new Comparator() { @Override public int compare(DeclarationDescriptor o1, DeclarationDescriptor o2) { - return o1.getName().compareTo(o2.getName()); + int prioritiesCompareTo = getDeclarationPriority(o2) - getDeclarationPriority(o1); + if (prioritiesCompareTo != 0) { + return prioritiesCompareTo; + } + + int namesCompareTo = o1.getName().compareTo(o2.getName()); + if (namesCompareTo != 0) { + return namesCompareTo; + } + + if (!(o1 instanceof CallableDescriptor) || !(o2 instanceof CallableDescriptor)) { + assert false; + } + + CallableDescriptor c1 = (CallableDescriptor)o1; + CallableDescriptor c2 = (CallableDescriptor)o2; + + if (c1.getReceiverParameter() != ReceiverDescriptor.NO_RECEIVER && c2.getReceiverParameter() != ReceiverDescriptor.NO_RECEIVER) { + String r1 = DescriptorRenderer.TEXT.renderType(c1.getReceiverParameter().getType()); + String r2 = DescriptorRenderer.TEXT.renderType(c2.getReceiverParameter().getType()); + int receiversCompareTo = r1.compareTo(r2); + if (receiversCompareTo != 0) { + return receiversCompareTo; + } + } + + for (int i = 0; i < Math.min(c1.getValueParameters().size(), c2.getValueParameters().size()); i++) { + String p1 = DescriptorRenderer.TEXT.renderType(c1.getValueParameters().get(i).getType()); + String p2 = DescriptorRenderer.TEXT.renderType(c2.getValueParameters().get(i).getType()); + int parametersCompareTo = p1.compareTo(p2); + if (parametersCompareTo != 0) { + return parametersCompareTo; + } + } + + return c1.getValueParameters().size() - c2.getValueParameters().size(); } }); return r; diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index dcbd9fd5d3b..0daed099eea 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -168,7 +168,11 @@ public class JetSourceNavigationHelper { } } else if (declarationContainer instanceof JetClassBody) { - Tuple2 bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor((JetClass) declarationContainer.getParent()); + JetClassOrObject parent = (JetClassOrObject)declarationContainer.getParent(); + if (parent instanceof JetObjectDeclaration) { + return null; // TODO + } + Tuple2 bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor((JetClass)parent); if (bindingContextAndClassDescriptor != null) { BindingContext bindingContext = bindingContextAndClassDescriptor._1; ClassDescriptor classDescriptor = bindingContextAndClassDescriptor._2; diff --git a/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt b/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt index 103ef664098..fb0ac929790 100644 --- a/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt +++ b/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt @@ -4,14 +4,10 @@ package testData.libraries [abstract class ClassWithAbstractAndOpenMembers { - [abstract fun abstractFun() : Unit] - [abstract val abstractVal : jet.String] [abstract var abstractVar : jet.String] - [open fun openFun() : Unit { /* compiled code */ }] - [open val openVal : jet.String] /* compiled code */ [open val openValWithGetter : jet.String] /* compiled code */ @@ -19,4 +15,8 @@ package testData.libraries [open var openVar : jet.String] /* compiled code */ [open var openVarWithGetter : jet.String] /* compiled code */ + + [abstract fun abstractFun() : Unit] + + [open fun openFun() : Unit { /* compiled code */ }] }]