12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import haxe.io.BytesInput;
- import sys.io.File;
- import sys.io.FileInput;
- import format.jvm.Data;
- using StringTools;
- using Lambda;
- typedef Annotations = {
- var ?runtimeVisible:Array<Annotation>;
- var ?runtimeInvisible:Array<Annotation>;
- var ?runtimeVisibleParameter:Array<Array<Annotation>>;
- var ?runtimeInvisibleParameter:Array<Array<Annotation>>;
- }
- function getAnnotations(attributes:Array<Attribute>) {
- var annotations:Annotations = {};
- for (attribute in attributes) {
- switch (attribute) {
- case RuntimeVisibleAnnotations(a):
- annotations.runtimeVisible = a;
- case RuntimeInvisibleAnnotations(a):
- annotations.runtimeInvisible = a;
- case RuntimeVisibleParameterAnnotations(a):
- annotations.runtimeVisibleParameter = a;
- case RuntimeInvisibleParameterAnnotations(a):
- annotations.runtimeInvisibleParameter = a;
- case _:
- }
- }
- return annotations;
- }
- function hasAnnotation(annotations:Array<Annotation>, name:String) {
- return annotations.exists(ann -> ann.type == name);
- }
- function reportPresence(source:String, annotations:Array<Array<Annotation>>, name:String) {
- Sys.println('Presence of $name on $source');
- for (key => annotations in annotations) {
- Sys.println(' $key: ${hasAnnotation(annotations, name)}');
- }
- }
- function main() {
- var input = File.read("annotationLib.jar");
- var zip = new format.zip.Reader(input);
- var data = zip.read();
- for (entry in data) {
- if (!entry.fileName.endsWith("AnnotationLib.class")) {
- continue;
- }
- var input = new BytesInput(entry.data);
- var reader = new format.jvm.Reader(input);
- var jc = reader.read();
- var annotations = getAnnotations(jc.attributes);
- reportPresence(jc.thisClass, [annotations.runtimeVisible, annotations.runtimeInvisible], "Lhaxe/root/MyVisibleAnnotation;");
- reportPresence(jc.thisClass, [annotations.runtimeVisible, annotations.runtimeInvisible], "Lhaxe/root/MyInvisibleAnnotation;");
- for (method in jc.methods) {
- if (method.name != "test") {
- continue;
- }
- var annotations = getAnnotations(method.attributes);
- reportPresence(method.name, [annotations.runtimeVisible, annotations.runtimeInvisible], "Lhaxe/root/MyVisibleAnnotation;");
- reportPresence(method.name, [annotations.runtimeVisible, annotations.runtimeInvisible], "Lhaxe/root/MyInvisibleAnnotation;");
- for (i in 0...2) {
- var name = '${method.name} (arg $i)';
- reportPresence(name, [annotations.runtimeVisibleParameter[i], annotations.runtimeInvisibleParameter[i]], "Lhaxe/root/MyVisibleAnnotation;");
- reportPresence(name, [annotations.runtimeVisibleParameter[i], annotations.runtimeInvisibleParameter[i]], "Lhaxe/root/MyInvisibleAnnotation;");
- }
- }
- var ann = annotations.runtimeVisible.find(ann -> ann.type == "Lhaxe/root/MyVisibleArrayAnnotation;");
- Sys.println(ann.elementValuePairs[0].elementValue.value);
- var ann = annotations.runtimeVisible.find(ann -> ann.type == "Lhaxe/root/MyVisibleArrayArrayAnnotation;");
- Sys.println(ann.elementValuePairs[0].elementValue.value);
- }
- }
|