feat: support MethodParameters attribute (#1260)

This commit is contained in:
Skylot
2022-02-26 10:09:02 +00:00
parent 502fd069be
commit 5852da1e3d
14 changed files with 233 additions and 20 deletions
@@ -71,6 +71,7 @@ public class JavaMethodData implements IMethodData {
Utils.addToList(list, JavaAnnotationDefaultAttr.convert(attributes));
Utils.addToList(list, attributes.get(JavaAttrType.SIGNATURE));
Utils.addToList(list, attributes.get(JavaAttrType.EXCEPTIONS));
Utils.addToList(list, attributes.get(JavaAttrType.METHOD_PARAMETERS));
return list;
}
@@ -17,6 +17,7 @@ import jadx.plugins.input.java.data.attributes.types.JavaAnnotationsAttr;
import jadx.plugins.input.java.data.attributes.types.JavaBootstrapMethodsAttr;
import jadx.plugins.input.java.data.attributes.types.JavaExceptionsAttr;
import jadx.plugins.input.java.data.attributes.types.JavaInnerClsAttr;
import jadx.plugins.input.java.data.attributes.types.JavaMethodParametersAttr;
import jadx.plugins.input.java.data.attributes.types.JavaParamAnnsAttr;
import jadx.plugins.input.java.data.attributes.types.JavaSignatureAttr;
import jadx.plugins.input.java.data.attributes.types.JavaSourceFileAttr;
@@ -46,6 +47,7 @@ public final class JavaAttrType<T extends IJavaAttribute> {
public static final JavaAttrType<JavaSourceFileAttr> SOURCE_FILE;
public static final JavaAttrType<JavaSignatureAttr> SIGNATURE;
public static final JavaAttrType<JavaExceptionsAttr> EXCEPTIONS;
public static final JavaAttrType<JavaMethodParametersAttr> METHOD_PARAMETERS;
public static final JavaAttrType<IgnoredAttr> DEPRECATED;
public static final JavaAttrType<IgnoredAttr> SYNTHETIC;
@@ -76,6 +78,7 @@ public final class JavaAttrType<T extends IJavaAttribute> {
SOURCE_FILE = bind("SourceFile", JavaSourceFileAttr.reader());
SIGNATURE = bind("Signature", JavaSignatureAttr.reader());
EXCEPTIONS = bind("Exceptions", JavaExceptionsAttr.reader());
METHOD_PARAMETERS = bind("MethodParameters", JavaMethodParametersAttr.reader());
// ignored
DEPRECATED = bind("Deprecated", null); // duplicated by annotation
@@ -0,0 +1,29 @@
package jadx.plugins.input.java.data.attributes.types;
import java.util.ArrayList;
import java.util.List;
import jadx.api.plugins.input.data.attributes.types.MethodParametersAttr;
import jadx.plugins.input.java.data.ConstPoolReader;
import jadx.plugins.input.java.data.attributes.IJavaAttribute;
import jadx.plugins.input.java.data.attributes.IJavaAttributeReader;
public class JavaMethodParametersAttr extends MethodParametersAttr implements IJavaAttribute {
public JavaMethodParametersAttr(List<Info> list) {
super(list);
}
public static IJavaAttributeReader reader() {
return (clsData, reader) -> {
ConstPoolReader constPool = clsData.getConstPoolReader();
int count = reader.readU1();
List<Info> params = new ArrayList<>(count);
for (int i = 0; i < count; i++) {
String name = constPool.getUtf8(reader.readU2());
int accessFlags = reader.readU2();
params.add(new Info(accessFlags, name));
}
return new JavaMethodParametersAttr(params);
};
}
}
@@ -6,7 +6,7 @@ import java.util.List;
import jadx.api.plugins.input.data.annotations.AnnotationVisibility;
import jadx.api.plugins.input.data.annotations.IAnnotation;
import jadx.api.plugins.input.data.attributes.types.MethodParamsAttr;
import jadx.api.plugins.input.data.attributes.types.AnnotationMethodParamsAttr;
import jadx.api.plugins.utils.Utils;
import jadx.plugins.input.java.data.attributes.IJavaAttribute;
import jadx.plugins.input.java.data.attributes.IJavaAttributeReader;
@@ -35,19 +35,19 @@ public class JavaParamAnnsAttr implements IJavaAttribute {
};
}
public static MethodParamsAttr merge(JavaAttrStorage storage) {
public static AnnotationMethodParamsAttr merge(JavaAttrStorage storage) {
JavaParamAnnsAttr runtimeAnnAttr = storage.get(JavaAttrType.RUNTIME_PARAMETER_ANNOTATIONS);
JavaParamAnnsAttr buildAnnAttr = storage.get(JavaAttrType.BUILD_PARAMETER_ANNOTATIONS);
if (runtimeAnnAttr == null && buildAnnAttr == null) {
return null;
}
if (buildAnnAttr == null) {
return MethodParamsAttr.pack(runtimeAnnAttr.getList());
return AnnotationMethodParamsAttr.pack(runtimeAnnAttr.getList());
}
if (runtimeAnnAttr == null) {
return MethodParamsAttr.pack(buildAnnAttr.getList());
return AnnotationMethodParamsAttr.pack(buildAnnAttr.getList());
}
return MethodParamsAttr.pack(mergeParamLists(runtimeAnnAttr.getList(), buildAnnAttr.getList()));
return AnnotationMethodParamsAttr.pack(mergeParamLists(runtimeAnnAttr.getList(), buildAnnAttr.getList()));
}
private static List<List<IAnnotation>> mergeParamLists(List<List<IAnnotation>> first, List<List<IAnnotation>> second) {