Account for circular bounds in type parameters
This commit is contained in:
committed by
Alexander Udalov
parent
85dad7866d
commit
d4ac312142
+21
-4
@@ -141,13 +141,20 @@ public class DescriptorDeserializer {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private List<TypeParameterDescriptor> typeParameters(@NotNull List<TypeParameter> protos) {
|
private List<TypeParameterDescriptor> typeParameters(@NotNull List<TypeParameter> protos) {
|
||||||
List<TypeParameterDescriptor> result = new ArrayList<TypeParameterDescriptor>(protos.size());
|
List<TypeParameterDescriptorImpl> result = new ArrayList<TypeParameterDescriptorImpl>(protos.size());
|
||||||
for (int i = 0; i < protos.size(); i++) {
|
for (int i = 0; i < protos.size(); i++) {
|
||||||
TypeParameter proto = protos.get(i);
|
TypeParameter proto = protos.get(i);
|
||||||
TypeParameterDescriptorImpl descriptor = typeParameter(proto, i);
|
TypeParameterDescriptorImpl descriptor = typeParameter(proto, i);
|
||||||
result.add(descriptor);
|
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) {
|
private TypeParameterDescriptorImpl typeParameter(TypeParameter proto, int index) {
|
||||||
@@ -161,11 +168,21 @@ public class DescriptorDeserializer {
|
|||||||
nameResolver.getName(proto.getName()),
|
nameResolver.getName(proto.getName()),
|
||||||
index);
|
index);
|
||||||
typeDeserializer.registerTypeParameter(id, descriptor);
|
typeDeserializer.registerTypeParameter(id, descriptor);
|
||||||
// TODO: circular bounds
|
|
||||||
descriptor.setInitialized();
|
|
||||||
return descriptor;
|
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) {
|
private static Variance variance(TypeParameter.Variance proto) {
|
||||||
switch (proto) {
|
switch (proto) {
|
||||||
case IN:
|
case IN:
|
||||||
|
|||||||
Reference in New Issue
Block a user