Projects STRLCPY jadx Commits 9c90699c
🤬
  • core: fix parsing of generic signature with inner classes

  • Loading...
  • Skylot committed 10 years ago
    9c90699c
    1 parent b67cd50e
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java
    skipped 5 lines
    6 6  import jadx.core.dex.instructions.args.ArgType;
    7 7  import jadx.core.utils.exceptions.JadxRuntimeException;
    8 8   
    9  -import java.util.ArrayList;
    10 9  import java.util.Collections;
    11 10  import java.util.LinkedHashMap;
    12 11  import java.util.LinkedList;
    skipped 146 lines
    159 158   } while (ch != '<' && ch != ';');
    160 159   
    161 160   if (ch == ';') {
    162  - return ArgType.object(incompleteType ? slice() : inclusiveSlice());
     161 + String obj;
     162 + if (incompleteType) {
     163 + obj = slice().replace('/', '.');
     164 + } else {
     165 + obj = inclusiveSlice();
     166 + }
     167 + return ArgType.object(obj);
    163 168   } else {
    164 169   // generic type start ('<')
    165 170   String obj = slice();
    skipped 18 lines
    184 189   }
    185 190   
    186 191   private ArgType[] consumeGenericArgs() {
    187  - List<ArgType> list = new ArrayList<ArgType>(1);
     192 + List<ArgType> list = new LinkedList<ArgType>();
    188 193   ArgType type;
    189 194   do {
    190 195   if (lookAhead('*')) {
    skipped 108 lines
  • ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/core/utils/Utils.java
    skipped 15 lines
    16 16   int last = obj.length() - 1;
    17 17   if (obj.charAt(0) == 'L' && obj.charAt(last) == ';') {
    18 18   return obj.substring(1, last).replace('/', '.');
    19  - } else {
    20  - return obj;
    21 19   }
     20 + return obj;
    22 21   }
    23 22   
    24 23   public static String makeQualifiedObjectName(String obj) {
    skipped 85 lines
  • ■ ■ ■ ■ ■
    jadx-core/src/test/groovy/jadx/tests/TestSignatureParser.groovy
    skipped 25 lines
    26 26   new SignatureParser(str).consumeType() == result
    27 27   
    28 28   where:
    29  - str | result
    30  - "TD;" | genericType("D")
    31  - "La<TV;Lb;>;" | generic("La;", genericType("V"), object("b"))
    32  - "La<Lb<Lc;>;>;" | generic("La;", generic("Lb;", object("Lc;")))
    33  - "La<TD;>.c;" | genericInner(generic("La;", genericType("D")), "c", null)
    34  - "La<Lb;>.c<TV;>;" | genericInner(generic("La;", object("Lb;")), "c", genericType("V"))
     29 + str | result
     30 + "TD;" | genericType("D")
     31 + "La<TV;Lb;>;" | generic("La;", genericType("V"), object("b"))
     32 + "La<Lb<Lc;>;>;" | generic("La;", generic("Lb;", object("Lc;")))
     33 + "La/b/C<Ld/E<Lf/G;>;>;" | generic("La/b/C;", generic("Ld/E;", object("Lf/G;")))
     34 + "La<TD;>.c;" | genericInner(generic("La;", genericType("D")), "c", null)
     35 + "La<TD;>.c/d;" | genericInner(generic("La;", genericType("D")), "c.d", null)
     36 + "La<Lb;>.c<TV;>;" | genericInner(generic("La;", object("Lb;")), "c", genericType("V"))
    35 37   }
    36 38   
    37 39   def "inner generic"() {
    skipped 45 lines
    83 85   then:
    84 86   argTypes.size() == 1
    85 87   argTypes.get(0) == generic("Ljava/util/List;", wildcard())
     88 + }
     89 + 
     90 + def "method args 2"() {
     91 + when:
     92 + def argTypes = new SignatureParser("(La/b/C<TT;>.d/E;)V").consumeMethodArgs()
     93 + then:
     94 + argTypes.size() == 1
     95 + def argType = argTypes.get(0)
     96 + argType.getObject().indexOf('/') == -1
     97 + argTypes.get(0) == genericInner(generic("La/b/C;", genericType("T")), "d.E", null)
    86 98   }
    87 99   
    88 100   def "generic map: bad signature"() {
    skipped 8 lines
Please wait...
Page is in error, reload to recover