From 0e4a7ebe90a1d9f4c0d5253fe7ca5cd169b6cc75 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 4 Nov 2011 20:58:31 +0300 Subject: [PATCH] isReified() for type parameters --- .../resolve/java/JavaDescriptorResolver.java | 1 + .../descriptors/TypeParameterDescriptor.java | 16 +++++++++++++--- .../lang/resolve/ClassDescriptorResolver.java | 2 ++ .../jet/lang/types/DescriptorSubstitutor.java | 1 + .../jet/lang/types/JetStandardClasses.java | 8 ++++---- .../jet/resolve/DescriptorRenderer.java | 3 +++ 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index a66b089f62c..054734e2c5b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -189,6 +189,7 @@ public class JavaDescriptorResolver { TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification( owner, Collections.emptyList(), // TODO + false, Variance.INVARIANT, typeParameter.getName(), typeParameter.getIndex() diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java index b3c49e458c4..695686b10b0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java @@ -21,10 +21,11 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement public static TypeParameterDescriptor createWithDefaultBound( @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, + boolean reified, @NotNull Variance variance, @NotNull String name, int index) { - TypeParameterDescriptor typeParameterDescriptor = createForFurtherModification(containingDeclaration, annotations, variance, name, index); + TypeParameterDescriptor typeParameterDescriptor = createForFurtherModification(containingDeclaration, annotations, reified, variance, name, index); typeParameterDescriptor.addUpperBound(JetStandardClasses.getDefaultBound()); return typeParameterDescriptor; } @@ -32,10 +33,11 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement public static TypeParameterDescriptor createForFurtherModification( @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, + boolean reified, @NotNull Variance variance, @NotNull String name, int index) { - return new TypeParameterDescriptor(containingDeclaration, annotations, variance, name, index); + return new TypeParameterDescriptor(containingDeclaration, annotations, reified, variance, name, index); } private final int index; @@ -47,9 +49,12 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement private final Set classObjectUpperBounds = Sets.newLinkedHashSet(); private JetType classObjectBoundsAsType; + private final boolean reified; + private TypeParameterDescriptor( @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, + boolean reified, @NotNull Variance variance, @NotNull String name, int index) { @@ -57,6 +62,7 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement this.index = index; this.variance = variance; this.upperBounds = Sets.newLinkedHashSet(); + this.reified = reified; // TODO: Should we actually pass the annotations on to the type constructor? this.typeConstructor = new TypeConstructorImpl( this, @@ -67,6 +73,10 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement upperBounds); } + public boolean isReified() { + return reified; + } + public Variance getVariance() { return variance; } @@ -162,6 +172,6 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement @NotNull public TypeParameterDescriptor copy(@NotNull DeclarationDescriptor newOwner) { - return new TypeParameterDescriptor(newOwner, Lists.newArrayList(getAnnotations()), variance, getName(), index); + return new TypeParameterDescriptor(newOwner, Lists.newArrayList(getAnnotations()), reified, variance, getName(), index); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 112c798ab46..c5ded6ed64e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -50,6 +50,7 @@ public class ClassDescriptorResolver { TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification( descriptor, annotationResolver.createAnnotationStubs(typeParameter.getModifierList()), + true, typeParameter.getVariance(), JetPsiUtil.safeName(typeParameter.getName()), index @@ -313,6 +314,7 @@ public class ClassDescriptorResolver { TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification( containingDescriptor, annotationResolver.createAnnotationStubs(typeParameter.getModifierList()), + true, typeParameter.getVariance(), JetPsiUtil.safeName(typeParameter.getName()), index diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/DescriptorSubstitutor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/DescriptorSubstitutor.java index 3d29ab80a1d..b31f101c402 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/DescriptorSubstitutor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/DescriptorSubstitutor.java @@ -40,6 +40,7 @@ public class DescriptorSubstitutor { TypeParameterDescriptor substituted = TypeParameterDescriptor.createForFurtherModification( newContainingDeclaration, descriptor.getAnnotations(), + descriptor.isReified(), descriptor.getVariance(), descriptor.getName(), descriptor.getIndex()); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java index e637d05de72..c76c5c797ca 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java @@ -116,7 +116,7 @@ public class JetStandardClasses { parameters.add(TypeParameterDescriptor.createWithDefaultBound( classDescriptor, Collections.emptyList(), - Variance.OUT_VARIANCE, "T" + j, j)); + true, Variance.OUT_VARIANCE, "T" + j, j)); } TUPLE[i] = classDescriptor.initialize( true, @@ -159,7 +159,7 @@ public class JetStandardClasses { parameters.add(0, TypeParameterDescriptor.createWithDefaultBound( receiverFunction, Collections.emptyList(), - Variance.IN_VARIANCE, "T", 0)); + true, Variance.IN_VARIANCE, "T", 0)); RECEIVER_FUNCTION[i] = receiverFunction.initialize( false, parameters, @@ -174,12 +174,12 @@ public class JetStandardClasses { parameters.add(TypeParameterDescriptor.createWithDefaultBound( function, Collections.emptyList(), - Variance.IN_VARIANCE, "P" + j, j + 1)); + true, Variance.IN_VARIANCE, "P" + j, j + 1)); } parameters.add(TypeParameterDescriptor.createWithDefaultBound( function, Collections.emptyList(), - Variance.OUT_VARIANCE, "R", parameterCount + 1)); + true, Variance.OUT_VARIANCE, "R", parameterCount + 1)); return parameters; } diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index a9bddbb2c7a..b744988a594 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -311,6 +311,9 @@ public class DescriptorRenderer implements Renderer { } protected void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) { + if (!descriptor.isReified()) { + builder.append(renderKeyword("erased")).append(" "); + } renderName(descriptor, builder); if (!descriptor.getUpperBounds().isEmpty()) { JetType bound = descriptor.getUpperBounds().iterator().next();