fix nested type-arg-list parsing.

Just like old C++, Foo<Bar<Baz>> has been failing to compile due to ">>"
operator.

Luckily, ">>" is valid only in "=" ~~~ ";" (const expression) in AIDL.
Introduced "CONST_MODE" as a starting condition for ">>" & "<<" so that
when we're parsing type-arg-list, ">>" & "<<" tokens are not considered.

Bug: n/a
Test: aidl_unittests & aidl_integration_test
Change-Id: I969a4ca7a16f6fcd49348d766792c6b40b004c01
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index bc29cd5..ab98eef 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -3394,6 +3394,21 @@
   EXPECT_EQ(expected_stderr, GetCapturedStderr());
 }
 
+TEST_F(AidlTest, NestedTypeArgs) {
+  io_delegate_.SetFileContents("a/Bar.aidl", "package a; parcelable Bar<A> { }");
+  io_delegate_.SetFileContents(
+      "a/Foo.aidl", "package a; import a.Bar; parcelable Foo { Bar<Bar<String>> barss; }");
+  Options options = Options::From("aidl a/Foo.aidl -I . -o out --lang=java");
+  const string expected_stderr = "";
+  CaptureStderr();
+  EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
+  EXPECT_EQ(expected_stderr, GetCapturedStderr());
+
+  string code;
+  EXPECT_TRUE(io_delegate_.GetWrittenContents("out/a/Foo.java", &code));
+  EXPECT_THAT(code, testing::HasSubstr("a.Bar<a.Bar<java.lang.String>> barss;"));
+}
+
 struct GenericAidlTest : ::testing::Test {
   FakeIoDelegate io_delegate_;
   void Compile(string cmd) {