Projects STRLCPY jadx Commits 95795620
🤬
  • core: fix indent for 'break' in 'case' block, refactor tests

  • Loading...
  • Skylot committed 1 decade ago
    95795620
    1 parent 890c0a99
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/core/codegen/CodeWriter.java
    skipped 49 lines
    50 50   
    51 51   public CodeWriter startLine() {
    52 52   addLine();
    53  - addIndent();
     53 + addLineIndent();
    54 54   return this;
    55 55   }
    56 56   
    57 57   public CodeWriter startLine(char c) {
    58 58   addLine();
    59  - addIndent();
     59 + addLineIndent();
    60 60   add(c);
    61 61   return this;
    62 62   }
    63 63   
    64 64   public CodeWriter startLine(String str) {
    65 65   addLine();
    66  - addIndent();
    67  - add(str);
    68  - return this;
    69  - }
    70  - 
    71  - public CodeWriter startLine(int ind, String str) {
    72  - addLine();
    73  - addIndent();
    74  - for (int i = 0; i < ind; i++) {
    75  - addIndent();
    76  - }
     66 + addLineIndent();
    77 67   add(str);
    78 68   return this;
    79 69   }
    skipped 38 lines
    118 108   offset = 0;
    119 109   }
    120 110   
    121  - public CodeWriter addIndent() {
     111 + private CodeWriter addLineIndent() {
    122 112   buf.append(indentStr);
    123 113   offset += indentStr.length();
    124 114   return this;
    125 115   }
    126 116   
     117 + public CodeWriter addIndent() {
     118 + add(INDENT);
     119 + return this;
     120 + }
     121 + 
    127 122   private void updateIndent() {
    128 123   int curIndent = indent;
    129 124   if (curIndent < INDENT_CACHE.length) {
    skipped 5 lines
    135 130   }
    136 131   this.indentStr = s.toString();
    137 132   }
    138  - }
    139  - 
    140  - public int getLine() {
    141  - return line;
    142  - }
    143  - 
    144  - public int getIndent() {
    145  - return indent;
    146 133   }
    147 134   
    148 135   public void incIndent() {
    skipped 16 lines
    165 152   this.indent = 0;
    166 153   }
    167 154   updateIndent();
     155 + }
     156 + 
     157 + public int getLine() {
     158 + return line;
    168 159   }
    169 160   
    170 161   private static class DefinitionWrapper {
    skipped 124 lines
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/core/codegen/RegionGen.java
    skipped 202 lines
    203 203   code.startLine("switch (");
    204 204   addArg(code, arg);
    205 205   code.add(") {");
     206 + code.incIndent();
    206 207   
    207 208   int size = sw.getKeys().size();
    208 209   for (int i = 0; i < size; i++) {
    skipped 14 lines
    223 224   code.startLine("default:");
    224 225   makeCaseBlock(sw.getDefaultCase(), code);
    225 226   }
     227 + code.decIndent();
    226 228   code.startLine('}');
    227 229   return code;
    228 230   }
    229 231   
    230 232   private void makeCaseBlock(IContainer c, CodeWriter code) throws CodegenException {
     233 + boolean addBreak = true;
    231 234   if (RegionUtils.notEmpty(c)) {
    232 235   makeRegionIndent(code, c);
    233  - if (RegionUtils.hasExitEdge(c)) {
    234  - code.startLine(1, "break;");
     236 + if (!RegionUtils.hasExitEdge(c)) {
     237 + addBreak = false;
    235 238   }
    236  - } else {
    237  - code.startLine(1, "break;");
     239 + }
     240 + if (addBreak) {
     241 + code.startLine().addIndent().add("break;");
    238 242   }
    239 243   }
    240 244   
    skipped 40 lines
  • ■ ■ ■ ■ ■
    jadx-core/src/test/java/jadx/api/InternalJadxTest.java
    1 1  package jadx.api;
    2 2   
    3 3  import jadx.core.Jadx;
    4  -import jadx.core.codegen.CodeWriter;
    5 4  import jadx.core.dex.attributes.AttributeFlag;
    6 5  import jadx.core.dex.nodes.ClassNode;
    7 6  import jadx.core.dex.nodes.MethodNode;
    skipped 17 lines
    25 24  import static junit.framework.Assert.assertNotNull;
    26 25  import static junit.framework.Assert.fail;
    27 26   
    28  -public abstract class InternalJadxTest {
     27 +public abstract class InternalJadxTest extends TestUtils {
    29 28   
    30 29   protected boolean outputCFG = false;
    31 30   protected boolean deleteTmpJar = true;
    skipped 117 lines
    149 148   in.close();
    150 149   }
    151 150   }
    152  - }
    153  - 
    154  - protected String makeIndent(int indent) {
    155  - StringBuilder sb = new StringBuilder(indent * CodeWriter.INDENT.length());
    156  - for (int i = 0; i < indent; i++) {
    157  - sb.append(CodeWriter.INDENT);
    158  - }
    159  - return sb.toString();
    160 151   }
    161 152   
    162 153   // Use only for debug purpose
    skipped 12 lines
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/test/java/jadx/api/TestUtils.java
     1 +package jadx.api;
     2 + 
     3 +import jadx.core.codegen.CodeWriter;
     4 + 
     5 +public class TestUtils {
     6 + 
     7 + public static String indent(int indent) {
     8 + StringBuilder sb = new StringBuilder(indent * CodeWriter.INDENT.length());
     9 + for (int i = 0; i < indent; i++) {
     10 + sb.append(CodeWriter.INDENT);
     11 + }
     12 + return sb.toString();
     13 + }
     14 + 
     15 + public static int count(String string, String substring) {
     16 + int count = 0;
     17 + int idx = 0;
     18 + while ((idx = string.indexOf(substring, idx)) != -1) {
     19 + idx++;
     20 + count++;
     21 + }
     22 + return count;
     23 + }
     24 + 
     25 +}
     26 + 
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/test/java/jadx/tests/internal/TestSwitch.java
     1 +package jadx.tests.internal;
     2 + 
     3 +import jadx.api.InternalJadxTest;
     4 +import jadx.core.dex.nodes.ClassNode;
     5 + 
     6 +import org.junit.Test;
     7 + 
     8 +import static org.hamcrest.CoreMatchers.containsString;
     9 +import static org.junit.Assert.assertThat;
     10 + 
     11 +public class TestSwitch extends InternalJadxTest {
     12 + public static class TestCls {
     13 + public String escape(String str) {
     14 + int len = str.length();
     15 + StringBuilder sb = new StringBuilder(len);
     16 + for (int i = 0; i < len; i++) {
     17 + char c = str.charAt(i);
     18 + switch (c) {
     19 + case '.':
     20 + case '/':
     21 + sb.append('_');
     22 + break;
     23 + 
     24 + case ']':
     25 + sb.append('A');
     26 + break;
     27 + 
     28 + case '?':
     29 + break;
     30 + 
     31 + default:
     32 + sb.append(c);
     33 + break;
     34 + }
     35 + }
     36 + return sb.toString();
     37 + }
     38 + }
     39 + 
     40 + @Test
     41 + public void test() {
     42 + ClassNode cls = getClassNode(TestCls.class);
     43 + String code = cls.getCode().toString();
     44 + System.out.println(code);
     45 + 
     46 + assertThat(code, containsString("case '/':"));
     47 + assertThat(code, containsString(indent(5) + "break;"));
     48 + }
     49 +}
     50 + 
  • ■ ■ ■ ■
    jadx-core/src/test/java/jadx/tests/internal/TestSynchronized.java
    skipped 37 lines
    38 38   assertThat(code, containsString("return this.f"));
    39 39   assertThat(code, containsString("synchronized (this.o) {"));
    40 40   
    41  - assertThat(code, not(containsString(makeIndent(3) + ";")));
     41 + assertThat(code, not(containsString(indent(3) + ";")));
    42 42   }
    43 43  }
    44 44   
  • ■ ■ ■ ■
    jadx-core/src/test/java/jadx/tests/internal/TestVariablesDefinitions.java
    skipped 42 lines
    43 43   System.out.println(code);
    44 44   
    45 45   // 'iterator' variable must be declared inside 'try' block
    46  - assertThat(code, containsString(makeIndent(3) + "Iterator<IDexTreeVisitor> iterator = "));
     46 + assertThat(code, containsString(indent(3) + "Iterator<IDexTreeVisitor> iterator = "));
    47 47   assertThat(code, not(containsString("iterator;")));
    48 48   }
    49 49  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/test/java/jadx/tests/internal/inner/TestAnonymousClass3.java
    skipped 43 lines
    44 44   String code = cls.getCode().toString();
    45 45   System.out.println(code);
    46 46   
    47  - assertThat(code, containsString(makeIndent(4) + "public void run() {"));
    48  - assertThat(code, containsString(makeIndent(3) + "}.start();"));
     47 + assertThat(code, containsString(indent(4) + "public void run() {"));
     48 + assertThat(code, containsString(indent(3) + "}.start();"));
    49 49   
    50 50  // assertThat(code, not(containsString("synthetic")));
    51 51  // assertThat(code, not(containsString("AnonymousClass_")));
    skipped 5 lines
Please wait...
Page is in error, reload to recover