diff --git a/compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.kt b/compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.kt new file mode 100644 index 00000000000..e26d9d73970 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.kt @@ -0,0 +1,41 @@ +//ALLOW_AST_ACCESS +package test + +class A { + fun String.f1() { + } + + fun f1() { + } + + fun Int.f1() { + } + + val Int.c: Int + get() = 1 + + val c: Int = 2 + + val d: Int = 2 + + val Int.d: Int + get() = 1 + + fun String.f2() { + } + + fun f2() { + } + + fun Int.f2() { + } + + fun String.f3() { + } + + fun f3() { + } + + fun Int.f3() { + } +} \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.txt b/compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.txt new file mode 100644 index 00000000000..1bc245b4f06 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.txt @@ -0,0 +1,22 @@ +package test + +internal final class A { + /*primary*/ public constructor A() + internal final val c: kotlin.Int = 2 + internal final fun (): kotlin.Int + internal final val d: kotlin.Int = 2 + internal final fun (): kotlin.Int + internal final val kotlin.Int.c: kotlin.Int + internal final fun kotlin.Int.(): kotlin.Int + internal final val kotlin.Int.d: kotlin.Int + internal final fun kotlin.Int.(): kotlin.Int + internal final fun f1(): kotlin.Unit + internal final fun f2(): kotlin.Unit + internal final fun f3(): kotlin.Unit + internal final fun kotlin.Int.f1(): kotlin.Unit + internal final fun kotlin.String.f1(): kotlin.Unit + internal final fun kotlin.Int.f2(): kotlin.Unit + internal final fun kotlin.String.f2(): kotlin.Unit + internal final fun kotlin.Int.f3(): kotlin.Unit + internal final fun kotlin.String.f3(): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index de32ee7b8f0..3befc052fa7 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -4145,6 +4145,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledKotlin(fileName); } + @TestMetadata("extensionMembers.kt") + public void testExtensionMembers() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.kt"); + doTestCompiledKotlin(fileName); + } + @TestMetadata("innerClasses.kt") public void testInnerClasses() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/memberOrder/innerClasses.kt"); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java index 12645092706..d1603329c9a 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java @@ -2377,6 +2377,12 @@ public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyReso doTest(fileName); } + @TestMetadata("extensionMembers.kt") + public void testExtensionMembers() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.kt"); + doTest(fileName); + } + @TestMetadata("innerClasses.kt") public void testInnerClasses() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/memberOrder/innerClasses.kt"); diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt index 9f44771c51c..3825aa84bae 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt @@ -110,13 +110,7 @@ public abstract class DeserializedMemberScope protected( addEnumEntryDescriptors(result, nameFilter) } - val names = membersProtos().keySet().filter(nameFilter) - if (kindFilter.acceptsKinds(DescriptorKindFilter.VARIABLES_MASK)) { - names.forEach { result.addAll(getProperties(it)) } - } - if (kindFilter.acceptsKinds(DescriptorKindFilter.FUNCTIONS_MASK)) { - names.forEach { result.addAll(getFunctions(it)) } - } + addFunctionsAndProperties(result, kindFilter, nameFilter) addNonDeclaredDescriptors(result) @@ -127,6 +121,40 @@ public abstract class DeserializedMemberScope protected( return result.toReadOnlyList() } + private fun addFunctionsAndProperties( + result: LinkedHashSet, + kindFilter: DescriptorKindFilter, + nameFilter: (Name) -> Boolean + ) { + val names = membersProtos().keySet().filter(nameFilter) + if (kindFilter.acceptsKinds(DescriptorKindFilter.VARIABLES_MASK)) { + addMembers(names, result) { getProperties(it) } + } + if (kindFilter.acceptsKinds(DescriptorKindFilter.FUNCTIONS_MASK)) { + addMembers(names, result) { getFunctions(it) } + } + } + + private fun addMembers( + names: List, + result: MutableCollection, + getMembers: (Name) -> Collection) { + val extensions = ArrayList() + val nonExtensions = ArrayList() + names.forEach { name -> + getMembers(name).forEach { member -> + if (member.getExtensionReceiverParameter() == null) { + nonExtensions.add(member) + } + else { + extensions.add(member) + } + } + } + result.addAll(nonExtensions) + result.addAll(extensions) + } + protected abstract fun addNonDeclaredDescriptors(result: MutableCollection) protected abstract fun addEnumEntryDescriptors(result: MutableCollection, nameFilter: (Name) -> Boolean) diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java index 6efa02295ed..d4e60636182 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java @@ -2374,6 +2374,12 @@ public class LazyResolveByStubTestGenerated extends AbstractLazyResolveByStubTes doTest(fileName); } + @TestMetadata("extensionMembers.kt") + public void testExtensionMembers() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/memberOrder/extensionMembers.kt"); + doTest(fileName); + } + @TestMetadata("innerClasses.kt") public void testInnerClasses() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/memberOrder/innerClasses.kt");