Improve information in GenericSignatureFormatError

Bug: 80029761
Change-Id: Id5a9b9fc61b732327a5e744a9ebb479f34267e75
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureParser.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureParser.java
index 9a5baaf..0cc0d53 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureParser.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureParser.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.naming.signature;
 
 import java.lang.reflect.GenericSignatureFormatError;
+import java.nio.CharBuffer;
 
 /**
  * Implements a parser for the generics signature attribute as defined by JVMS 7 $ 4.3.4.
@@ -177,7 +178,7 @@
         updateTypeVariableSignature();
         break;
       default:
-        throw new GenericSignatureFormatError();
+        parseError();
     }
   }
 
@@ -340,7 +341,7 @@
         eof = true;
       }
     } else {
-      throw new GenericSignatureFormatError();
+      parseError("Unexpected end of signature");
     }
   }
 
@@ -348,7 +349,7 @@
     if (symbol == c) {
       scanSymbol();
     } else {
-      throw new GenericSignatureFormatError();
+      parseError("Expected " + c);
     }
   }
 
@@ -395,10 +396,20 @@
         // Ident starts with incorrect char.
         symbol = 0;
         eof = true;
-        throw new GenericSignatureFormatError();
+        parseError();
       }
     } else {
-      throw new GenericSignatureFormatError();
+      parseError("Unexpected end of signature");
     }
   }
+
+  private void parseError() {
+    parseError("Unexpected");
+  }
+
+  private void parseError(String message) {
+    String arrow = CharBuffer.allocate(pos).toString().replace('\0', ' ') + '^';
+    throw new GenericSignatureFormatError(
+        message + " at position " + (pos + 1) + "\n" + String.valueOf(buffer) + "\n" + arrow);
+  }
 }