Commit 5f11f12d authored by Skylot's avatar Skylot

core: remove redundant spaces for enums

parent 2d189505
...@@ -44,7 +44,7 @@ public class ClassGen { ...@@ -44,7 +44,7 @@ public class ClassGen {
private final boolean fallback; private final boolean fallback;
private final Set<ClassInfo> imports = new HashSet<ClassInfo>(); private final Set<ClassInfo> imports = new HashSet<ClassInfo>();
private int clsDeclLine = 0; private int clsDeclLine;
public ClassGen(ClassNode cls, ClassGen parentClsGen, boolean fallback) { public ClassGen(ClassNode cls, ClassGen parentClsGen, boolean fallback) {
this.cls = cls; this.cls = cls;
...@@ -103,7 +103,9 @@ public class ClassGen { ...@@ -103,7 +103,9 @@ public class ClassGen {
if (af.isInterface()) { if (af.isInterface()) {
af = af.remove(AccessFlags.ACC_ABSTRACT); af = af.remove(AccessFlags.ACC_ABSTRACT);
} else if (af.isEnum()) { } else if (af.isEnum()) {
af = af.remove(AccessFlags.ACC_FINAL).remove(AccessFlags.ACC_ABSTRACT); af = af.remove(AccessFlags.ACC_FINAL)
.remove(AccessFlags.ACC_ABSTRACT)
.remove(AccessFlags.ACC_STATIC);
} }
annotationGen.addForClass(clsCode); annotationGen.addForClass(clsCode);
...@@ -203,29 +205,50 @@ public class ClassGen { ...@@ -203,29 +205,50 @@ public class ClassGen {
private void addInnerClasses(CodeWriter code, ClassNode cls) throws CodegenException { private void addInnerClasses(CodeWriter code, ClassNode cls) throws CodegenException {
for (ClassNode innerCls : cls.getInnerClasses()) { for (ClassNode innerCls : cls.getInnerClasses()) {
if (innerCls.contains(AFlag.DONT_GENERATE)
|| innerCls.isAnonymous()) {
continue;
}
ClassGen inClGen = new ClassGen(innerCls, getParentGen(), fallback);
code.newLine();
inClGen.addClassCode(code);
imports.addAll(inClGen.getImports());
}
}
private boolean isInnerClassesPresents() {
for (ClassNode innerCls : cls.getInnerClasses()) {
if (!innerCls.isAnonymous()) { if (!innerCls.isAnonymous()) {
ClassGen inClGen = new ClassGen(innerCls, getParentGen(), fallback); return true;
code.newLine();
inClGen.addClassCode(code);
imports.addAll(inClGen.getImports());
} }
} }
return false;
} }
private void addMethods(CodeWriter code) { private void addMethods(CodeWriter code) {
for (MethodNode mth : cls.getMethods()) { for (MethodNode mth : cls.getMethods()) {
if (mth.contains(AFlag.DONT_GENERATE)) {
continue;
}
if (code.getLine() != clsDeclLine) {
code.newLine();
}
try {
addMethod(code, mth);
} catch (Exception e) {
String msg = ErrorsCounter.methodError(mth, "Method generation error", e);
code.startLine("/* " + msg + CodeWriter.NL + Utils.getStackTrace(e) + " */");
}
}
}
private boolean isMethodsPresents() {
for (MethodNode mth : cls.getMethods()) {
if (!mth.contains(AFlag.DONT_GENERATE)) { if (!mth.contains(AFlag.DONT_GENERATE)) {
try { return true;
if (code.getLine() != clsDeclLine) {
code.newLine();
}
addMethod(code, mth);
} catch (Exception e) {
String msg = ErrorsCounter.methodError(mth, "Method generation error", e);
code.startLine("/* " + msg + CodeWriter.NL + Utils.getStackTrace(e) + " */");
}
} }
} }
return false;
} }
private void addMethod(CodeWriter code, MethodNode mth) throws CodegenException { private void addMethod(CodeWriter code, MethodNode mth) throws CodegenException {
...@@ -284,6 +307,15 @@ public class ClassGen { ...@@ -284,6 +307,15 @@ public class ClassGen {
} }
} }
private boolean isFieldsPresents() {
for (FieldNode field : cls.getFields()) {
if (!field.contains(AFlag.DONT_GENERATE)) {
return true;
}
}
return false;
}
private void addEnumFields(CodeWriter code) throws CodegenException { private void addEnumFields(CodeWriter code) throws CodegenException {
EnumClassAttr enumFields = cls.get(AType.ENUM_CLASS); EnumClassAttr enumFields = cls.get(AType.ENUM_CLASS);
if (enumFields == null) { if (enumFields == null) {
...@@ -310,21 +342,23 @@ public class ClassGen { ...@@ -310,21 +342,23 @@ public class ClassGen {
code.add(')'); code.add(')');
} }
if (f.getCls() != null) { if (f.getCls() != null) {
code.add(' ');
new ClassGen(f.getCls(), this, fallback).addClassBody(code); new ClassGen(f.getCls(), this, fallback).addClassBody(code);
} }
if (it.hasNext()) { if (it.hasNext()) {
code.add(','); code.add(',');
} }
} }
if (enumFields.getFields().isEmpty()) { if (isMethodsPresents() || isFieldsPresents() || isInnerClassesPresents()) {
code.startLine(); if (enumFields.getFields().isEmpty()) {
code.startLine();
}
code.add(';');
} }
code.add(';');
code.newLine();
} }
public void useType(CodeWriter code, ArgType type) { public void useType(CodeWriter code, ArgType type) {
final PrimitiveType stype = type.getPrimitiveType(); PrimitiveType stype = type.getPrimitiveType();
if (stype == null) { if (stype == null) {
code.add(type.toString()); code.add(type.toString());
} else if (stype == PrimitiveType.OBJECT) { } else if (stype == PrimitiveType.OBJECT) {
......
package jadx.tests.internal.enums;
import jadx.api.InternalJadxTest;
import jadx.core.dex.nodes.ClassNode;
import org.junit.Test;
import static jadx.tests.utils.JadxMatchers.containsLines;
import static org.junit.Assert.assertThat;
public class TestEnums extends InternalJadxTest {
public static class TestCls {
public enum EmptyEnum {
}
public enum EmptyEnum2 {
;
public static void mth() {
}
}
public enum Direction {
NORTH,
SOUTH,
EAST,
WEST
}
public enum Singleton {
INSTANCE;
public String test() {
return "";
}
}
}
@Test
public void test() {
ClassNode cls = getClassNode(TestCls.class);
String code = cls.getCode().toString();
System.out.println(code);
assertThat(code, containsLines(1, "public enum EmptyEnum {", "}"));
assertThat(code, containsLines(1,
"public enum EmptyEnum2 {",
indent(1) + ";",
"",
indent(1) + "public static void mth() {",
indent(1) + "}",
"}"));
assertThat(code, containsLines(1, "public enum Direction {",
indent(1) + "NORTH,",
indent(1) + "SOUTH,",
indent(1) + "EAST,",
indent(1) + "WEST",
"}"));
assertThat(code, containsLines(1, "public enum Singleton {",
indent(1) + "INSTANCE;",
"",
indent(1) + "public String test() {",
indent(2) + "return \"\";",
indent(1) + "}",
"}"));
}
}
package jadx.tests.internal.enums;
import jadx.api.InternalJadxTest;
import jadx.core.dex.nodes.ClassNode;
import jadx.tests.utils.JadxMatchers;
import org.junit.Test;
import static org.junit.Assert.assertThat;
public class TestEnums2 extends InternalJadxTest {
public static class TestCls {
public enum Operation {
PLUS {
int apply(int x, int y) {
return x + y;
}
},
MINUS {
int apply(int x, int y) {
return x - y;
}
};
abstract int apply(int x, int y);
}
}
@Test
public void test() {
ClassNode cls = getClassNode(TestCls.class);
String code = cls.getCode().toString();
System.out.println(code);
assertThat(code, JadxMatchers.containsLines(1,
"public enum Operation {",
indent(1) + "PLUS {",
indent(2) + "int apply(int x, int y) {",
indent(3) + "return x + y;",
indent(2) + "}",
indent(1) + "},",
indent(1) + "MINUS {",
indent(2) + "int apply(int x, int y) {",
indent(3) + "return x - y;",
indent(2) + "}",
indent(1) + "};",
"",
indent(1) + "abstract int apply(int i, int i2);",
"}"
));
}
}
package jadx.tests.utils; package jadx.tests.utils;
import jadx.api.TestUtils;
import org.hamcrest.Description;
import org.hamcrest.core.SubstringMatcher; import org.hamcrest.core.SubstringMatcher;
public class CountString extends SubstringMatcher { public class CountString extends SubstringMatcher {
...@@ -13,21 +16,21 @@ public class CountString extends SubstringMatcher { ...@@ -13,21 +16,21 @@ public class CountString extends SubstringMatcher {
@Override @Override
protected boolean evalSubstringOf(String string) { protected boolean evalSubstringOf(String string) {
return this.count == countStr(string, substring); return this.count == count(string);
} }
@Override @Override
protected String relationship() { protected String relationship() {
return "containing " + count + " occurrence of"; return "containing <" + count + "> occurrence of";
}
@Override
public void describeMismatchSafely(String item, Description mismatchDescription) {
mismatchDescription.appendText("found ").appendValue(count(item))
.appendText(" in \"").appendText(item).appendText("\"");
} }
private static int countStr(String string, String substring) { private int count(String string) {
int cnt = 0; return TestUtils.count(string, substring);
int idx = 0;
while ((idx = string.indexOf(substring, idx)) != -1) {
idx++;
cnt++;
}
return cnt;
} }
} }
package jadx.tests.utils; package jadx.tests.utils;
import jadx.api.TestUtils;
import jadx.core.codegen.CodeWriter;
import org.hamcrest.Matcher; import org.hamcrest.Matcher;
public class JadxMatchers { public class JadxMatchers {
...@@ -9,6 +12,27 @@ public class JadxMatchers { ...@@ -9,6 +12,27 @@ public class JadxMatchers {
} }
public static Matcher<String> containsOne(String substring) { public static Matcher<String> containsOne(String substring) {
return new CountString(1, substring); return countString(1, substring);
}
public static Matcher<String> containsLines(String... lines) {
StringBuilder sb = new StringBuilder();
for (String line : lines) {
sb.append(line).append(CodeWriter.NL);
}
return countString(1, sb.toString());
}
public static Matcher<String> containsLines(int commonIndent, String... lines) {
String indent = TestUtils.indent(commonIndent);
StringBuilder sb = new StringBuilder();
for (String line : lines) {
if (!line.isEmpty()) {
sb.append(indent);
sb.append(line);
}
sb.append(CodeWriter.NL);
}
return countString(1, sb.toString());
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment