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

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

上级 65086383
...@@ -11,6 +11,7 @@ import java.util.Objects; ...@@ -11,6 +11,7 @@ import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import jadx.api.ICodeInfo; import jadx.api.ICodeInfo;
...@@ -59,6 +60,9 @@ public class ClassGen { ...@@ -59,6 +60,9 @@ public class ClassGen {
private boolean bodyGenStarted; private boolean bodyGenStarted;
@Nullable
private NameGen outerNameGen;
public ClassGen(ClassNode cls, JadxArgs jadxArgs) { public ClassGen(ClassNode cls, JadxArgs jadxArgs) {
this(cls, null, jadxArgs.isUseImports(), jadxArgs.isFallbackMode(), jadxArgs.isShowInconsistentCode()); this(cls, null, jadxArgs.isUseImports(), jadxArgs.isFallbackMode(), jadxArgs.isShowInconsistentCode());
} }
...@@ -238,13 +242,12 @@ public class ClassGen { ...@@ -238,13 +242,12 @@ public class ClassGen {
*/ */
public void addClassBody(ICodeWriter clsCode, boolean printClassName) throws CodegenException { public void addClassBody(ICodeWriter clsCode, boolean printClassName) throws CodegenException {
clsCode.add('{'); clsCode.add('{');
if (printClassName) {
clsCode.add(" // from class: " + cls.getClassInfo().getFullName());
}
setBodyGenStarted(true); setBodyGenStarted(true);
clsDeclOffset = clsCode.getLength(); clsDeclOffset = clsCode.getLength();
clsCode.incIndent(); clsCode.incIndent();
if (printClassName) {
clsCode.startLine();
clsCode.add("/* class " + cls.getFullName() + " */");
}
addFields(clsCode); addFields(clsCode);
addInnerClsAndMethods(clsCode); addInnerClsAndMethods(clsCode);
clsCode.decIndent(); clsCode.decIndent();
...@@ -746,4 +749,13 @@ public class ClassGen { ...@@ -746,4 +749,13 @@ public class ClassGen {
public void setBodyGenStarted(boolean bodyGenStarted) { public void setBodyGenStarted(boolean bodyGenStarted) {
this.bodyGenStarted = 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 { ...@@ -725,7 +725,10 @@ public class InsnGen {
MethodNode callMth = mth.root().resolveMethod(insn.getCallMth()); MethodNode callMth = mth.root().resolveMethod(insn.getCallMth());
generateMethodArguments(code, insn, 0, callMth); generateMethodArguments(code, insn, 0, callMth);
code.add(' '); 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 { private void makeInvoke(InvokeNode insn, ICodeWriter code) throws CodegenException {
......
...@@ -58,7 +58,7 @@ public class MethodGen { ...@@ -58,7 +58,7 @@ public class MethodGen {
this.mth = mth; this.mth = mth;
this.classGen = classGen; this.classGen = classGen;
this.annotationGen = classGen.getAnnotationGen(); this.annotationGen = classGen.getAnnotationGen();
this.nameGen = new NameGen(mth, classGen.isFallbackMode()); this.nameGen = new NameGen(mth, classGen);
} }
public ClassGen getClassGen() { public ClassGen getClassGen() {
......
...@@ -53,9 +53,13 @@ public class NameGen { ...@@ -53,9 +53,13 @@ public class NameGen {
"java.lang.Exception", "exc"); "java.lang.Exception", "exc");
} }
public NameGen(MethodNode mth, boolean fallback) { public NameGen(MethodNode mth, ClassGen classGen) {
this.mth = mth; this.mth = mth;
this.fallback = fallback; this.fallback = classGen.isFallbackMode();
NameGen outerNameGen = classGen.getOuterNameGen();
if (outerNameGen != null) {
inheritUsedNames(outerNameGen);
}
addNamesUsedInClass(); 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.
先完成此消息的编辑!
想要评论请 注册