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