Dev_S

Untitled

Jun 11th, 2021
739
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package net.fabricmc.tinyremapper.mixin;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.objectweb.asm.AnnotationVisitor;
  7. import org.objectweb.asm.Opcodes;
  8. import org.objectweb.asm.Type;
  9.  
  10. import net.fabricmc.tinyremapper.api.AnnotationMapper;
  11. import net.fabricmc.tinyremapper.api.ClassHeader;
  12.  
  13. public class MixinAnnotationMapper implements AnnotationMapper {
  14.     @Override
  15.     public AnnotationVisitor wrapClass(ClassHeader header, AnnotationVisitor writer, String desc, boolean visible) {
  16.         return new AnnotationVisitor(Opcodes.ASM8, writer) {
  17.             List<String> classes = new ArrayList<>(), targets = new ArrayList<>();
  18.             boolean remap = true;
  19.  
  20.             @Override
  21.             public AnnotationVisitor visitArray(String name) {
  22.                 boolean areTypes = name.equals("value"); // array is either value or targets
  23.                 return new ClassCollector(areTypes, this.classes, this.targets);
  24.             }
  25.  
  26.             @Override
  27.             public void visit(String name, Object value) {
  28.                 super.visit(name, value);
  29.                 if(name.equals("remap")) {
  30.                     this.remap = (boolean) value;
  31.                 }
  32.             }
  33.  
  34.             @Override
  35.             public void visitEnd() {
  36.                 super.visitEnd();
  37.                 if(!this.classes.isEmpty()) {
  38.                     AnnotationVisitor visitor = writer.visitArray("value");
  39.                     for (String internalName : this.classes) {
  40.                         if(this.remap) internalName = header.getClasspath().mapType(internalName);
  41.                         visitor.visit("value", Type.getObjectType(internalName));
  42.                     }
  43.                     visitor.visitEnd();
  44.                 }
  45.  
  46.                 if(!this.targets.isEmpty()) {
  47.                     AnnotationVisitor visitor = writer.visitArray("value");
  48.                     for (String internalName : this.classes) {
  49.                         if(this.remap) internalName = header.getClasspath().mapType(internalName);
  50.                         visitor.visit("value", Type.getObjectType(internalName));
  51.                     }
  52.                     visitor.visitEnd();
  53.                 }
  54.             }
  55.         };
  56.     }
  57.    
  58.     private static class ClassCollector extends AnnotationVisitor {
  59.         private final boolean areTypes;
  60.         private final List<String> classes, targets;
  61.  
  62.         public ClassCollector(boolean areTypes, List<String> classes, List<String> targets) {
  63.             super(Opcodes.ASM8);
  64.             this.areTypes = areTypes;
  65.             this.classes = classes;
  66.             this.targets = targets;
  67.         }
  68.  
  69.         @Override
  70.         public void visit(String name, Object value) {
  71.             if (this.areTypes) {
  72.                 this.classes.add(((Type)value).getInternalName());
  73.             } else {
  74.                 this.targets.add((String) value);
  75.             }
  76.         }
  77.     }
  78. }
  79.  
RAW Paste Data