Fix several bugs in serialization of inner generic classes

- Interner was working incorrectly with parents
- nested classes were serialized in codegen out of any context

 #KT-5660 Fixed
This commit is contained in:
Alexander Udalov
2014-11-24 16:07:40 +03:00
parent 36c65e4264
commit 1f68c94ce6
14 changed files with 205 additions and 25 deletions
@@ -232,7 +232,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(v.getSerializationBindings()));
DescriptorSerializer serializer =
DescriptorSerializer.create(descriptor, new JavaSerializerExtension(v.getSerializationBindings()));
ProtoBuf.Class classProto = serializer.classProto(descriptor).build();
@@ -272,7 +272,7 @@ public class PackageCodegen {
if (file.isScript()) return;
}
DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(bindings));
DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(new JavaSerializerExtension(bindings));
Collection<PackageFragmentDescriptor> packageFragments = Lists.newArrayList();
ContainerUtil.addIfNotNull(packageFragments, packageFragment);
ContainerUtil.addIfNotNull(packageFragments, compiledPackageFragment);
@@ -110,7 +110,7 @@ public class BuiltInsSerializer(val out: PrintStream?) {
// TODO: perform some kind of validation? At the moment not possible because DescriptorValidator is in compiler-tests
// DescriptorValidator.validate(packageView)
val serializer = DescriptorSerializer(SerializerExtension.DEFAULT)
val serializer = DescriptorSerializer.createTopLevel(SerializerExtension.DEFAULT)
val classNames = ArrayList<Name>()
val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors(DescriptorKindFilter.CLASSIFIERS))
@@ -0,0 +1,13 @@
package test
class A<TA> {
inner class B<TB> {
inner class C<TC> {
inner class D<TD> {
fun <P1, P2, P3, P4> foo(p1: P1, p2: P2, p3: P3, p4: P4): Nothing = null!!
fun bar(ta: TA, tb: TB, tc: TC, td: TD): A<TA>.B<TB>.C<TC>.D<TD> = foo<TA, TB, TC, TD>(ta, tb, tc, td)
}
}
}
}
@@ -0,0 +1,19 @@
package test
internal final class A</*0*/ TA> {
/*primary*/ public constructor A</*0*/ TA>()
internal final inner class B</*0*/ TB> {
/*primary*/ public constructor B</*0*/ TB>()
internal final inner class C</*0*/ TC> {
/*primary*/ public constructor C</*0*/ TC>()
internal final inner class D</*0*/ TD> {
/*primary*/ public constructor D</*0*/ TD>()
internal final fun bar(/*0*/ ta: TA, /*1*/ tb: TB, /*2*/ tc: TC, /*3*/ td: TD): test.A.B.C.D<TD>
internal final fun </*0*/ P1, /*1*/ P2, /*2*/ P3, /*3*/ P4> foo(/*0*/ p1: P1, /*1*/ p2: P2, /*2*/ p3: P3, /*3*/ p4: P4): kotlin.Nothing
}
}
}
}
@@ -0,0 +1,5 @@
package test
class InnerClassReferencesOuterTP<P> {
inner class Inner<Q : P>
}
@@ -0,0 +1,9 @@
package test
internal final class InnerClassReferencesOuterTP</*0*/ P> {
/*primary*/ public constructor InnerClassReferencesOuterTP</*0*/ P>()
internal final inner class Inner</*0*/ Q : P> {
/*primary*/ public constructor Inner</*0*/ Q : P>()
}
}
@@ -0,0 +1,11 @@
package test
class MembersReferenceOuterTP<P> {
inner class Inner {
fun f<Q : P>() {}
fun g(p: P): P = null!!
val v: P = null!!
val <Q : P> w: Q = null!!
}
}
@@ -0,0 +1,15 @@
package test
internal final class MembersReferenceOuterTP</*0*/ P> {
/*primary*/ public constructor MembersReferenceOuterTP</*0*/ P>()
internal final inner class Inner {
/*primary*/ public constructor Inner()
internal final val v: P
internal final fun <get-v>(): P
internal final val </*0*/ Q : P> w: Q
internal final fun <get-w>(): Q
internal final fun </*0*/ Q : P> f(): kotlin.Unit
internal final fun g(/*0*/ p: P): P
}
}
@@ -1801,7 +1801,7 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
@TestMetadata("compiler/testData/loadJava/compiledKotlin")
@TestDataPath("$PROJECT_ROOT")
@InnerTestClasses({CompiledKotlin.Annotations.class, CompiledKotlin.Class.class, CompiledKotlin.ClassFun.class, CompiledKotlin.ClassObject.class, CompiledKotlin.Constructor.class, CompiledKotlin.DataClass.class, CompiledKotlin.Enum.class, CompiledKotlin.FromLoadJava.class, CompiledKotlin.Fun.class, CompiledKotlin.Inline.class, CompiledKotlin.MemberOrder.class, CompiledKotlin.PlatformTypes.class, CompiledKotlin.Prop.class, CompiledKotlin.Type.class, CompiledKotlin.Visibility.class})
@InnerTestClasses({CompiledKotlin.Annotations.class, CompiledKotlin.Class.class, CompiledKotlin.ClassFun.class, CompiledKotlin.ClassObject.class, CompiledKotlin.Constructor.class, CompiledKotlin.DataClass.class, CompiledKotlin.Enum.class, CompiledKotlin.FromLoadJava.class, CompiledKotlin.Fun.class, CompiledKotlin.Inline.class, CompiledKotlin.MemberOrder.class, CompiledKotlin.Nested.class, CompiledKotlin.PlatformTypes.class, CompiledKotlin.Prop.class, CompiledKotlin.Type.class, CompiledKotlin.Visibility.class})
@RunWith(JUnit3RunnerWithInners.class)
public static class CompiledKotlin extends AbstractLoadJavaTest {
public void testAllFilesPresentInCompiledKotlin() throws Exception {
@@ -4176,6 +4176,33 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
}
}
@TestMetadata("compiler/testData/loadJava/compiledKotlin/nested")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Nested extends AbstractLoadJavaTest {
public void testAllFilesPresentInNested() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/loadJava/compiledKotlin/nested"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("deepInnerGeneric.kt")
public void testDeepInnerGeneric() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/nested/deepInnerGeneric.kt");
doTestCompiledKotlin(fileName);
}
@TestMetadata("innerClassReferencesOuterTP.kt")
public void testInnerClassReferencesOuterTP() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/nested/innerClassReferencesOuterTP.kt");
doTestCompiledKotlin(fileName);
}
@TestMetadata("membersReferenceOuterTP.kt")
public void testMembersReferenceOuterTP() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/nested/membersReferenceOuterTP.kt");
doTestCompiledKotlin(fileName);
}
}
@TestMetadata("compiler/testData/loadJava/compiledKotlin/platformTypes")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -33,7 +33,7 @@ import java.util.regex.Pattern;
public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyResolveRecursiveComparingTest {
@TestMetadata("compiler/testData/loadJava/compiledKotlin")
@TestDataPath("$PROJECT_ROOT")
@InnerTestClasses({CompiledKotlin.Annotations.class, CompiledKotlin.Class.class, CompiledKotlin.ClassFun.class, CompiledKotlin.ClassObject.class, CompiledKotlin.Constructor.class, CompiledKotlin.DataClass.class, CompiledKotlin.Enum.class, CompiledKotlin.FromLoadJava.class, CompiledKotlin.Fun.class, CompiledKotlin.Inline.class, CompiledKotlin.MemberOrder.class, CompiledKotlin.PlatformTypes.class, CompiledKotlin.Prop.class, CompiledKotlin.Type.class, CompiledKotlin.Visibility.class})
@InnerTestClasses({CompiledKotlin.Annotations.class, CompiledKotlin.Class.class, CompiledKotlin.ClassFun.class, CompiledKotlin.ClassObject.class, CompiledKotlin.Constructor.class, CompiledKotlin.DataClass.class, CompiledKotlin.Enum.class, CompiledKotlin.FromLoadJava.class, CompiledKotlin.Fun.class, CompiledKotlin.Inline.class, CompiledKotlin.MemberOrder.class, CompiledKotlin.Nested.class, CompiledKotlin.PlatformTypes.class, CompiledKotlin.Prop.class, CompiledKotlin.Type.class, CompiledKotlin.Visibility.class})
@RunWith(JUnit3RunnerWithInners.class)
public static class CompiledKotlin extends AbstractLazyResolveRecursiveComparingTest {
public void testAllFilesPresentInCompiledKotlin() throws Exception {
@@ -2408,6 +2408,33 @@ public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyReso
}
}
@TestMetadata("compiler/testData/loadJava/compiledKotlin/nested")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Nested extends AbstractLazyResolveRecursiveComparingTest {
public void testAllFilesPresentInNested() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/loadJava/compiledKotlin/nested"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("deepInnerGeneric.kt")
public void testDeepInnerGeneric() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/nested/deepInnerGeneric.kt");
doTest(fileName);
}
@TestMetadata("innerClassReferencesOuterTP.kt")
public void testInnerClassReferencesOuterTP() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/nested/innerClassReferencesOuterTP.kt");
doTest(fileName);
}
@TestMetadata("membersReferenceOuterTP.kt")
public void testMembersReferenceOuterTP() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/nested/membersReferenceOuterTP.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/loadJava/compiledKotlin/platformTypes")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)