Don't lose annotations on types erased during canonicalization
MOE_MIGRATED_REVID=139378957
diff --git a/java/com/google/turbine/types/Canonicalize.java b/java/com/google/turbine/types/Canonicalize.java
index 9617c7e..b4e320d 100644
--- a/java/com/google/turbine/types/Canonicalize.java
+++ b/java/com/google/turbine/types/Canonicalize.java
@@ -86,7 +86,7 @@
/** Canonicalize a qualified class type, excluding type arguments. */
private static ClassTy canon(Env<ClassSymbol, TypeBoundClass> env, ClassSymbol base, ClassTy ty) {
if (isRaw(env, ty)) {
- return ClassTy.asNonParametricClassTy(ty.sym());
+ return Erasure.eraseClassTy(ty);
}
// if the first name is a simple name resolved inside a nested class, add explicit qualifiers
// for the enclosing declarations
diff --git a/java/com/google/turbine/types/Erasure.java b/java/com/google/turbine/types/Erasure.java
index ba2538b..aa55673 100644
--- a/java/com/google/turbine/types/Erasure.java
+++ b/java/com/google/turbine/types/Erasure.java
@@ -53,19 +53,18 @@
return Type.ClassTy.OBJECT;
}
- private static Type eraseArrayTy(
+ private static Type.ArrayTy eraseArrayTy(
Type.ArrayTy ty, Function<TyVarSymbol, SourceTypeBoundClass.TyVarInfo> tenv) {
- return new Type.ArrayTy(erase(ty.elementType(), tenv), ImmutableList.of());
+ return new Type.ArrayTy(erase(ty.elementType(), tenv), ty.annos());
}
- private static Type eraseClassTy(Type.ClassTy ty) {
+ public static Type.ClassTy eraseClassTy(Type.ClassTy ty) {
ImmutableList.Builder<Type.ClassTy.SimpleClassTy> classes = ImmutableList.builder();
for (Type.ClassTy.SimpleClassTy c : ty.classes) {
if (c.targs().isEmpty()) {
classes.add(c);
} else {
- classes.add(
- new Type.ClassTy.SimpleClassTy(c.sym(), ImmutableList.<Type>of(), ImmutableList.of()));
+ classes.add(new Type.ClassTy.SimpleClassTy(c.sym(), ImmutableList.of(), c.annos()));
}
}
return new Type.ClassTy(classes.build());
diff --git a/javatests/com/google/turbine/lower/LowerIntegrationTest.java b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
index 05db806..c8838df 100644
--- a/javatests/com/google/turbine/lower/LowerIntegrationTest.java
+++ b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
@@ -271,6 +271,7 @@
"interface_member_public.test",
"javadoc_deprecated.test",
"strictfp.test",
+ "type_anno_raw.test",
};
List<Object[]> tests =
ImmutableList.copyOf(testCases).stream().map(x -> new Object[] {x}).collect(toList());
diff --git a/javatests/com/google/turbine/lower/testdata/type_anno_raw.test b/javatests/com/google/turbine/lower/testdata/type_anno_raw.test
new file mode 100644
index 0000000..1c9dfca
--- /dev/null
+++ b/javatests/com/google/turbine/lower/testdata/type_anno_raw.test
@@ -0,0 +1,16 @@
+=== test/Test.java ===
+package test;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import java.lang.annotation.Target;
+import java.util.List;
+
+@Target({TYPE_USE, FIELD}) @interface A {}
+@Target({TYPE_USE, FIELD}) @interface B {}
+
+class Test<T> {
+ class Inner<T> {}
+ @A List a;
+ @A Test.@B Inner c;
+}
\ No newline at end of file