Search in sources :

Example 1 with JadxNodeRef

use of jadx.api.data.impl.JadxNodeRef in project jadx by skylot.

the class TestCodeCommentsMultiline method test.

@Test
public void test() {
    printOffsets();
    String baseClsId = TestCls.class.getName();
    JadxNodeRef mthRef = new JadxNodeRef(RefType.METHOD, baseClsId, "test(Z)I");
    IJavaCodeRef insnRef = JadxCodeRef.forInsn(isJavaInput() ? 15 : 11);
    ICodeComment insnComment = new JadxCodeComment(mthRef, insnRef, "multi\nline\ncomment");
    JadxCodeData codeData = new JadxCodeData();
    codeData.setComments(Collections.singletonList(insnComment));
    getArgs().setCodeData(codeData);
    assertThat(getClassNode(TestCls.class)).code().containsOne("// multi").containsOne("// line").containsOne("// comment");
}
Also used : ICodeComment(jadx.api.data.ICodeComment) JadxCodeComment(jadx.api.data.impl.JadxCodeComment) IJavaCodeRef(jadx.api.data.IJavaCodeRef) JadxNodeRef(jadx.api.data.impl.JadxNodeRef) JadxCodeData(jadx.api.data.impl.JadxCodeData) Test(org.junit.jupiter.api.Test) IntegrationTest(jadx.tests.api.IntegrationTest)

Example 2 with JadxNodeRef

use of jadx.api.data.impl.JadxNodeRef in project jadx by skylot.

the class TestCodeComments method test.

@Test
public void test() {
    String baseClsId = TestCls.class.getName();
    ICodeComment clsComment = new JadxCodeComment(JadxNodeRef.forCls(baseClsId), "class comment");
    ICodeComment innerClsComment = new JadxCodeComment(JadxNodeRef.forCls(baseClsId + "$A"), "inner class comment");
    ICodeComment fldComment = new JadxCodeComment(new JadxNodeRef(RefType.FIELD, baseClsId, "intField:I"), "field comment");
    JadxNodeRef mthRef = new JadxNodeRef(RefType.METHOD, baseClsId, "test()I");
    ICodeComment mthComment = new JadxCodeComment(mthRef, "method comment");
    IJavaCodeRef insnRef = JadxCodeRef.forInsn(isJavaInput() ? 13 : 11);
    ICodeComment insnComment = new JadxCodeComment(mthRef, insnRef, "insn comment");
    JadxCodeData codeData = new JadxCodeData();
    getArgs().setCodeData(codeData);
    codeData.setComments(Arrays.asList(clsComment, innerClsComment, fldComment, mthComment, insnComment));
    ClassNode cls = getClassNode(TestCls.class);
    assertThat(cls).decompile().checkCodeOffsets().code().containsOne("// class comment").containsOne("// inner class comment").containsOne("// field comment").containsOne("// method comment").containsOne("System.out.println(\"comment\"); // insn comment");
    String code = cls.getCode().getCodeStr();
    assertThat(cls).reloadCode(this).isEqualTo(code);
    ICodeComment updInsnComment = new JadxCodeComment(mthRef, insnRef, "updated insn comment");
    codeData.setComments(Collections.singletonList(updInsnComment));
    jadxDecompiler.reloadCodeData();
    assertThat(cls).reloadCode(this).containsOne("System.out.println(\"comment\"); // updated insn comment").doesNotContain("class comment").containsOne(" comment");
}
Also used : ClassNode(jadx.core.dex.nodes.ClassNode) ICodeComment(jadx.api.data.ICodeComment) JadxCodeComment(jadx.api.data.impl.JadxCodeComment) IJavaCodeRef(jadx.api.data.IJavaCodeRef) JadxNodeRef(jadx.api.data.impl.JadxNodeRef) JadxCodeData(jadx.api.data.impl.JadxCodeData) Test(org.junit.jupiter.api.Test) IntegrationTest(jadx.tests.api.IntegrationTest)

Example 3 with JadxNodeRef

use of jadx.api.data.impl.JadxNodeRef in project jadx by skylot.

the class TestCodeCommentsOverride method test.

@Test
public void test() {
    String baseClsId = TestCls.class.getName();
    JadxNodeRef iMthRef = new JadxNodeRef(RefType.METHOD, baseClsId + "$I", "mth()V");
    ICodeComment iMthComment = new JadxCodeComment(iMthRef, "interface mth comment");
    JadxNodeRef mthRef = new JadxNodeRef(RefType.METHOD, baseClsId + "$A", "mth()V");
    ICodeComment mthComment = new JadxCodeComment(mthRef, "mth comment");
    JadxCodeData codeData = new JadxCodeData();
    codeData.setComments(Arrays.asList(iMthComment, mthComment));
    getArgs().setCodeData(codeData);
    ClassNode cls = getClassNode(TestCls.class);
    assertThat(cls).decompile().checkCodeOffsets().code().containsOne("@Override").containsOne("// " + iMthComment.getComment()).containsOne("// " + mthComment.getComment());
    assertThat(cls).reloadCode(this).containsOne("@Override").containsOne("// " + iMthComment.getComment()).containsOne("// " + mthComment.getComment());
}
Also used : ClassNode(jadx.core.dex.nodes.ClassNode) ICodeComment(jadx.api.data.ICodeComment) JadxCodeComment(jadx.api.data.impl.JadxCodeComment) JadxNodeRef(jadx.api.data.impl.JadxNodeRef) JadxCodeData(jadx.api.data.impl.JadxCodeData) Test(org.junit.jupiter.api.Test) IntegrationTest(jadx.tests.api.IntegrationTest)

Example 4 with JadxNodeRef

use of jadx.api.data.impl.JadxNodeRef in project jadx by skylot.

the class CommentAction method getCommentRef.

/**
 * Check if possible insert comment at current line.
 *
 * @return blank code comment object (comment string empty)
 */
@Nullable
private ICodeComment getCommentRef(int line) {
    if (line == -1 || this.topCls == null) {
        return null;
    }
    try {
        // TODO: cache and update on class refresh
        CodeLinesInfo linesInfo = new CodeLinesInfo(topCls, true);
        // add comment if node definition at this line
        JavaNode nodeAtLine = linesInfo.getDefAtLine(line);
        if (nodeAtLine != null) {
            // at node definition -> add comment for it
            JadxNodeRef nodeRef = JadxNodeRef.forJavaNode(nodeAtLine);
            return new JadxCodeComment(nodeRef, "");
        }
        Object ann = topCls.getAnnotationAt(new CodePosition(line));
        if (ann == null) {
            // check if line with comment above node definition
            try {
                JavaNode defNode = linesInfo.getJavaNodeBelowLine(line);
                if (defNode != null) {
                    String lineStr = codeArea.getLineText(line).trim();
                    if (lineStr.startsWith("//")) {
                        return new JadxCodeComment(JadxNodeRef.forJavaNode(defNode), "");
                    }
                }
            } catch (Exception e) {
                LOG.error("Failed to check comment line: " + line, e);
            }
            return null;
        }
        // try to add method line comment
        JavaNode node = linesInfo.getJavaNodeByLine(line);
        if (node instanceof JavaMethod) {
            JadxNodeRef nodeRef = JadxNodeRef.forMth((JavaMethod) node);
            if (ann instanceof InsnCodeOffset) {
                int rawOffset = ((InsnCodeOffset) ann).getOffset();
                return new JadxCodeComment(nodeRef, JadxCodeRef.forInsn(rawOffset), "");
            }
        }
    } catch (Exception e) {
        LOG.error("Failed to add comment at line: " + line, e);
    }
    return null;
}
Also used : CodePosition(jadx.api.CodePosition) JavaMethod(jadx.api.JavaMethod) InsnCodeOffset(jadx.api.data.annotations.InsnCodeOffset) JadxCodeComment(jadx.api.data.impl.JadxCodeComment) CodeLinesInfo(jadx.gui.utils.CodeLinesInfo) JadxNodeRef(jadx.api.data.impl.JadxNodeRef) JavaNode(jadx.api.JavaNode) Nullable(org.jetbrains.annotations.Nullable)

Example 5 with JadxNodeRef

use of jadx.api.data.impl.JadxNodeRef in project jadx by skylot.

the class TestUserRenames method test.

@Test
public void test() {
    getArgs().setDeobfuscationOn(false);
    List<ICodeRename> renames = new ArrayList<>();
    String baseClsId = TestCls.class.getName();
    renames.add(new JadxCodeRename(JadxNodeRef.forPkg("jadx.tests"), "renamedPkgTests"));
    renames.add(new JadxCodeRename(JadxNodeRef.forPkg("jadx.tests.integration.rename"), "renamedPkgRename"));
    renames.add(new JadxCodeRename(JadxNodeRef.forCls(baseClsId), "RenamedTestCls"));
    renames.add(new JadxCodeRename(JadxNodeRef.forCls(baseClsId + "$A"), "RenamedInnerCls"));
    renames.add(new JadxCodeRename(new JadxNodeRef(RefType.FIELD, baseClsId, "intField:I"), "renamedField"));
    JadxNodeRef mthRef = new JadxNodeRef(RefType.METHOD, baseClsId, "test(I)I");
    renames.add(new JadxCodeRename(mthRef, "renamedTestMth"));
    renames.add(new JadxCodeRename(mthRef, new JadxCodeRef(CodeRefType.MTH_ARG, 0), "renamedX"));
    JadxCodeRef varDeclareRef = isJavaInput() ? JadxCodeRef.forVar(0, 1) : JadxCodeRef.forVar(0, 0);
    renames.add(new JadxCodeRename(mthRef, varDeclareRef, "renamedY"));
    IJavaCodeRef varUseRef = isJavaInput() ? JadxCodeRef.forVar(0, 4) : JadxCodeRef.forVar(1, 0);
    renames.add(new JadxCodeRename(mthRef, varUseRef, "renamedZ"));
    JadxCodeData codeData = new JadxCodeData();
    codeData.setRenames(renames);
    getArgs().setCodeData(codeData);
    ClassNode cls = getClassNode(TestCls.class);
    assertThat(cls).decompile().checkCodeOffsets().code().containsOne("package jadx.renamedPkgTests.integration.renamedPkgRename;").containsOne("public class RenamedTestCls {").containsOne("private int renamedField").containsOne("public static class RenamedInnerCls {").containsOne("public int renamedTestMth(int renamedX) {").containsOne("int renamedY = renamedX + \"test\".length();").containsOne("int renamedZ = renamedY + 1;").containsOne("return renamedZ;");
    String code = cls.getCode().getCodeStr();
    assertThat(cls).reloadCode(this).isEqualTo(code);
    ICodeRename updVarRename = new JadxCodeRename(mthRef, varUseRef, "anotherZ");
    codeData.setRenames(Collections.singletonList(updVarRename));
    jadxDecompiler.reloadCodeData();
    assertThat(cls).reloadCode(this).containsOne("int anotherZ = y + 1;").doesNotContain("int z").doesNotContain("int renamedZ");
}
Also used : ClassNode(jadx.core.dex.nodes.ClassNode) ICodeRename(jadx.api.data.ICodeRename) ArrayList(java.util.ArrayList) JadxCodeRef(jadx.api.data.impl.JadxCodeRef) IJavaCodeRef(jadx.api.data.IJavaCodeRef) JadxNodeRef(jadx.api.data.impl.JadxNodeRef) JadxCodeData(jadx.api.data.impl.JadxCodeData) JadxCodeRename(jadx.api.data.impl.JadxCodeRename) Test(org.junit.jupiter.api.Test) IntegrationTest(jadx.tests.api.IntegrationTest)

Aggregations

JadxNodeRef (jadx.api.data.impl.JadxNodeRef)7 JadxCodeComment (jadx.api.data.impl.JadxCodeComment)6 JadxCodeData (jadx.api.data.impl.JadxCodeData)6 IntegrationTest (jadx.tests.api.IntegrationTest)6 Test (org.junit.jupiter.api.Test)6 ICodeComment (jadx.api.data.ICodeComment)5 IJavaCodeRef (jadx.api.data.IJavaCodeRef)5 ClassNode (jadx.core.dex.nodes.ClassNode)3 CodePosition (jadx.api.CodePosition)1 JavaMethod (jadx.api.JavaMethod)1 JavaNode (jadx.api.JavaNode)1 ICodeRename (jadx.api.data.ICodeRename)1 InsnCodeOffset (jadx.api.data.annotations.InsnCodeOffset)1 JadxCodeRef (jadx.api.data.impl.JadxCodeRef)1 JadxCodeRename (jadx.api.data.impl.JadxCodeRename)1 CodeLinesInfo (jadx.gui.utils.CodeLinesInfo)1 ArrayList (java.util.ArrayList)1 Nullable (org.jetbrains.annotations.Nullable)1