core: fix variable names propagation (#219)

This commit is contained in:
Skylot
2018-04-08 17:34:51 +03:00
parent 7a16814808
commit cb23b65797
10 changed files with 225 additions and 27 deletions
@@ -14,7 +14,7 @@ public class TestConditions10 extends IntegrationTest {
public static class TestCls {
public void test(boolean a, int b) throws Exception {
public void test(boolean a, int b) {
if (a || b > 2) {
b++;
}
@@ -0,0 +1,52 @@
package jadx.tests.integration.debuginfo;
import org.junit.Test;
import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.IntegrationTest;
import jadx.tests.api.SmaliTest;
import static jadx.tests.api.utils.JadxMatchers.containsLines;
import static jadx.tests.api.utils.JadxMatchers.containsOne;
import static org.junit.Assert.assertThat;
public class TestVariablesNames extends SmaliTest {
/*
public static class TestCls {
public void test(String s, int k) {
f1(s);
int i = k + 3;
String s2 = "i" + i;
f2(i, s2);
double d = i * 5;
String s3 = "d" + d;
f3(d, s3);
}
private void f1(String s) {
}
private void f2(int i, String i2) {
}
private void f3(double d, String d2) {
}
}
*/
/**
* Parameter register reused in variables assign with different types and names
* No variables names in debug info
*/
@Test
public void test() {
ClassNode cls = getClassNodeFromSmaliWithPath("debuginfo", "TestVariablesNames");
String code = cls.getCode().toString();
// TODO: don't use current variables naming in tests
assertThat(code, containsOne("f1(str);"));
assertThat(code, containsOne("f2(i2, \"i\" + i2);"));
assertThat(code, containsOne("f3(d, \"d\" + d);"));
}
}
@@ -29,10 +29,11 @@ public class TestTryCatch7 extends IntegrationTest {
ClassNode cls = getClassNode(TestCls.class);
String code = cls.getCode().toString();
String excVarName = "exception";
String excVarName = "e";
String catchExcVarName = "e2";
assertThat(code, containsOne("Exception " + excVarName + " = new Exception();"));
assertThat(code, containsOne("} catch (Exception e) {"));
assertThat(code, containsOne(excVarName + " = e;"));
assertThat(code, containsOne("} catch (Exception " + catchExcVarName + ") {"));
assertThat(code, containsOne(excVarName + " = " + catchExcVarName + ";"));
assertThat(code, containsOne(excVarName + ".printStackTrace();"));
assertThat(code, containsOne("return " + excVarName + ";"));
}
@@ -0,0 +1,92 @@
.class public LTestVariablesNames;
.super Ljava/lang/Object;
.source "TestVariablesNames.java"
.method public test(Ljava/lang/String;I)V
.registers 10
.prologue
.line 17
invoke-direct {p0, p1}, LTestVariablesNames;->f1(Ljava/lang/String;)V
.line 18
add-int/lit8 p1, p2, 0x3
.line 19
new-instance v5, Ljava/lang/StringBuilder;
invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
const-string v6, "i"
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v5
invoke-virtual {v5, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v5
invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
.line 20
invoke-direct {p0, p1, v3}, LTestVariablesNames;->f2(ILjava/lang/String;)V
.line 21
mul-int/lit8 v5, p1, 0x5
int-to-double p1, v5
.line 22
new-instance v5, Ljava/lang/StringBuilder;
invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
const-string v6, "d"
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v5
invoke-virtual {v5, p1, v1}, Ljava/lang/StringBuilder;->append(D)Ljava/lang/StringBuilder;
move-result-object v5
invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v4
.line 23
invoke-direct {p0, p1, v1, v4}, LTestVariablesNames;->f3(DLjava/lang/String;)V
.line 24
return-void
.end method
.method public constructor <init>()V
.registers 1
.prologue
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method private f1(Ljava/lang/String;)V
.registers 2
.prologue
return-void
.end method
.method private f2(ILjava/lang/String;)V
.registers 3
.prologue
return-void
.end method
.method private f3(DLjava/lang/String;)V
.registers 4
.prologue
return-void
.end method