From 9333e5c11e71e813669952dd07828adbd837700c Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Mon, 19 Mar 2012 18:05:34 +0400 Subject: [PATCH] do not enforce order of members in JavaPackageScope and JavaClassMemberScope --- .../resolve/java/JavaClassMembersScope.java | 2 +- .../resolve/java/JavaDescriptorResolver.java | 4 ++-- .../java/JavaDescriptorResolverHelper.java | 7 +++++-- .../lang/resolve/java/JavaPackageScope.java | 2 +- .../libraries/DecompiledDataFactory.java | 18 ++++++++++++++---- .../ClassWithAbstractAndOpenMembers.kt | 8 ++++---- idea/testData/libraries/namespace.kt | 4 ++-- 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java index 7a57a9db989..46cb4da7a53 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java @@ -87,7 +87,7 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope { @Override public Collection getAllDescriptors() { if (allDescriptors == null) { - allDescriptors = Sets.newLinkedHashSet(); + allDescriptors = Sets.newHashSet(); allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(psiClass, descriptor)); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 854989af1dc..72a110875e3 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1024,7 +1024,7 @@ public class JavaDescriptorResolver { ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass)); - Set descriptors = Sets.newLinkedHashSet(); + Set descriptors = Sets.newHashSet(); Map membersForProperties = scopeData.namedMembersMap; for (Map.Entry entry : membersForProperties.entrySet()) { NamedMembers namedMembers = entry.getValue(); @@ -1284,7 +1284,7 @@ public class JavaDescriptorResolver { final Set functions = new HashSet(); - Set functionsFromCurrent = Sets.newLinkedHashSet(); + Set functionsFromCurrent = Sets.newHashSet(); for (PsiMethodWrapper method : namedMembers.methods) { FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass, method); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java index 354b8b5e21a..b72d55ab414 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java @@ -18,11 +18,14 @@ package org.jetbrains.jet.lang.resolve.java; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiField; +import com.intellij.psi.PsiMember; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiParameter; import org.jetbrains.annotations.NotNull; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -37,7 +40,7 @@ class JavaDescriptorResolverHelper { private final boolean staticMembers; private final boolean kotlin; - private Map namedMembersMap = new LinkedHashMap(); + private Map namedMembersMap = new HashMap(); private Builder(PsiClassWrapper psiClass, boolean staticMembers, boolean kotlin) { this.psiClass = psiClass; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java index 0ff9bafc89e..198b4aa3ef9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java @@ -99,7 +99,7 @@ public class JavaPackageScope extends JavaClassOrPackageScope { @Override public Collection getAllDescriptors() { if (allDescriptors == null) { - allDescriptors = Sets.newLinkedHashSet(); + allDescriptors = Sets.newHashSet(); if (psiClass != null) { allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(psiClass, descriptor)); diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index 24e0d2d5576..a673389f08f 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -37,8 +37,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.resolve.DescriptorRenderer; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * @author Evgeny Gerashchenko @@ -85,7 +84,7 @@ class DecompiledDataFactory { NamespaceDescriptor nd = myJavaDescriptorResolver.resolveNamespace(new FqName(packageName)); if (nd != null) { - for (DeclarationDescriptor member : nd.getMemberScope().getAllDescriptors()) { + for (DeclarationDescriptor member : sortDeclarations(nd.getMemberScope().getAllDescriptors())) { if (member instanceof ClassDescriptor || member instanceof NamespaceDescriptor) { continue; } @@ -114,6 +113,17 @@ class DecompiledDataFactory { return new JetDecompiledData(jetFile, myClsElementsToJetElements); } + private 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()); + } + }); + return r; + } + private void appendDescriptor(DeclarationDescriptor descriptor, String indent) { int startOffset = myBuilder.length(); myBuilder.append(DescriptorRenderer.COMPACT.render(descriptor)); @@ -140,7 +150,7 @@ class DecompiledDataFactory { myBuilder.append(subindent).append("class "); appendDescriptor(classDescriptor.getClassObjectDescriptor(), subindent); } - for (DeclarationDescriptor member : classDescriptor.getDefaultType().getMemberScope().getAllDescriptors()) { + for (DeclarationDescriptor member : sortDeclarations(classDescriptor.getDefaultType().getMemberScope().getAllDescriptors())) { if (member.getContainingDeclaration() == descriptor) { if (firstPassed) { myBuilder.append("\n"); diff --git a/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt b/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt index b2c911f2cf0..103ef664098 100644 --- a/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt +++ b/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt @@ -6,16 +6,16 @@ package testData.libraries [abstract class ClassWithAbstractAndOpenMembers { [abstract fun abstractFun() : Unit] - [open fun openFun() : Unit { /* compiled code */ }] - [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 */ - [abstract var abstractVar : jet.String] - [open var openVar : jet.String] /* compiled code */ [open var openVarWithGetter : jet.String] /* compiled code */ diff --git a/idea/testData/libraries/namespace.kt b/idea/testData/libraries/namespace.kt index b75381b9408..5f3b2882cad 100644 --- a/idea/testData/libraries/namespace.kt +++ b/idea/testData/libraries/namespace.kt @@ -3,8 +3,8 @@ package testData.libraries -[final fun main(val args : jet.Array) : Unit { /* compiled code */ }] - [final val globalVal : #(jet.Int, jet.String)] /* compiled code */ [final val globalValWithGetter : jet.Long] /* compiled code */ + +[final fun main(val args : jet.Array) : Unit { /* compiled code */ }]