From 1f1efb0e17df1d76fa0970b4f4fa09ccc19d9524 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 29 May 2021 19:46:25 +0100 Subject: [PATCH] fix: allow local variables have name same as instance fields (#1183) --- .../main/java/jadx/core/codegen/NameGen.java | 4 +- .../names/TestConstructorArgNames.java | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/names/TestConstructorArgNames.java diff --git a/jadx-core/src/main/java/jadx/core/codegen/NameGen.java b/jadx-core/src/main/java/jadx/core/codegen/NameGen.java index 12f684ab5..e9834f93b 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/NameGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/NameGen.java @@ -70,7 +70,9 @@ public class NameGen { private void addNamesUsedInClass() { ClassNode parentClass = mth.getParentClass(); for (FieldNode field : parentClass.getFields()) { - varNames.add(field.getAlias()); + if (field.isStatic()) { + varNames.add(field.getAlias()); + } } for (ClassNode innerClass : parentClass.getInnerClasses()) { varNames.add(innerClass.getClassInfo().getAliasShortName()); diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestConstructorArgNames.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestConstructorArgNames.java new file mode 100644 index 000000000..9b2172cb8 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestConstructorArgNames.java @@ -0,0 +1,41 @@ +package jadx.tests.integration.names; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestConstructorArgNames extends IntegrationTest { + + @SuppressWarnings({ "FieldCanBeLocal", "FieldMayBeFinal", "StaticVariableName", "ParameterName" }) + public static class TestCls { + private static String STR = "static field"; + private final String str; + private final String store; + + public TestCls(String str, String STR) { + this.str = str; + this.store = STR; + } + + public TestCls() { + this.str = "a"; + this.store = STR; + } + + public void check() { + assertThat(new TestCls("a", "b").store).isEqualTo("b"); + assertThat(new TestCls().store).isEqualTo(STR); + } + } + + @Test + public void test() { + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne("this.str = str;") + .containsOne("this.store = STR2;") + .containsOne("this.store = STR;"); + } +}