From 43913d47ec91ac89d3763544433d4cfb149af363 Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 24 Dec 2013 22:20:48 +0400 Subject: [PATCH] core: fix method definition --- .../main/java/jadx/core/codegen/ClassGen.java | 11 +++---- .../java/jadx/core/codegen/MethodGen.java | 10 +++---- .../jadx/tests/internal/TestAnnotations.java | 3 ++ .../jadx/tests/internal/TestStaticMethod.java | 30 +++++++++++++++++++ 4 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/TestStaticMethod.java diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index 455a838bf..ae900d288 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -110,6 +110,7 @@ public class ClassGen { } annotationGen.addForClass(clsCode); + insertSourceFileInfo(clsCode, cls); clsCode.startLine(af.makeString()); if (af.isInterface()) { if (af.isAnnotation()) @@ -182,8 +183,6 @@ public class ClassGen { public void makeClassBody(CodeWriter clsCode) throws CodegenException { clsCode.add('{'); - insertSourceFileInfo(clsCode, cls); - CodeWriter mthsCode = makeMethods(clsCode, cls.getMethods()); CodeWriter fieldsCode = makeFields(clsCode, cls, cls.getFields()); clsCode.add(fieldsCode); @@ -242,7 +241,9 @@ public class ClassGen { LOG.error(ErrorsCounter.formatErrorMsg(mth, " Inconsistent code")); mthGen.makeMethodDump(code); } - mthGen.addDefinition(code); + if (mthGen.addDefinition(code)) { + code.add(' '); + } code.add('{'); insertSourceFileInfo(code, mth); code.add(mthGen.makeInstructions(code.getIndent())); @@ -250,7 +251,7 @@ public class ClassGen { } } catch (Throwable e) { String msg = ErrorsCounter.methodError(mth, "Method generation error", e); - code.startLine("/* " + msg + CodeWriter.NL + Utils.getStackTrace(e) + "*/"); + code.startLine("/* " + msg + CodeWriter.NL + Utils.getStackTrace(e) + " */"); } if (it.hasNext()) @@ -424,7 +425,7 @@ public class ClassGen { private void insertSourceFileInfo(CodeWriter code, AttrNode node) { IAttribute sourceFileAttr = node.getAttributes().get(AttributeType.SOURCE_FILE); if (sourceFileAttr != null) { - code.startLine(1, "// compiled from: "); + code.startLine("// compiled from: "); code.add(((SourceFileAttr) sourceFileAttr).getFileName()); } } diff --git a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java index 216667b3e..6d320a076 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java @@ -57,18 +57,17 @@ public class MethodGen { return classGen; } - public void addDefinition(CodeWriter code) { - + public boolean addDefinition(CodeWriter code) { if (mth.getMethodInfo().isClassInit()) { code.startLine("static"); code.attachAnnotation(mth); - return; + return true; } if (mth.getAttributes().contains(AttributeFlag.ANONYMOUS_CONSTRUCTOR)) { // don't add method name and arguments code.startLine(); code.attachAnnotation(mth); - return; + return false; } annotationGen.addForMethod(code, mth); @@ -110,10 +109,11 @@ public class MethodGen { } } code.add(makeArguments(args)); - code.add(") "); + code.add(")"); annotationGen.addThrows(mth, code); code.attachAnnotation(mth); + return true; } public CodeWriter makeArguments(List args) { diff --git a/jadx-core/src/test/java/jadx/tests/internal/TestAnnotations.java b/jadx-core/src/test/java/jadx/tests/internal/TestAnnotations.java index 59d001e12..649ccc3fa 100644 --- a/jadx-core/src/test/java/jadx/tests/internal/TestAnnotations.java +++ b/jadx-core/src/test/java/jadx/tests/internal/TestAnnotations.java @@ -57,5 +57,8 @@ public class TestAnnotations extends InternalJadxTest { assertThat(code, containsString("@A(a = -11253)")); assertThat(code, containsString("@V(false)")); assertThat(code, not(containsString("@D()"))); + + assertThat(code, containsString("int a();")); + assertThat(code, containsString("float value() default 1.1f;")); } } diff --git a/jadx-core/src/test/java/jadx/tests/internal/TestStaticMethod.java b/jadx-core/src/test/java/jadx/tests/internal/TestStaticMethod.java new file mode 100644 index 000000000..2f2f99139 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/TestStaticMethod.java @@ -0,0 +1,30 @@ +package jadx.tests.internal; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + +public class TestStaticMethod extends InternalJadxTest { + + public static class TestCls { + static { + f(); + } + + private static void f() { + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("static {")); + assertThat(code, containsString("private static void f() {")); + } +}