Fix handling of type annotation on nested type names

The parser failed to account for annotations deeply nested inside
qualified names, and the binder was attaching the wrong annotations to
the outer-most type.

MOE_MIGRATED_REVID=137778735
diff --git a/java/com/google/turbine/binder/TypeBinder.java b/java/com/google/turbine/binder/TypeBinder.java
index 9fe340e..21920ef 100644
--- a/java/com/google/turbine/binder/TypeBinder.java
+++ b/java/com/google/turbine/binder/TypeBinder.java
@@ -577,7 +577,7 @@
     }
     Verify.verifyNotNull(result, "%s", names);
     Symbol sym = result.sym();
-    ImmutableList<AnnoInfo> annos = bindAnnotations(scope, t.annos());
+    ImmutableList<AnnoInfo> annos = bindAnnotations(scope, flat.get(0).annos());
     switch (sym.symKind()) {
       case CLASS:
         // resolve any remaining types in the qualified name, and their type arguments
diff --git a/java/com/google/turbine/parse/Parser.java b/java/com/google/turbine/parse/Parser.java
index f057fde..5740701 100644
--- a/java/com/google/turbine/parse/Parser.java
+++ b/java/com/google/turbine/parse/Parser.java
@@ -49,6 +49,7 @@
 import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.List;
+import javax.annotation.Nullable;
 
 /**
  * A parser for the subset of Java required for header compilation.
@@ -881,18 +882,22 @@
   }
 
   private ClassTy classty(ClassTy ty) {
-    return classty(ty, maybeAnnos());
+    return classty(ty, null);
   }
 
-  private ClassTy classty(ClassTy ty, ImmutableList<Anno> typeAnnos) {
+  private ClassTy classty(ClassTy ty, @Nullable ImmutableList<Anno> typeAnnos) {
     int pos = position;
     do {
+      if (typeAnnos == null) {
+        typeAnnos = maybeAnnos();
+      }
       String name = eatIdent();
       ImmutableList<Type> tyargs = ImmutableList.of();
       if (token == Token.LT) {
         tyargs = tyargs();
       }
       ty = new ClassTy(pos, Optional.fromNullable(ty), name, tyargs, typeAnnos);
+      typeAnnos = null;
     } while (maybe(Token.DOT));
     return ty;
   }
diff --git a/javatests/com/google/turbine/lower/LowerIntegrationTest.java b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
index 00877a9..26282e4 100644
--- a/javatests/com/google/turbine/lower/LowerIntegrationTest.java
+++ b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
@@ -253,6 +253,7 @@
       "visible_package_private_toplevel.test",
       "receiver_param.test",
       "static_member_type_import.test",
+      "type_anno_qual.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_qual.test b/javatests/com/google/turbine/lower/testdata/type_anno_qual.test
new file mode 100644
index 0000000..36b0f33
--- /dev/null
+++ b/javatests/com/google/turbine/lower/testdata/type_anno_qual.test
@@ -0,0 +1,19 @@
+=== Test.java ===
+package p;
+
+import static java.lang.annotation.ElementType.TYPE_USE;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.List;
+
+@Target(TYPE_USE) @interface A {}
+@Target(TYPE_USE) @interface B {}
+
+abstract class Test {
+  class Inner {
+    class InnerMost {}
+  }
+  List<@A Inner.InnerMost> a;
+  List<Inner.@B InnerMost> b;
+}