Skip to content

Commit

Permalink
add dontremap annotation
Browse files Browse the repository at this point in the history
  • Loading branch information
wagyourtail committed Aug 13, 2023
1 parent 46f40cc commit f3fe767
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package xyz.wagyourtail.unimined.jarmodagent.transformer.annotation;

import java.lang.annotation.*;

/**
* skips the next annotation. or hard target.
*/
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
public @interface DontRemap {

/**
* if this is present, only skips remapping if matches.
* this is useful if you only want to skip @CTarget, or vis versa.
*/
Class<? extends Annotation>[] value() default {};

/**
* skip remapping until the next @DontRemap (that one doesn't just act as an end, it still does its default behavior)
* @return
*/
boolean skip() default false;

}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package xyz.wagyourtail.unimined.jarmodagent.transformer.refmap;

import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.*;
import xyz.wagyourtail.unimined.jarmodagent.PriorityClasspath;
import xyz.wagyourtail.unimined.jarmodagent.transformer.annotation.DontRemap;

import java.util.Map;

public class AnnotationStringRemappingClassVisitor extends ClassVisitor {
Map<String, String> refmap;
PriorityClasspath classpath;
DontRemapAnnotationVisitor dontRemap;

public AnnotationStringRemappingClassVisitor(int api, ClassVisitor classVisitor, Map<String, String> refmap, PriorityClasspath classpath) {
super(api, classVisitor);
Expand All @@ -21,7 +20,18 @@ public AnnotationStringRemappingClassVisitor(int api, ClassVisitor classVisitor,
@Override
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
AnnotationVisitor av = super.visitAnnotation(descriptor, visible);
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath);
if (descriptor.equals(Type.getDescriptor(DontRemap.class))) {
dontRemap = new DontRemapAnnotationVisitor(api, av);
return dontRemap;
}
if (dontRemap.skip) return av;
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath, dontRemap) {
@Override
public void visitEnd() {
dontRemap = null;
super.visitEnd();
}
};
}

@Override
Expand All @@ -31,7 +41,18 @@ public FieldVisitor visitField(int access, String name, String descriptor, Strin
@Override
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
AnnotationVisitor av = super.visitAnnotation(descriptor, visible);
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath);
if (descriptor.equals(Type.getDescriptor(DontRemap.class))) {
dontRemap = new DontRemapAnnotationVisitor(api, av);
return dontRemap;
}
if (dontRemap.skip) return av;
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath, dontRemap) {
@Override
public void visitEnd() {
dontRemap = null;
super.visitEnd();
}
};
}
};
}
Expand All @@ -43,13 +64,35 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
@Override
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
AnnotationVisitor av = super.visitAnnotation(descriptor, visible);
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath);
if (descriptor.equals(Type.getDescriptor(DontRemap.class))) {
dontRemap = new DontRemapAnnotationVisitor(api, av);
return dontRemap;
}
if (dontRemap.skip) return av;
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath, dontRemap) {
@Override
public void visitEnd() {
dontRemap = null;
super.visitEnd();
}
};
}

@Override
public AnnotationVisitor visitParameterAnnotation(int parameter, String descriptor, boolean visible) {
AnnotationVisitor av = super.visitParameterAnnotation(parameter, descriptor, visible);
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath);
if (descriptor.equals(Type.getDescriptor(DontRemap.class))) {
dontRemap = new DontRemapAnnotationVisitor(api, av);
return dontRemap;
}
if (dontRemap.skip) return av;
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath, dontRemap) {
@Override
public void visitEnd() {
dontRemap = null;
super.visitEnd();
}
};
}
};
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package xyz.wagyourtail.unimined.jarmodagent.transformer.refmap;

import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Type;

import java.util.ArrayList;
import java.util.List;

public class DontRemapAnnotationVisitor extends AnnotationVisitor {
List<Type> dontRemap = new ArrayList<>();
boolean skip = false;

protected DontRemapAnnotationVisitor(int api, AnnotationVisitor parent) {
super(api, parent);
}

@Override
public void visit(String name, Object value) {
if ("skip".equals(name)) {
skip = (Boolean) value;
}
super.visit(name, value);
}

@Override
public AnnotationVisitor visitArray(String name) {
if ("dontRemap".equals(name)) {
return new AnnotationVisitor(api, super.visitArray(name)) {
@Override
public void visit(String name, Object value) {
dontRemap.add((Type) value);
super.visit(name, value);
}
};
}
return super.visitArray(name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import net.lenni0451.classtransform.mappings.annotation.AnnotationRemap;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Type;
import xyz.wagyourtail.unimined.jarmodagent.JarModder;
import xyz.wagyourtail.unimined.jarmodagent.PriorityClasspath;

Expand All @@ -17,13 +18,17 @@ public class RemappingAnnotationVisitor extends AnnotationVisitor {
boolean allowNullNameRemap;
Class<?> annotationType;
PriorityClasspath classpath;
DontRemapAnnotationVisitor dontRemap;
boolean skip;


protected RemappingAnnotationVisitor(int api, AnnotationVisitor annotationVisitor, Map<String, String> refmap, String descriptor, boolean allowNullNameRemap, PriorityClasspath classpath) {
protected RemappingAnnotationVisitor(int api, AnnotationVisitor annotationVisitor, Map<String, String> refmap, String descriptor, boolean allowNullNameRemap, PriorityClasspath classpath, DontRemapAnnotationVisitor dontRemap) {
super(api, annotationVisitor);
this.refmap = refmap;
this.allowNullNameRemap = allowNullNameRemap;
this.classpath = classpath;
this.dontRemap = dontRemap;
skip = dontRemap.dontRemap.isEmpty() || dontRemap.dontRemap.contains(Type.getType(descriptor));
try {
if (descriptor != null) {
if (descriptor.startsWith("L")) descriptor = descriptor.substring(1);
Expand Down Expand Up @@ -57,14 +62,14 @@ public boolean testName(String name) {
throw new RuntimeException(e);
}
} else {
return false;
return true;
}
return true;
}

@Override
public void visit(String name, Object value) {
if (!testName(name)) {
if (!testName(name) || skip) {
super.visit(name, value);
return;
}
Expand All @@ -79,12 +84,15 @@ public void visit(String name, Object value) {
@Override
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
AnnotationVisitor av = super.visitAnnotation(name, descriptor);
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath);
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false, classpath, dontRemap);
}

@Override
public AnnotationVisitor visitArray(String name) {
AnnotationVisitor av = super.visitArray(name);
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, null, true, classpath);
if (av == null) return null;
RemappingAnnotationVisitor rav = new RemappingAnnotationVisitor(api, av, refmap, null, true, classpath, dontRemap);
if (skip) rav.skip = true;
return rav;
}
}

0 comments on commit f3fe767

Please sign in to comment.