From d4ac31214202b6fe6c76cbce55cff69ad120fe47 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 14 May 2013 16:28:26 +0400 Subject: [PATCH] Account for circular bounds in type parameters --- .../serialization/DescriptorDeserializer.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java index ff3bce5fa04..e2a43394e60 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java @@ -141,13 +141,20 @@ public class DescriptorDeserializer { @NotNull private List typeParameters(@NotNull List protos) { - List result = new ArrayList(protos.size()); + List result = new ArrayList(protos.size()); for (int i = 0; i < protos.size(); i++) { TypeParameter proto = protos.get(i); TypeParameterDescriptorImpl descriptor = typeParameter(proto, i); result.add(descriptor); } - return result; + // Account for circular bounds: + for (int i = 0; i < protos.size(); i++) { + TypeParameter proto = protos.get(i); + TypeParameterDescriptorImpl descriptor = result.get(i); + addTypeParameterBounds(proto, descriptor); + } + //noinspection unchecked + return (List) result; } private TypeParameterDescriptorImpl typeParameter(TypeParameter proto, int index) { @@ -161,11 +168,21 @@ public class DescriptorDeserializer { nameResolver.getName(proto.getName()), index); typeDeserializer.registerTypeParameter(id, descriptor); - // TODO: circular bounds - descriptor.setInitialized(); return descriptor; } + private void addTypeParameterBounds(TypeParameter proto, TypeParameterDescriptorImpl descriptor) { + if (proto.getUpperBoundsCount() == 0) { + descriptor.addDefaultUpperBound(); + } + else { + for (Type upperBound : proto.getUpperBoundsList()) { + descriptor.addUpperBound(typeDeserializer.type(upperBound)); + } + } + descriptor.setInitialized(); + } + private static Variance variance(TypeParameter.Variance proto) { switch (proto) { case IN: