提交 7a14aaa1 编写于 作者: S Skylot

fix: resolve variable name shadowing in anonymous classes (#1124)

上级 65086383
......@@ -11,6 +11,7 @@ import java.util.Objects;
import java.util.Set;
import java.util.stream.Stream;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import jadx.api.ICodeInfo;
......@@ -59,6 +60,9 @@ public class ClassGen {
private boolean bodyGenStarted;
@Nullable
private NameGen outerNameGen;
public ClassGen(ClassNode cls, JadxArgs jadxArgs) {
this(cls, null, jadxArgs.isUseImports(), jadxArgs.isFallbackMode(), jadxArgs.isShowInconsistentCode());
}
......@@ -238,13 +242,12 @@ public class ClassGen {
*/
public void addClassBody(ICodeWriter clsCode, boolean printClassName) throws CodegenException {
clsCode.add('{');
if (printClassName) {
clsCode.add(" // from class: " + cls.getClassInfo().getFullName());
}
setBodyGenStarted(true);
clsDeclOffset = clsCode.getLength();
clsCode.incIndent();
if (printClassName) {
clsCode.startLine();
clsCode.add("/* class " + cls.getFullName() + " */");
}
addFields(clsCode);
addInnerClsAndMethods(clsCode);
clsCode.decIndent();
......@@ -746,4 +749,13 @@ public class ClassGen {
public void setBodyGenStarted(boolean bodyGenStarted) {
this.bodyGenStarted = bodyGenStarted;
}
@Nullable
public NameGen getOuterNameGen() {
return outerNameGen;
}
public void setOuterNameGen(@NotNull NameGen outerNameGen) {
this.outerNameGen = outerNameGen;
}
}
......@@ -725,7 +725,10 @@ public class InsnGen {
MethodNode callMth = mth.root().resolveMethod(insn.getCallMth());
generateMethodArguments(code, insn, 0, callMth);
code.add(' ');
new ClassGen(cls, mgen.getClassGen().getParentGen()).addClassBody(code, true);
ClassGen classGen = new ClassGen(cls, mgen.getClassGen().getParentGen());
classGen.setOuterNameGen(mgen.getNameGen());
classGen.addClassBody(code, true);
}
private void makeInvoke(InvokeNode insn, ICodeWriter code) throws CodegenException {
......
......@@ -58,7 +58,7 @@ public class MethodGen {
this.mth = mth;
this.classGen = classGen;
this.annotationGen = classGen.getAnnotationGen();
this.nameGen = new NameGen(mth, classGen.isFallbackMode());
this.nameGen = new NameGen(mth, classGen);
}
public ClassGen getClassGen() {
......
......@@ -53,9 +53,13 @@ public class NameGen {
"java.lang.Exception", "exc");
}
public NameGen(MethodNode mth, boolean fallback) {
public NameGen(MethodNode mth, ClassGen classGen) {
this.mth = mth;
this.fallback = fallback;
this.fallback = classGen.isFallbackMode();
NameGen outerNameGen = classGen.getOuterNameGen();
if (outerNameGen != null) {
inheritUsedNames(outerNameGen);
}
addNamesUsedInClass();
}
......
package jadx.tests.integration.names;
import org.junit.jupiter.api.Test;
import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.IntegrationTest;
import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat;
public class TestDuplicateVarNames extends IntegrationTest {
public static class TestCls {
public static class A {
public String mth(A a) {
return null;
}
@Override
public String toString() {
return "1";
}
}
public A test(A a) {
return new A() {
@Override
public String mth(A innerA) {
return a + "." + innerA;
}
};
}
public void check() {
String str = test(new A()).mth(new A() {
@Override
public String toString() {
return "2";
}
});
assertThat(str).isEqualTo("1.2");
}
}
@Test
public void test() {
noDebugInfo();
ClassNode cls = getClassNode(TestCls.class);
assertThat(cls)
.code()
.doesNotContain("return a + \".\" + a;")
.doesNotContain("AnonymousClass1");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册