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);
+ }
}