diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 9b6bf96a2..419e112cf 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -4,6 +4,8 @@ plugins { dependencies { implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.10") + + implementation("org.openrewrite:plugin:6.19.1") } repositories { diff --git a/buildSrc/src/main/kotlin/jadx-java.gradle.kts b/buildSrc/src/main/kotlin/jadx-java.gradle.kts index 61b34a192..c2c4e49e7 100644 --- a/buildSrc/src/main/kotlin/jadx-java.gradle.kts +++ b/buildSrc/src/main/kotlin/jadx-java.gradle.kts @@ -3,6 +3,8 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat plugins { java checkstyle + + id("jadx-rewrite") } val jadxVersion: String by rootProject.extra @@ -11,7 +13,7 @@ group = "io.github.skylot" version = jadxVersion dependencies { - implementation("org.slf4j:slf4j-api:2.0.14") + implementation("org.slf4j:slf4j-api:2.0.16") compileOnly("org.jetbrains:annotations:24.1.0") testImplementation("ch.qos.logback:logback-classic:1.5.6") diff --git a/buildSrc/src/main/kotlin/jadx-rewrite.gradle.kts b/buildSrc/src/main/kotlin/jadx-rewrite.gradle.kts new file mode 100644 index 000000000..1fa5c1e91 --- /dev/null +++ b/buildSrc/src/main/kotlin/jadx-rewrite.gradle.kts @@ -0,0 +1,37 @@ +import org.gradle.api.tasks.testing.logging.TestExceptionFormat + +plugins { + id("org.openrewrite.rewrite") +} + +repositories { + mavenCentral() +} + +dependencies { + rewrite("org.openrewrite.recipe:rewrite-testing-frameworks:2.15.0") + rewrite("org.openrewrite.recipe:rewrite-logging-frameworks:2.12.0") + rewrite("org.openrewrite.recipe:rewrite-migrate-java:2.21.0") + rewrite("org.openrewrite.recipe:rewrite-static-analysis:1.13.0") +} + +tasks { + rewrite { + // exclusion("src/test/java/jadx/tests/integration") + + // activeRecipe("org.openrewrite.java.migrate.Java8toJava11") + + // checkstyle auto fix + // activeRecipe("org.openrewrite.staticanalysis.CodeCleanup") + // setCheckstyleConfigFile(file("$rootDir/config/checkstyle/checkstyle.xml")) + + // logging + // activeRecipe("org.openrewrite.java.logging.slf4j.Slf4jBestPractices") + // activeRecipe("org.openrewrite.java.logging.slf4j.LoggersNamedForEnclosingClass") + // activeRecipe("org.openrewrite.java.logging.slf4j.ParameterizedLogging") + // activeRecipe("org.openrewrite.java.logging.PrintStackTraceToLogError") + + // testing + activeRecipe("org.openrewrite.java.testing.assertj.Assertj") + } +} diff --git a/jadx-core/src/main/java/jadx/api/impl/AnnotatedCodeWriter.java b/jadx-core/src/main/java/jadx/api/impl/AnnotatedCodeWriter.java index ca1a6ddad..79b79042d 100644 --- a/jadx-core/src/main/java/jadx/api/impl/AnnotatedCodeWriter.java +++ b/jadx-core/src/main/java/jadx/api/impl/AnnotatedCodeWriter.java @@ -62,7 +62,7 @@ public class AnnotatedCodeWriter extends SimpleCodeWriter implements ICodeWriter buf.append(cw.getCodeStr()); return this; } - AnnotatedCodeWriter code = ((AnnotatedCodeWriter) cw); + AnnotatedCodeWriter code = (AnnotatedCodeWriter) cw; line--; int startPos = getLength(); for (Map.Entry entry : code.annotations.entrySet()) { diff --git a/jadx-core/src/main/java/jadx/core/clsp/ClspClass.java b/jadx-core/src/main/java/jadx/core/clsp/ClspClass.java index 4cfb344e8..892f1b167 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/ClspClass.java +++ b/jadx-core/src/main/java/jadx/core/clsp/ClspClass.java @@ -24,7 +24,7 @@ public class ClspClass { private Map methodsMap = Collections.emptyMap(); private List typeParameters = Collections.emptyList(); - private ClspClassSource source; + private final ClspClassSource source; public ClspClass(ArgType clsType, int id, int accFlags, ClspClassSource source) { this.clsType = clsType; diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxCommentsAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxCommentsAttr.java index 613bc7d4a..08894b710 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxCommentsAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxCommentsAttr.java @@ -33,7 +33,7 @@ public class JadxCommentsAttr implements IJadxAttribute { private final Map> comments = new EnumMap<>(CommentsLevel.class); public void add(CommentsLevel level, String comment) { - comments.computeIfAbsent(level, (l) -> new ArrayList<>()).add(comment); + comments.computeIfAbsent(level, l -> new ArrayList<>()).add(comment); } public List formatAndFilter(CommentsLevel level) { diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/MethodOverrideAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/MethodOverrideAttr.java index 82b840f15..366190210 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/MethodOverrideAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/MethodOverrideAttr.java @@ -14,14 +14,14 @@ public class MethodOverrideAttr extends PinnedAttribute { /** * All methods overridden by current method. Current method excluded, empty for base method. */ - private List overrideList; + private final List overrideList; /** * All method nodes from override hierarchy. Current method included. */ private SortedSet relatedMthNodes; - private Set baseMethods; + private final Set baseMethods; public MethodOverrideAttr(List overrideList, SortedSet relatedMthNodes, Set baseMethods) { this.overrideList = overrideList; diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/utils/MethodUtils.java b/jadx-core/src/main/java/jadx/core/dex/nodes/utils/MethodUtils.java index 1603ce9e7..3e21681f3 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/utils/MethodUtils.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/utils/MethodUtils.java @@ -51,7 +51,7 @@ public class MethodUtils { public MethodNode resolveMethod(BaseInvokeNode invokeNode) { IMethodDetails methodDetails = getMethodDetails(invokeNode); if (methodDetails instanceof MethodNode) { - return ((MethodNode) methodDetails); + return (MethodNode) methodDetails; } return null; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstructorVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstructorVisitor.java index 8e382c3c7..a520d5b59 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstructorVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstructorVisitor.java @@ -69,7 +69,7 @@ public class ConstructorVisitor extends AbstractVisitor { } co.inheritMetadata(inv); - RegisterArg instanceArg = ((RegisterArg) inv.getArg(0)); + RegisterArg instanceArg = (RegisterArg) inv.getArg(0); instanceArg.getSVar().removeUse(instanceArg); if (co.isNewInstance()) { InsnNode assignInsn = instanceArg.getAssignInsn(); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/MethodInvokeVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/MethodInvokeVisitor.java index 9ac0ed9f2..2b681d211 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/MethodInvokeVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/MethodInvokeVisitor.java @@ -187,7 +187,7 @@ public class MethodInvokeVisitor extends AbstractVisitor { arg.setType(castType); arg.add(AFlag.EXPLICIT_PRIMITIVE_TYPE); } else if (InsnUtils.isWrapped(arg, InsnType.CHECK_CAST)) { - IndexInsnNode wrapInsn = ((IndexInsnNode) ((InsnWrapArg) arg).getWrapInsn()); + IndexInsnNode wrapInsn = (IndexInsnNode) ((InsnWrapArg) arg).getWrapInsn(); wrapInsn.updateIndex(castType); } else { if (Consts.DEBUG_TYPE_INFERENCE) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ShadowFieldVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ShadowFieldVisitor.java index 0745263cc..1de667bd5 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ShadowFieldVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ShadowFieldVisitor.java @@ -165,7 +165,7 @@ public class ShadowFieldVisitor extends AbstractVisitor { switch (insn.getType()) { case IPUT: case IGET: - return ((FieldInfo) ((IndexInsnNode) insn).getIndex()); + return (FieldInfo) ((IndexInsnNode) insn).getIndex(); default: return null; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java index abdabfe5d..fe79be966 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java @@ -233,7 +233,7 @@ public class RegionMaker { BlockNode out; if (loopRegion.isConditionAtEnd()) { BlockNode thenBlock = condInfo.getThenBlock(); - out = (thenBlock == loop.getEnd() || thenBlock == loopStart) ? condInfo.getElseBlock() : thenBlock; + out = thenBlock == loop.getEnd() || thenBlock == loopStart ? condInfo.getElseBlock() : thenBlock; out = BlockUtils.followEmptyPath(out); loopStart.remove(AType.LOOP); loop.getEnd().add(AFlag.ADDED_TO_REGION); @@ -351,7 +351,7 @@ public class RegionMaker { return true; } Optional mainEdgeOpt = exitEdges.stream().filter(edge -> edge.getSource() == mainExitBlock).findFirst(); - if (!mainEdgeOpt.isPresent()) { + if (mainEdgeOpt.isEmpty()) { throw new JadxRuntimeException("Not found exit edge by exit block: " + mainExitBlock); } Edge mainExitEdge = mainEdgeOpt.get(); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundFieldGetAssign.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundFieldGetAssign.java index 9d29429f3..81d7dc12b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundFieldGetAssign.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundFieldGetAssign.java @@ -20,7 +20,7 @@ public final class TypeBoundFieldGetAssign implements ITypeBoundDynamic { public TypeBoundFieldGetAssign(RootNode root, IndexInsnNode getNode, ArgType initType) { this.root = root; this.getNode = getNode; - this.fieldInfo = ((FieldInfo) getNode.getIndex()); + this.fieldInfo = (FieldInfo) getNode.getIndex(); this.initType = initType; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/usage/UsageInfoVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/usage/UsageInfoVisitor.java index 86b45b312..09be82d44 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/usage/UsageInfoVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/usage/UsageInfoVisitor.java @@ -142,7 +142,7 @@ public class UsageInfoVisitor extends AbstractVisitor { IMethodRef mthRef; ICustomPayload payload = insnData.getPayload(); if (payload != null) { - mthRef = ((IMethodRef) payload); + mthRef = (IMethodRef) payload; } else { mthRef = insnData.getIndexAsMethod(); } diff --git a/jadx-core/src/main/java/jadx/core/utils/input/InsnDataUtils.java b/jadx-core/src/main/java/jadx/core/utils/input/InsnDataUtils.java index ccc2b5afc..9db1c6526 100644 --- a/jadx-core/src/main/java/jadx/core/utils/input/InsnDataUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/input/InsnDataUtils.java @@ -22,7 +22,7 @@ public class InsnDataUtils { } ICustomPayload payload = insnData.getPayload(); if (payload != null) { - return ((ICallSite) payload); + return (ICallSite) payload; } return insnData.getIndexAsCallSite(); } @@ -34,7 +34,7 @@ public class InsnDataUtils { } ICustomPayload payload = insnData.getPayload(); if (payload != null) { - return ((IMethodRef) payload); + return (IMethodRef) payload; } return insnData.getIndexAsMethod(); } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java index dd6049c1a..08bf4d174 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java @@ -273,7 +273,7 @@ public class ResTableBinaryParser extends CommonBinaryParser implements IResTabl // to the value of the type bits in a resource identifier). 0 is invalid. int id = is.readInt8(); int flags = is.readInt8(); // 0 or 1 - boolean flagSparse = (flags == 1); + boolean flagSparse = flags == 1; is.checkInt16(0, "type chunk, reserved"); int entryCount = is.readInt32(); diff --git a/jadx-core/src/test/java/jadx/NotYetImplementedExtension.java b/jadx-core/src/test/java/jadx/NotYetImplementedExtension.java index 1bff2ae13..24568a1a1 100644 --- a/jadx-core/src/test/java/jadx/NotYetImplementedExtension.java +++ b/jadx-core/src/test/java/jadx/NotYetImplementedExtension.java @@ -10,7 +10,7 @@ import org.junit.jupiter.api.extension.TestExecutionExceptionHandler; public class NotYetImplementedExtension implements AfterTestExecutionCallback, TestExecutionExceptionHandler { - private Set knownFailedMethods = new HashSet<>(); + private final Set knownFailedMethods = new HashSet<>(); @Override public void handleTestExecutionException(ExtensionContext context, Throwable throwable) throws Throwable { @@ -24,7 +24,7 @@ public class NotYetImplementedExtension implements AfterTestExecutionCallback, T public void afterTestExecution(ExtensionContext context) throws Exception { if (!knownFailedMethods.contains(context.getTestMethod().get()) && isNotYetImplemented(context) - && !context.getExecutionException().isPresent()) { + && context.getExecutionException().isEmpty()) { throw new AssertionError("Test " + context.getTestClass().get().getName() + '.' + context.getTestMethod().get().getName() + " is marked as @NotYetImplemented, but passes!"); diff --git a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnFormat.java b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnFormat.java index 0d4ddc597..66b70b796 100644 --- a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnFormat.java +++ b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnFormat.java @@ -95,7 +95,7 @@ public abstract class DexInsnFormat { regs[0] = byte1(opcodeUnit); long literal = in.readShort(); - literal <<= (byte0(opcodeUnit) == DexOpcodes.CONST_HIGH16) ? 16 : 48; + literal <<= byte0(opcodeUnit) == DexOpcodes.CONST_HIGH16 ? 16 : 48; insn.setLiteral(literal); } }; diff --git a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/smali/SmaliInsnFormat.java b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/smali/SmaliInsnFormat.java index 11fe0c350..e4bda9683 100644 --- a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/smali/SmaliInsnFormat.java +++ b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/smali/SmaliInsnFormat.java @@ -99,7 +99,7 @@ public class SmaliInsnFormat { } private InsnFormatter noArgsInsn(String name) { - return (fi) -> fi.getCodeWriter().add(name); + return fi -> fi.getCodeWriter().add(name); } private String literal(InsnFormatterInfo fi) {