fix: add missing level info for jadx code comments (#2737)
This commit is contained in:
@@ -155,8 +155,6 @@ public class ClassGen {
|
||||
if (Consts.DEBUG_USAGE) {
|
||||
addClassUsageInfo(code, cls);
|
||||
}
|
||||
CodeGenUtils.addErrorsAndComments(code, cls);
|
||||
CodeGenUtils.addSourceFileInfo(code, cls);
|
||||
addClassDeclaration(code);
|
||||
addClassBody(code);
|
||||
}
|
||||
@@ -177,9 +175,13 @@ public class ClassGen {
|
||||
af = af.remove(AccessFlags.STATIC).remove(AccessFlags.PRIVATE);
|
||||
}
|
||||
|
||||
annotationGen.addForClass(clsCode);
|
||||
insertRenameInfo(clsCode, cls);
|
||||
CodeGenUtils.addComments(clsCode, cls);
|
||||
CodeGenUtils.addClassRenamedComment(clsCode, cls);
|
||||
CodeGenUtils.addErrors(clsCode, cls);
|
||||
CodeGenUtils.addSourceFileInfo(clsCode, cls);
|
||||
CodeGenUtils.addInputFileInfo(clsCode, cls);
|
||||
|
||||
annotationGen.addForClass(clsCode);
|
||||
clsCode.startLineWithNum(cls.getSourceLine()).add(af.makeString(cls.checkCommentsLevel(CommentsLevel.INFO)));
|
||||
if (af.isInterface()) {
|
||||
if (af.isAnnotation()) {
|
||||
@@ -434,10 +436,10 @@ public class ClassGen {
|
||||
if (Consts.DEBUG_USAGE) {
|
||||
addFieldUsageInfo(code, f);
|
||||
}
|
||||
CodeGenUtils.addComments(code, f);
|
||||
if (f.getFieldInfo().hasAlias()) {
|
||||
CodeGenUtils.addRenamedComment(code, f, f.getName());
|
||||
}
|
||||
CodeGenUtils.addComments(code, f);
|
||||
annotationGen.addForField(code, f);
|
||||
|
||||
code.startLine(f.getAccessFlags().makeString(f.checkCommentsLevel(CommentsLevel.INFO)));
|
||||
@@ -802,13 +804,6 @@ public class ClassGen {
|
||||
return root.getClsp().isClsKnown(currentPkg + '.' + shortName);
|
||||
}
|
||||
|
||||
private void insertRenameInfo(ICodeWriter code, ClassNode cls) {
|
||||
ClassInfo classInfo = cls.getClassInfo();
|
||||
if (classInfo.hasAlias() && cls.checkCommentsLevel(CommentsLevel.INFO)) {
|
||||
CodeGenUtils.addRenamedComment(code, cls, classInfo.getType().getObject());
|
||||
}
|
||||
}
|
||||
|
||||
private static void addClassUsageInfo(ICodeWriter code, ClassNode cls) {
|
||||
List<ClassNode> deps = cls.getDependencies();
|
||||
code.startLine("// deps - ").add(Integer.toString(deps.size()));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package jadx.core.codegen.utils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -16,6 +17,7 @@ import jadx.core.dex.attributes.nodes.JadxCommentsAttr;
|
||||
import jadx.core.dex.attributes.nodes.JadxError;
|
||||
import jadx.core.dex.attributes.nodes.NotificationAttrNode;
|
||||
import jadx.core.dex.attributes.nodes.RenameReasonAttr;
|
||||
import jadx.core.dex.info.ClassInfo;
|
||||
import jadx.core.dex.instructions.args.CodeVar;
|
||||
import jadx.core.dex.instructions.args.RegisterArg;
|
||||
import jadx.core.dex.instructions.args.SSAVar;
|
||||
@@ -26,8 +28,8 @@ import jadx.core.utils.Utils;
|
||||
public class CodeGenUtils {
|
||||
|
||||
public static void addErrorsAndComments(ICodeWriter code, NotificationAttrNode node) {
|
||||
addErrors(code, node);
|
||||
addComments(code, node);
|
||||
addErrors(code, node);
|
||||
}
|
||||
|
||||
public static void addErrors(ICodeWriter code, NotificationAttrNode node) {
|
||||
@@ -86,9 +88,37 @@ public class CodeGenUtils {
|
||||
} else {
|
||||
code.add(' ');
|
||||
}
|
||||
CommentStyle style = comment.getStyle();
|
||||
addCommentWithStyle(code, comment.getStyle(), comment.getComment());
|
||||
}
|
||||
|
||||
public static void addJadxNodeComment(ICodeWriter code, NotificationAttrNode node,
|
||||
CommentsLevel level, BiConsumer<ICodeWriter, String> commentFunc) {
|
||||
if (node.checkCommentsLevel(level)) {
|
||||
code.startLine();
|
||||
addCommentWithStyle(code, CommentStyle.BLOCK_CONDENSED, (commentCode, newLinePrefix) -> {
|
||||
commentCode.add("JADX ").add(level.name()).add(": ");
|
||||
commentFunc.accept(commentCode, newLinePrefix);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public static void addJadxComment(ICodeWriter code, CommentsLevel level, String commentStr) {
|
||||
code.startLine();
|
||||
addCommentWithStyle(code, CommentStyle.BLOCK_CONDENSED, "JADX " + level.name() + ": " + commentStr);
|
||||
}
|
||||
|
||||
private static void addCommentWithStyle(ICodeWriter code, CommentStyle style, String commentStr) {
|
||||
appendMultiLineString(code, "", style.getStart());
|
||||
appendMultiLineString(code, style.getOnNewLine(), comment.getComment());
|
||||
appendMultiLineString(code, style.getOnNewLine(), commentStr);
|
||||
appendMultiLineString(code, "", style.getEnd());
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert comment with function, use second arg as new line prefix
|
||||
*/
|
||||
private static void addCommentWithStyle(ICodeWriter code, CommentStyle style, BiConsumer<ICodeWriter, String> commentFunc) {
|
||||
appendMultiLineString(code, "", style.getStart());
|
||||
commentFunc.accept(code, style.getOnNewLine());
|
||||
appendMultiLineString(code, "", style.getEnd());
|
||||
}
|
||||
|
||||
@@ -107,16 +137,21 @@ public class CodeGenUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void addClassRenamedComment(ICodeWriter code, ClassNode cls) {
|
||||
ClassInfo classInfo = cls.getClassInfo();
|
||||
if (classInfo.hasAlias()) {
|
||||
addRenamedComment(code, cls, classInfo.getType().getObject());
|
||||
}
|
||||
}
|
||||
|
||||
public static void addRenamedComment(ICodeWriter code, NotificationAttrNode node, String origName) {
|
||||
if (!node.checkCommentsLevel(CommentsLevel.INFO)) {
|
||||
return;
|
||||
}
|
||||
code.startLine("/* renamed from: ").add(origName);
|
||||
RenameReasonAttr renameReasonAttr = node.get(AType.RENAME_REASON);
|
||||
if (renameReasonAttr != null) {
|
||||
code.add(", reason: ").add(renameReasonAttr.getDescription());
|
||||
}
|
||||
code.add(" */");
|
||||
addJadxNodeComment(code, node, CommentsLevel.INFO, (commentCode, newLinePrefix) -> {
|
||||
commentCode.add("renamed from: ").add(origName);
|
||||
RenameReasonAttr renameReasonAttr = node.get(AType.RENAME_REASON);
|
||||
if (renameReasonAttr != null) {
|
||||
commentCode.add(", reason: ").add(renameReasonAttr.getDescription());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void addSourceFileInfo(ICodeWriter code, ClassNode node) {
|
||||
@@ -131,7 +166,7 @@ public class CodeGenUtils {
|
||||
// ignore similar name
|
||||
return;
|
||||
}
|
||||
code.startLine("/* compiled from: ").add(fileName).add(" */");
|
||||
addJadxComment(code, CommentsLevel.INFO, "compiled from: " + fileName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,7 +181,7 @@ public class CodeGenUtils {
|
||||
// don't add same comment for inner classes
|
||||
return;
|
||||
}
|
||||
code.startLine("/* loaded from: ").add(inputFileName).add(" */");
|
||||
addJadxComment(code, CommentsLevel.INFO, "loaded from: " + inputFileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ public class TestRenameOverriddenMethod extends IntegrationTest {
|
||||
assertThat(getClassNode(TestCls.class))
|
||||
.code()
|
||||
.countString(2, "@Override")
|
||||
.countString(3, "/* renamed from: m */")
|
||||
.countString(3, "renamed from: m")
|
||||
.containsOne("void mo0m();")
|
||||
.countString(2, "public void mo0m() {");
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public class TestFieldRenameFormat extends IntegrationTest {
|
||||
.containsOne("private List<String> authors;")
|
||||
.containsLines(1,
|
||||
"",
|
||||
"/* renamed from: c */",
|
||||
"/* JADX INFO: renamed from: c */",
|
||||
"@SerializedName(\"title\")",
|
||||
"private String title;",
|
||||
"");
|
||||
|
||||
@@ -41,7 +41,7 @@ public class TestUsingSourceFileName extends SmaliTest {
|
||||
assertThat(searchCls(loadFromSmaliFiles(), "b"))
|
||||
.code()
|
||||
.containsOne("class C0000b {")
|
||||
.containsOne("/* compiled from: a.java */");
|
||||
.containsOne("compiled from: a.java");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -52,7 +52,7 @@ public class TestUsingSourceFileName extends SmaliTest {
|
||||
assertThat(searchCls(loadFromSmaliFiles(), "b"))
|
||||
.code()
|
||||
.containsOne("class a {")
|
||||
.containsOne("/* compiled from: a.java */");
|
||||
.containsOne("compiled from: a.java");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -63,7 +63,7 @@ public class TestUsingSourceFileName extends SmaliTest {
|
||||
assertThat(searchCls(loadFromSmaliFiles(), "b"))
|
||||
.code()
|
||||
.containsOne("class a {")
|
||||
.containsOne("/* compiled from: a.java */");
|
||||
.containsOne("compiled from: a.java");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -93,7 +93,7 @@ public class TestUsingSourceFileName extends SmaliTest {
|
||||
assertThat(searchCls(loadFromSmaliFiles(), "b"))
|
||||
.code()
|
||||
.containsOne("class C0000b {")
|
||||
.containsOne("/* compiled from: a.java */");
|
||||
.containsOne("compiled from: a.java");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -105,6 +105,6 @@ public class TestUsingSourceFileName extends SmaliTest {
|
||||
assertThat(searchCls(loadFromSmaliFiles(), "b"))
|
||||
.code()
|
||||
.containsOne("class a {")
|
||||
.containsOne("/* compiled from: a.java */");
|
||||
.containsOne("compiled from: a.java");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user