Extension/non-Extension members are deserialized in correct order

This commit is contained in:
Pavel V. Talanov
2014-11-11 16:44:42 +03:00
parent 8e1111d690
commit 8016766b23
6 changed files with 116 additions and 7 deletions
@@ -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() {
}
}
@@ -0,0 +1,22 @@
package test
internal final class A {
/*primary*/ public constructor A()
internal final val c: kotlin.Int = 2
internal final fun <get-c>(): kotlin.Int
internal final val d: kotlin.Int = 2
internal final fun <get-d>(): kotlin.Int
internal final val kotlin.Int.c: kotlin.Int
internal final fun kotlin.Int.<get-c>(): kotlin.Int
internal final val kotlin.Int.d: kotlin.Int
internal final fun kotlin.Int.<get-d>(): 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
}
@@ -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");
@@ -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");
@@ -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<DeclarationDescriptor>,
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<Name>,
result: MutableCollection<DeclarationDescriptor>,
getMembers: (Name) -> Collection<CallableDescriptor>) {
val extensions = ArrayList<DeclarationDescriptor>()
val nonExtensions = ArrayList<DeclarationDescriptor>()
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<DeclarationDescriptor>)
protected abstract fun addEnumEntryDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean)
@@ -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");