diff options
author | Andy Clement <aclement@gopivotal.com> | 2015-04-01 08:02:01 -0700 |
---|---|---|
committer | Andy Clement <aclement@gopivotal.com> | 2015-04-01 08:02:01 -0700 |
commit | c6753a8aaf104ddd8e3d50ea493ea3ab579fc2fc (patch) | |
tree | 0b7a21ee9b68716fc3f50adad782148cba13ffb5 /util/src | |
parent | 0c9521ae358073133859d9bacbf269cee56258cf (diff) | |
download | aspectj-c6753a8aaf104ddd8e3d50ea493ea3ab579fc2fc.tar.gz aspectj-c6753a8aaf104ddd8e3d50ea493ea3ab579fc2fc.zip |
406167: cope with rogue generic inner type signatures
Diffstat (limited to 'util/src')
-rw-r--r-- | util/src/org/aspectj/util/GenericSignatureParser.java | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/util/src/org/aspectj/util/GenericSignatureParser.java b/util/src/org/aspectj/util/GenericSignatureParser.java index 3f11662f6..28c8db83d 100644 --- a/util/src/org/aspectj/util/GenericSignatureParser.java +++ b/util/src/org/aspectj/util/GenericSignatureParser.java @@ -187,18 +187,10 @@ public class GenericSignatureParser { // now we have either a "." indicating the start of a nested type, // or a "<" indication type arguments, or ";" and we are done. while (!maybeEat(";")) { - if (maybeEat(".")) { + if (tokenStream[tokenIndex].equals(".")) { // outer type completed outerType = new SimpleClassTypeSignature(identifier); - List<SimpleClassTypeSignature> nestedTypeList = new ArrayList<SimpleClassTypeSignature>(); - do { - ret.append("."); - SimpleClassTypeSignature sig = parseSimpleClassTypeSignature(); - ret.append(sig.toString()); - nestedTypeList.add(sig); - } while (maybeEat(".")); - nestedTypes = new SimpleClassTypeSignature[nestedTypeList.size()]; - nestedTypeList.toArray(nestedTypes); + nestedTypes = parseNestedTypesHelper(ret); } else if (tokenStream[tokenIndex].equals("<")) { ret.append("<"); TypeArgument[] tArgs = maybeParseTypeArguments(); @@ -207,16 +199,7 @@ public class GenericSignatureParser { } ret.append(">"); outerType = new SimpleClassTypeSignature(identifier, tArgs); - // now parse possible nesteds... - List<SimpleClassTypeSignature> nestedTypeList = new ArrayList<SimpleClassTypeSignature>(); - while (maybeEat(".")) { - ret.append("."); - SimpleClassTypeSignature sig = parseSimpleClassTypeSignature(); - ret.append(sig.toString()); - nestedTypeList.add(sig); - } - nestedTypes = new SimpleClassTypeSignature[nestedTypeList.size()]; - nestedTypeList.toArray(nestedTypes); + nestedTypes = parseNestedTypesHelper(ret); } else { throw new IllegalStateException("Expecting .,<, or ;, but found " + tokenStream[tokenIndex] + " while unpacking " + inputString); @@ -228,6 +211,39 @@ public class GenericSignatureParser { return new ClassTypeSignature(ret.toString(), outerType, nestedTypes); } + /** + * Helper method to digest nested types, slightly more complex than necessary to cope with some android related + * incorrect classes (see bug 406167) + */ + private SimpleClassTypeSignature[] parseNestedTypesHelper(StringBuffer ret) { + boolean brokenSignature = false; + SimpleClassTypeSignature[] nestedTypes; + List<SimpleClassTypeSignature> nestedTypeList = new ArrayList<SimpleClassTypeSignature>(); + while (maybeEat(".")) { + ret.append("."); + SimpleClassTypeSignature sig = parseSimpleClassTypeSignature(); + if (tokenStream[tokenIndex].equals("/")) { + if (!brokenSignature) { + System.err.println("[See bug 406167] Bad class file signature encountered, nested types appear package qualified, ignoring those incorrect pieces. Signature: "+inputString); + } + brokenSignature = true; + // hit something like: Lcom/a/a/b/t<TK;TV;>.com/a/a/b/af.com/a/a/b/ag; + // and we are looking at the '/' after the com + tokenIndex++; // pointing at the next identifier + while (tokenStream[tokenIndex+1].equals("/")) { + tokenIndex+=2; // jump over an 'identifier' '/' pair + } + // now tokenIndex is the final bit of the name (which we'll treat as the inner type name) + sig = parseSimpleClassTypeSignature(); + } + ret.append(sig.toString()); + nestedTypeList.add(sig); + }; + nestedTypes = new SimpleClassTypeSignature[nestedTypeList.size()]; + nestedTypeList.toArray(nestedTypes); + return nestedTypes; + } + private SimpleClassTypeSignature parseSimpleClassTypeSignature() { String identifier = eatIdentifier(); TypeArgument[] tArgs = maybeParseTypeArguments(); |