diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/common/ResolveUtility.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/common/ResolveUtility.java index 98da2c9e..f5168b46 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/common/ResolveUtility.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/common/ResolveUtility.java @@ -31,7 +31,6 @@ import net.fabricmc.tinyremapper.api.TrMember; import net.fabricmc.tinyremapper.api.TrMember.MemberType; import net.fabricmc.tinyremapper.api.TrMethod; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Message; public final class ResolveUtility { /** @@ -61,11 +60,6 @@ public ResolveUtility(TrEnvironment environment) { public Optional resolveClass(String name) { TrClass _class = environment.getClass(name); - - if (_class == null && !StringUtility.isInternalClassName(name)) { - logger.error(Message.CANNOT_RESOLVE_CLASS, name); - } - return Optional.ofNullable(_class); } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinClassVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinClassVisitor.java index 32eecb27..4bba31ce 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinClassVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinClassVisitor.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import org.objectweb.asm.AnnotationVisitor; @@ -46,7 +45,6 @@ public class HardTargetMixinClassVisitor extends ClassVisitor { private MxClass _class; // @Mixin - private final AtomicBoolean remap = new AtomicBoolean(); private final List targets = new ArrayList<>(); // @Implements @@ -74,7 +72,7 @@ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { AnnotationVisitor av = super.visitAnnotation(descriptor, visible); if (Annotation.MIXIN.equals(descriptor)) { - av = new MixinAnnotationVisitor(av, remap, targets); + av = new MixinAnnotationVisitor(av, targets); } else if (Annotation.IMPLEMENTS.equals(descriptor)) { av = new ImplementsAnnotationVisitor(av, interfaces); } @@ -90,7 +88,7 @@ public FieldVisitor visitField(int access, String name, String descriptor, Strin if (targets.isEmpty()) { return fv; } else { - return new HardTargetMixinFieldVisitor(tasks, fv, field, remap.get(), Collections.unmodifiableList(targets)); + return new HardTargetMixinFieldVisitor(tasks, fv, field, Collections.unmodifiableList(targets)); } } @@ -106,7 +104,7 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str if (targets.isEmpty()) { return mv; } else { - return new HardTargetMixinMethodVisitor(tasks, mv, method, remap.get(), Collections.unmodifiableList(targets)); + return new HardTargetMixinMethodVisitor(tasks, mv, method, Collections.unmodifiableList(targets)); } } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinFieldVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinFieldVisitor.java index 296df0d8..32972180 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinFieldVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinFieldVisitor.java @@ -36,16 +36,14 @@ class HardTargetMixinFieldVisitor extends FieldVisitor { private final Collection> tasks; private final MxMember field; - private final boolean remap; private final List targets; HardTargetMixinFieldVisitor(Collection> tasks, FieldVisitor delegate, MxMember field, - boolean remap, List targets) { + List targets) { super(Constant.ASM_VERSION, delegate); this.tasks = Objects.requireNonNull(tasks); this.field = Objects.requireNonNull(field); - this.remap = remap; this.targets = Objects.requireNonNull(targets); } @@ -54,7 +52,7 @@ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { AnnotationVisitor av = super.visitAnnotation(descriptor, visible); if (Annotation.SHADOW.equals(descriptor)) { - av = new ShadowAnnotationVisitor(tasks, av, field, remap, targets); + av = new ShadowAnnotationVisitor(tasks, av, field, targets); } return av; diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinMethodVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinMethodVisitor.java index 9ed05551..c4ba2894 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinMethodVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinMethodVisitor.java @@ -30,8 +30,6 @@ import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; import net.fabricmc.tinyremapper.extension.mixin.common.data.MxMember; -import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.AccessorAnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.InvokerAnnotationVisitor; import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.OverwriteAnnotationVisitor; import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.ShadowAnnotationVisitor; @@ -39,15 +37,13 @@ class HardTargetMixinMethodVisitor extends MethodVisitor { private final Collection> data; private final MxMember method; - private final boolean remap; private final List targets; - HardTargetMixinMethodVisitor(Collection> data, MethodVisitor delegate, MxMember method, boolean remap, List targets) { + HardTargetMixinMethodVisitor(Collection> data, MethodVisitor delegate, MxMember method, List targets) { super(Constant.ASM_VERSION, delegate); this.data = Objects.requireNonNull(data); this.method = Objects.requireNonNull(method); - this.remap = remap; this.targets = Objects.requireNonNull(targets); } @@ -56,13 +52,9 @@ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { AnnotationVisitor av = super.visitAnnotation(descriptor, visible); if (Annotation.SHADOW.equals(descriptor)) { - av = new ShadowAnnotationVisitor(data, av, method, remap, targets); + av = new ShadowAnnotationVisitor(data, av, method, targets); } else if (Annotation.OVERWRITE.equals(descriptor)) { - av = new OverwriteAnnotationVisitor(data, av, method, remap, targets); - } else if (Annotation.ACCESSOR.equals(descriptor)) { - av = new AccessorAnnotationVisitor(data, av, method, remap, targets); - } else if (Annotation.INVOKER.equals(descriptor)) { - av = new InvokerAnnotationVisitor(data, av, method, remap, targets); + av = new OverwriteAnnotationVisitor(data, av, method, targets); } return av; diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/AccessorAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/AccessorAnnotationVisitor.java deleted file mode 100644 index eafeb2ca..00000000 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/AccessorAnnotationVisitor.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Player, asie - * Copyright (c) 2021, 2023, FabricMC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package net.fabricmc.tinyremapper.extension.mixin.hard.annotation; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.objectweb.asm.AnnotationVisitor; - -import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement; -import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; -import net.fabricmc.tinyremapper.extension.mixin.common.data.MxMember; -import net.fabricmc.tinyremapper.extension.mixin.hard.util.CamelPrefixString; -import net.fabricmc.tinyremapper.extension.mixin.hard.util.ConvertibleMappable; -import net.fabricmc.tinyremapper.extension.mixin.hard.util.IConvertibleString; - -/** - * In case of multi-target, if a remap conflict is detected, - * an error message will show up and the behaviour is undefined. - * If after strip the prefix, all characters are UPPER_CASE, then - * do not lower the first character of the remaining part. - */ -public class AccessorAnnotationVisitor extends AnnotationVisitor { - private final Collection> tasks; - private final MxMember method; - private final List targets; - - private boolean remap; - private boolean isSoftTarget; - - public AccessorAnnotationVisitor(Collection> tasks, AnnotationVisitor delegate, MxMember method, boolean remap, List targets) { - super(Constant.ASM_VERSION, delegate); - - this.tasks = Objects.requireNonNull(tasks); - this.method = Objects.requireNonNull(method); - this.targets = Objects.requireNonNull(targets); - - this.remap = remap; - this.isSoftTarget = false; - } - - @Override - public void visit(String name, Object value) { - if (name.equals(AnnotationElement.REMAP)) { - remap = Objects.requireNonNull((Boolean) value); - } else if (name.equals(AnnotationElement.VALUE)) { - isSoftTarget = true; - } - - super.visit(name, value); - } - - @Override - public void visitEnd() { - if (remap && !isSoftTarget) { - tasks.add(data -> new AccessorMappable(data, method, targets).result()); - } - - super.visitEnd(); - } - - private static class AccessorMappable extends ConvertibleMappable { - private final String prefix; - private final String fieldDesc; - - private static final Pattern GETTER_PATTERN = Pattern.compile("(?<=\\(\\)).*"); - private static final Pattern SETTER_PATTERN = Pattern.compile("(?<=\\().*(?=\\)V)"); - - AccessorMappable(CommonData data, MxMember self, Collection targets) { - super(data, self, targets); - - if (self.getName().startsWith("get")) { - this.prefix = "get"; - } else if (self.getName().startsWith("set")) { - this.prefix = "set"; - } else if (self.getName().startsWith("is")) { - this.prefix = "is"; - } else { - throw new RuntimeException(String.format("%s does not start with get, set or is.", self.getName())); - } - - Matcher getterMatcher = GETTER_PATTERN.matcher(self.getDesc()); - Matcher setterMatcher = SETTER_PATTERN.matcher(self.getDesc()); - - if (getterMatcher.find()) { - this.fieldDesc = getterMatcher.group(); - } else if (setterMatcher.find()) { - this.fieldDesc = setterMatcher.group(); - } else { - throw new RuntimeException(String.format("%s is not getter or setter descriptor", self.getDesc())); - } - } - - @Override - protected IConvertibleString getName() { - return new CamelPrefixString(prefix, self.getName()); - } - - @Override - protected String getDesc() { - return fieldDesc; - } - } -} diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/InvokerAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/InvokerAnnotationVisitor.java deleted file mode 100644 index 5841f564..00000000 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/InvokerAnnotationVisitor.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Player, asie - * Copyright (c) 2021, 2023, FabricMC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package net.fabricmc.tinyremapper.extension.mixin.hard.annotation; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; - -import org.objectweb.asm.AnnotationVisitor; - -import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement; -import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; -import net.fabricmc.tinyremapper.extension.mixin.common.data.MxMember; -import net.fabricmc.tinyremapper.extension.mixin.hard.util.CamelPrefixString; -import net.fabricmc.tinyremapper.extension.mixin.hard.util.ConvertibleMappable; -import net.fabricmc.tinyremapper.extension.mixin.hard.util.IConvertibleString; - -/** - * In case of multi-target, if a remap conflict is detected, - * an error message will show up and the behaviour is undefined. - * If after strip the prefix, all characters are UPPER_CASE, then - * do not lower the first character of the remaining part. - */ -public class InvokerAnnotationVisitor extends AnnotationVisitor { - private final Collection> tasks; - private final MxMember method; - private final List targets; - - private boolean remap; - private boolean isSoftTarget; - - public InvokerAnnotationVisitor(Collection> tasks, AnnotationVisitor delegate, MxMember method, boolean remap, List targets) { - super(Constant.ASM_VERSION, delegate); - - this.tasks = Objects.requireNonNull(tasks); - this.method = Objects.requireNonNull(method); - this.targets = Objects.requireNonNull(targets); - - this.remap = remap; - this.isSoftTarget = false; - } - - @Override - public void visit(String name, Object value) { - if (name.equals(AnnotationElement.REMAP)) { - remap = Objects.requireNonNull((Boolean) value); - } else if (name.equals(AnnotationElement.VALUE)) { - isSoftTarget = true; - } - - super.visit(name, value); - } - - @Override - public void visitEnd() { - if (remap && !isSoftTarget) { - tasks.add(data -> new InvokerMappable(data, method, targets).result()); - } - - super.visitEnd(); - } - - private static class InvokerMappable extends ConvertibleMappable { - private final String prefix; - - InvokerMappable(CommonData data, MxMember self, Collection targets) { - super(data, self, targets); - - if (self.getName().startsWith("call")) { - this.prefix = "call"; - } else if (self.getName().startsWith("invoke")) { - this.prefix = "invoke"; - } else if (self.getName().startsWith("new")) { - this.prefix = "new"; - } else if (self.getName().startsWith("create")) { - this.prefix = "create"; - } else { - throw new RuntimeException(String.format("%s does not start with call or invoke.", self.getName())); - } - } - - @Override - protected IConvertibleString getName() { - return new CamelPrefixString(prefix, self.getName()); - } - - @Override - protected String getDesc() { - return self.getDesc(); - } - } -} diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/MixinAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/MixinAnnotationVisitor.java index a8dcb3d1..cad5cb74 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/MixinAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/MixinAnnotationVisitor.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Type; @@ -32,25 +31,12 @@ * Only collect information for other hard-target. */ public class MixinAnnotationVisitor extends AnnotationVisitor { - private final AtomicBoolean remap0; private final List targets; - public MixinAnnotationVisitor(AnnotationVisitor delegate, AtomicBoolean remapOut, List targetsOut) { + public MixinAnnotationVisitor(AnnotationVisitor delegate, List targetsOut) { super(Constant.ASM_VERSION, delegate); - this.remap0 = Objects.requireNonNull(remapOut); this.targets = Objects.requireNonNull(targetsOut); - - this.remap0.set(true); // default value is true. - } - - @Override - public void visit(String name, Object value) { - if (name.equals(AnnotationElement.REMAP)) { - remap0.set(Objects.requireNonNull((Boolean) value)); - } - - super.visit(name, value); } @Override diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/OverwriteAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/OverwriteAnnotationVisitor.java index 17916c9c..60d5c969 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/OverwriteAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/OverwriteAnnotationVisitor.java @@ -25,7 +25,6 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; import net.fabricmc.tinyremapper.extension.mixin.common.data.MxMember; @@ -42,32 +41,17 @@ public class OverwriteAnnotationVisitor extends AnnotationVisitor { private final MxMember method; private final List targets; - private boolean remap; - - public OverwriteAnnotationVisitor(Collection> tasks, AnnotationVisitor delegate, MxMember method, boolean remap, List targets) { + public OverwriteAnnotationVisitor(Collection> tasks, AnnotationVisitor delegate, MxMember method, List targets) { super(Constant.ASM_VERSION, delegate); this.tasks = Objects.requireNonNull(tasks); this.method = Objects.requireNonNull(method); this.targets = Objects.requireNonNull(targets); - - this.remap = remap; - } - - @Override - public void visit(String name, Object value) { - if (name.equals(AnnotationElement.REMAP)) { - remap = Objects.requireNonNull((Boolean) value); - } - - super.visit(name, value); } @Override public void visitEnd() { - if (remap) { - tasks.add(data -> new OverwriteMappable(data, method, targets).result()); - } + tasks.add(data -> new OverwriteMappable(data, method, targets).result()); super.visitEnd(); } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/ShadowAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/ShadowAnnotationVisitor.java index 53c18154..e9d4d083 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/ShadowAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/ShadowAnnotationVisitor.java @@ -44,24 +44,20 @@ public class ShadowAnnotationVisitor extends AnnotationVisitor { private final MxMember member; private final List targets; - private boolean remap; private String prefix; - public ShadowAnnotationVisitor(Collection> tasks, AnnotationVisitor delegate, MxMember member, boolean remap, List targets) { + public ShadowAnnotationVisitor(Collection> tasks, AnnotationVisitor delegate, MxMember member, List targets) { super(Constant.ASM_VERSION, delegate); this.tasks = Objects.requireNonNull(tasks); this.member = Objects.requireNonNull(member); this.targets = Objects.requireNonNull(targets); - this.remap = remap; this.prefix = "shadow$"; } @Override public void visit(String name, Object value) { - if (name.equals(AnnotationElement.REMAP)) { - remap = Objects.requireNonNull((Boolean) value); - } else if (name.equals(AnnotationElement.PREFIX)) { + if (name.equals(AnnotationElement.PREFIX)) { prefix = Objects.requireNonNull((String) value); } @@ -70,9 +66,7 @@ public void visit(String name, Object value) { @Override public void visitEnd() { - if (remap) { - tasks.add(data -> new ShadowPrefixMappable(data, member, targets, prefix).result()); - } + tasks.add(data -> new ShadowPrefixMappable(data, member, targets, prefix).result()); super.visitEnd(); } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinClassVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinClassVisitor.java index ff81a13e..1d6b0053 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinClassVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinClassVisitor.java @@ -22,7 +22,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassVisitor; @@ -40,7 +39,6 @@ public class SoftTargetMixinClassVisitor extends ClassVisitor { private MxClass _class; // @Mixin - private final AtomicBoolean remap = new AtomicBoolean(); private final List targets = new ArrayList<>(); public SoftTargetMixinClassVisitor(CommonData data, ClassVisitor delegate) { @@ -65,7 +63,7 @@ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { AnnotationVisitor av = super.visitAnnotation(descriptor, visible); if (Annotation.MIXIN.equals(descriptor)) { - av = new MixinAnnotationVisitor(data, av, remap, targets); + av = new MixinAnnotationVisitor(data, av, targets); } return av; @@ -79,7 +77,7 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str if (targets.isEmpty()) { return mv; } else { - return new SoftTargetMixinMethodVisitor(data, mv, method, remap.get(), Collections.unmodifiableList(targets)); + return new SoftTargetMixinMethodVisitor(data, mv, method, Collections.unmodifiableList(targets)); } } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinMethodVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinMethodVisitor.java index 0b237d8f..3991cbe4 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinMethodVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinMethodVisitor.java @@ -48,15 +48,13 @@ class SoftTargetMixinMethodVisitor extends MethodVisitor { private final CommonData data; private final MxMember method; - private final boolean remap; private final List targets; - SoftTargetMixinMethodVisitor(CommonData data, MethodVisitor delegate, MxMember method, boolean remap, List targets) { + SoftTargetMixinMethodVisitor(CommonData data, MethodVisitor delegate, MxMember method, List targets) { super(Constant.ASM_VERSION, delegate); this.data = Objects.requireNonNull(data); this.method = Objects.requireNonNull(method); - this.remap = remap; this.targets = Objects.requireNonNull(targets); } @@ -65,35 +63,35 @@ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { AnnotationVisitor av = super.visitAnnotation(descriptor, visible); if (Annotation.ACCESSOR.equals(descriptor)) { - av = new AccessorAnnotationVisitor(data, av, method, remap, targets); + av = new AccessorAnnotationVisitor(data, av, method, targets); } else if (Annotation.INVOKER.equals(descriptor)) { - av = new InvokerAnnotationVisitor(data, av, method, remap, targets); + av = new InvokerAnnotationVisitor(data, av, method, targets); } else if (Annotation.INJECT.equals(descriptor)) { - av = new InjectAnnotationVisitor(data, av, remap, targets); + av = new InjectAnnotationVisitor(data, av, targets); } else if (Annotation.MODIFY_ARG.equals(descriptor)) { - av = new ModifyArgAnnotationVisitor(data, av, remap, targets); + av = new ModifyArgAnnotationVisitor(data, av, targets); } else if (Annotation.MODIFY_ARGS.equals(descriptor)) { - av = new ModifyArgsAnnotationVisitor(data, av, remap, targets); + av = new ModifyArgsAnnotationVisitor(data, av, targets); } else if (Annotation.MODIFY_CONSTANT.equals(descriptor)) { - av = new ModifyConstantAnnotationVisitor(data, av, remap, targets); + av = new ModifyConstantAnnotationVisitor(data, av, targets); } else if (Annotation.MODIFY_VARIABLE.equals(descriptor)) { - av = new ModifyVariableAnnotationVisitor(data, av, remap, targets); + av = new ModifyVariableAnnotationVisitor(data, av, targets); } else if (Annotation.REDIRECT.equals(descriptor)) { - av = new RedirectAnnotationVisitor(data, av, remap, targets); + av = new RedirectAnnotationVisitor(data, av, targets); } else if (Annotation.MIXIN_EXTRAS_MODIFY_EXPRESSION_VALUE.equals(descriptor)) { - av = new ModifyExpressionValueAnnotationVisitor(data, av, remap, targets); + av = new ModifyExpressionValueAnnotationVisitor(data, av, targets); } else if (Annotation.MIXIN_EXTRAS_MODIFY_RECEIVER.equals(descriptor)) { - av = new ModifyReceiverAnnotationVisitor(data, av, remap, targets); + av = new ModifyReceiverAnnotationVisitor(data, av, targets); } else if (Annotation.MIXIN_EXTRAS_MODIFY_RETURN_VALUE.equals(descriptor)) { - av = new ModifyReturnValueAnnotationVisitor(data, av, remap, targets); + av = new ModifyReturnValueAnnotationVisitor(data, av, targets); } else if (Annotation.MIXIN_EXTRAS_WRAP_METHOD.equals(descriptor)) { - av = new WrapMethodAnnotationVisitor(data, av, remap, targets); + av = new WrapMethodAnnotationVisitor(data, av, targets); } else if (Annotation.MIXIN_EXTRAS_WRAP_OPERATION.equals(descriptor)) { - av = new WrapOperationAnnotationVisitor(data, av, remap, targets); + av = new WrapOperationAnnotationVisitor(data, av, targets); } else if (Annotation.MIXIN_EXTRAS_WRAP_WITH_CONDITION.equals(descriptor)) { - av = new WrapWithConditionAnnotationVisitor(data, av, remap, targets); + av = new WrapWithConditionAnnotationVisitor(data, av, targets); } else if (Annotation.MIXIN_EXTRAS_WRAP_WITH_CONDITION_V2.equals(descriptor)) { - av = new WrapWithConditionV2AnnotationVisitor(data, av, remap, targets); + av = new WrapWithConditionV2AnnotationVisitor(data, av, targets); } return av; diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/AccessorAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/AccessorAnnotationVisitor.java index 53ab9111..fe31893e 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/AccessorAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/AccessorAnnotationVisitor.java @@ -25,7 +25,7 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; +import net.fabricmc.tinyremapper.extension.mixin.common.StringUtility; import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; @@ -36,69 +36,77 @@ * In case of multi-target, if a remap conflict is detected, * an error message will show up and the behaviour is undefined. */ -public class AccessorAnnotationVisitor extends FirstPassAnnotationVisitor { +public class AccessorAnnotationVisitor extends AnnotationVisitor { private final CommonData data; - private final AnnotationVisitor delegate; - private final MxMember method; + private final MxMember method; private final List targets; + private final String fieldDesc; + + private boolean isSoftTarget; - public AccessorAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxMember method, boolean remap, List targets) { - super(Annotation.ACCESSOR, remap); + private static final Pattern GETTER_PATTERN = Pattern.compile("(?<=\\(\\)).*"); + private static final Pattern SETTER_PATTERN = Pattern.compile("(?<=\\().*(?=\\)V)"); + + public AccessorAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxMember method, List targets) { + super(Constant.ASM_VERSION, Objects.requireNonNull(delegate)); this.data = Objects.requireNonNull(data); - this.delegate = Objects.requireNonNull(delegate); - this.method = Objects.requireNonNull(method); + Objects.requireNonNull(method); + this.method = method; this.targets = Objects.requireNonNull(targets); + + Matcher getterMatcher = GETTER_PATTERN.matcher(method.getDesc()); + Matcher setterMatcher = SETTER_PATTERN.matcher(method.getDesc()); + + if (getterMatcher.find()) { + this.fieldDesc = getterMatcher.group(); + } else if (setterMatcher.find()) { + this.fieldDesc = setterMatcher.group(); + } else { + throw new RuntimeException(method.getDesc() + " is not getter or setter"); + } } @Override - public void visitEnd() { - if (super.remap) { - this.accept(new AccessorSecondPassAnnotationVisitor(data, delegate, method, targets)); - } else { - this.accept(delegate); + public void visit(String name, Object value) { + if (name.equals(AnnotationElement.VALUE)) { + isSoftTarget = true; + String fieldName = Objects.requireNonNull((String) value); + setAnnotationValue(fieldName); + return; } - super.visitEnd(); + super.visit(name, value); } - private static class AccessorSecondPassAnnotationVisitor extends AnnotationVisitor { - private final CommonData data; - private final List targets; - private final String fieldDesc; - - private static final Pattern GETTER_PATTERN = Pattern.compile("(?<=\\(\\)).*"); - private static final Pattern SETTER_PATTERN = Pattern.compile("(?<=\\().*(?=\\)V)"); + @Override + public void visitEnd() { + if (!isSoftTarget) { + setAnnotationValue(inferFieldName()); + } - AccessorSecondPassAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxMember method, List targets) { - super(Constant.ASM_VERSION, delegate); + super.visitEnd(); + } - this.data = Objects.requireNonNull(data); - this.targets = Objects.requireNonNull(targets); + private void setAnnotationValue(String fieldName) { + super.visit(AnnotationElement.VALUE, new NamedMappable(data, fieldName, fieldDesc, targets).result()); + } - Matcher getterMatcher = GETTER_PATTERN.matcher(method.getDesc()); - Matcher setterMatcher = SETTER_PATTERN.matcher(method.getDesc()); + private String inferFieldName() { + String prefix; - if (getterMatcher.find()) { - this.fieldDesc = getterMatcher.group(); - } else if (setterMatcher.find()) { - this.fieldDesc = setterMatcher.group(); - } else { - throw new RuntimeException(method.getDesc() + " is not getter or setter"); - } + if (method.getName().startsWith("get")) { + prefix = "get"; + } else if (method.getName().startsWith("set")) { + prefix = "set"; + } else if (method.getName().startsWith("is")) { + prefix = "is"; + } else { + throw new RuntimeException(String.format("%s does not start with get, set or is.", method.getName())); } - @Override - public void visit(String name, Object value) { - if (name.equals(AnnotationElement.VALUE)) { - String fieldName = Objects.requireNonNull((String) value); - - value = new NamedMappable(data, fieldName, fieldDesc, targets).result(); - } - - super.visit(name, value); - } + return StringUtility.removeCamelPrefix(prefix, method.getName()); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/FirstPassAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/FirstPassAnnotationVisitor.java deleted file mode 100644 index cd535675..00000000 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/FirstPassAnnotationVisitor.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Player, asie - * Copyright (c) 2021, FabricMC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package net.fabricmc.tinyremapper.extension.mixin.soft.annotation; - -import java.util.Objects; - -import org.objectweb.asm.tree.AnnotationNode; - -import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; - -/** - * The common annotation visitor for first pass. - */ -public class FirstPassAnnotationVisitor extends AnnotationNode { - protected boolean remap; - - public FirstPassAnnotationVisitor(String descriptor, boolean remapDefault) { - super(Constant.ASM_VERSION, descriptor); - remap = remapDefault; - } - - @Override - public void visit(String name, Object value) { - if (name.equals(AnnotationElement.REMAP)) { - remap = Objects.requireNonNull((Boolean) value); - } - - super.visit(name, value); - } -} diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/InvokerAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/InvokerAnnotationVisitor.java index 08dcebfc..d415a6df 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/InvokerAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/InvokerAnnotationVisitor.java @@ -23,7 +23,7 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; +import net.fabricmc.tinyremapper.extension.mixin.common.StringUtility; import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; @@ -34,57 +34,69 @@ * In case of multi-target, if a remap conflict is detected, * an error message will show up and the behaviour is undefined. */ -public class InvokerAnnotationVisitor extends FirstPassAnnotationVisitor { +public class InvokerAnnotationVisitor extends AnnotationVisitor { private final CommonData data; - private final AnnotationVisitor delegate; private final MxMember method; private final List targets; - public InvokerAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxMember method, boolean remap, List targets) { - super(Annotation.INVOKER, remap); + private boolean isSoftTarget; + + public InvokerAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxMember method, List targets) { + super(Constant.ASM_VERSION, Objects.requireNonNull(delegate)); this.data = Objects.requireNonNull(data); - this.delegate = Objects.requireNonNull(delegate); this.method = Objects.requireNonNull(method); this.targets = Objects.requireNonNull(targets); } + @Override + public void visit(String name, Object value) { + if (name.equals(AnnotationElement.VALUE)) { + isSoftTarget = true; + String methodName = Objects.requireNonNull((String) value); + + setAnnotationValue(methodName); + return; + } + + super.visit(name, value); + } + @Override public void visitEnd() { - if (super.remap) { - this.accept(new InvokerSecondPassAnnotationVisitor(data, delegate, method, targets)); - } else { - this.accept(delegate); + if (!isSoftTarget) { + String inferredName = inferMethodName(); + + if (inferredName != null) { + setAnnotationValue(inferredName); + } } super.visitEnd(); } - private static class InvokerSecondPassAnnotationVisitor extends AnnotationVisitor { - private final CommonData data; - private final MxMember method; - private final List targets; - - InvokerSecondPassAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxMember method, List targets) { - super(Constant.ASM_VERSION, delegate); + private void setAnnotationValue(String methodName) { + super.visit(AnnotationElement.VALUE, new NamedMappable(data, methodName, method.getDesc(), targets).result()); + } - this.data = Objects.requireNonNull(data); - this.method = Objects.requireNonNull(method); - this.targets = Objects.requireNonNull(targets); + private String inferMethodName() { + if (method.getName().startsWith("new") || method.getName().startsWith("create")) { + // The rest of the name isn't important, leave it as-is + return null; } - @Override - public void visit(String name, Object value) { - if (name.equals(AnnotationElement.VALUE)) { - String methodName = Objects.requireNonNull((String) value); - String methodDesc = method.getDesc(); + String prefix; - value = new NamedMappable(data, methodName, methodDesc, targets).result(); - } - - super.visit(name, value); + if (method.getName().startsWith("call")) { + prefix = "call"; + } else if (method.getName().startsWith("invoke")) { + prefix = "invoke"; + } else { + throw new RuntimeException(String.format("%s does not start with call or invoke.", method.getName())); } + + return StringUtility.removeCamelPrefix(prefix, method.getName()); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/MixinAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/MixinAnnotationVisitor.java index 5a738292..8622b90a 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/MixinAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/MixinAnnotationVisitor.java @@ -20,98 +20,53 @@ import java.util.List; import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Type; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; -/** - * Required order: {@code remap} [{@code value} | {@code targets}] - *

Pass 1: read remap.

- *

Pass 2: read targets & value; remap targets.

- */ -public class MixinAnnotationVisitor extends FirstPassAnnotationVisitor { +public class MixinAnnotationVisitor extends AnnotationVisitor { private final CommonData data; - private final AnnotationVisitor delegate; - - private final AtomicBoolean remap0; private final List targets; - public MixinAnnotationVisitor(CommonData data, AnnotationVisitor delegate, AtomicBoolean remapOut, List targetsOut) { - super(Annotation.MIXIN, true); + public MixinAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targetsOut) { + super(Constant.ASM_VERSION, Objects.requireNonNull(delegate)); this.data = Objects.requireNonNull(data); - this.delegate = Objects.requireNonNull(delegate); - - this.remap0 = Objects.requireNonNull(remapOut); this.targets = Objects.requireNonNull(targetsOut); } @Override - public void visitEnd() { - this.remap0.set(super.remap); - - // The second pass is needed regardless of remap, because it may have - // children annotation need to remap. - this.accept(new MixinSecondPassAnnotationVisitor(this.data, this.delegate, super.remap, this.targets)); - - super.visitEnd(); - } - - private static class MixinSecondPassAnnotationVisitor extends AnnotationVisitor { - private final CommonData data; - - private final boolean remap; - private final List targets; - - MixinSecondPassAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targetsOut) { - super(Constant.ASM_VERSION, delegate); - - this.data = Objects.requireNonNull(data); - - this.remap = remap; - this.targets = Objects.requireNonNull(targetsOut); - } - - @Override - public AnnotationVisitor visitArray(String name) { - AnnotationVisitor visitor = super.visitArray(name); - - if (name.equals(AnnotationElement.TARGETS)) { - return new AnnotationVisitor(Constant.ASM_VERSION, visitor) { - @Override - public void visit(String name, Object value) { - String srcName = ((String) value).replaceAll("\\s", "").replace('.', '/'); - String dstName = srcName; - - MixinSecondPassAnnotationVisitor.this.targets.add(srcName); - - if (remap) { - dstName = data.mapper.asTrRemapper().map(srcName); - } - - value = dstName; - super.visit(name, value); - } - }; - } else if (name.equals(AnnotationElement.VALUE)) { - return new AnnotationVisitor(Constant.ASM_VERSION, visitor) { - @Override - public void visit(String name, Object value) { - Type srcType = Objects.requireNonNull((Type) value); - - MixinSecondPassAnnotationVisitor.this.targets.add(srcType.getInternalName()); - - super.visit(name, value); - } - }; - } else { - return visitor; - } + public AnnotationVisitor visitArray(String name) { + AnnotationVisitor visitor = super.visitArray(name); + + if (name.equals(AnnotationElement.TARGETS)) { + return new AnnotationVisitor(Constant.ASM_VERSION, visitor) { + @Override + public void visit(String name, Object value) { + String srcName = ((String) value).replaceAll("\\s", "").replace('.', '/'); + + MixinAnnotationVisitor.this.targets.add(srcName); + + value = data.mapper.asTrRemapper().map(srcName); + super.visit(name, value); + } + }; + } else if (name.equals(AnnotationElement.VALUE)) { + return new AnnotationVisitor(Constant.ASM_VERSION, visitor) { + @Override + public void visit(String name, Object value) { + Type srcType = Objects.requireNonNull((Type) value); + + MixinAnnotationVisitor.this.targets.add(srcType.getInternalName()); + + super.visit(name, value); + } + }; + } else { + return visitor; } } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/AtAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/AtAnnotationVisitor.java index c046812d..93c9fa0a 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/AtAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/AtAnnotationVisitor.java @@ -22,6 +22,7 @@ import java.util.Optional; import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.tree.AnnotationNode; import net.fabricmc.tinyremapper.api.TrMember; import net.fabricmc.tinyremapper.extension.mixin.common.IMappable; @@ -31,21 +32,20 @@ import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; import net.fabricmc.tinyremapper.extension.mixin.common.data.Message; -import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.FirstPassAnnotationVisitor; import net.fabricmc.tinyremapper.extension.mixin.soft.data.MemberInfo; /** * {@code @At} require fully-qualified {@link net.fabricmc.tinyremapper.extension.mixin.soft.data.MemberInfo} unless * {@code value = NEW}, in which case a special set of rule applies. */ -class AtAnnotationVisitor extends FirstPassAnnotationVisitor { +class AtAnnotationVisitor extends AnnotationNode { private final CommonData data; private final AnnotationVisitor delegate; private String value; - AtAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap) { - super(Annotation.AT, remap); + AtAnnotationVisitor(CommonData data, AnnotationVisitor delegate) { + super(Constant.ASM_VERSION, Annotation.AT); this.data = Objects.requireNonNull(data); this.delegate = Objects.requireNonNull(delegate); @@ -62,11 +62,7 @@ public void visit(String name, Object value) { @Override public void visitEnd() { - if (remap) { - accept(new AtSecondPassAnnotationVisitor(data, delegate, value)); - } else { - accept(delegate); - } + accept(new AtSecondPassAnnotationVisitor(data, delegate, value)); super.visitEnd(); } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/CommonInjectionAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/CommonInjectionAnnotationVisitor.java index 200a2c42..40d5ddad 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/CommonInjectionAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/CommonInjectionAnnotationVisitor.java @@ -37,7 +37,6 @@ import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant; import net.fabricmc.tinyremapper.extension.mixin.common.data.Message; import net.fabricmc.tinyremapper.extension.mixin.common.data.Pair; -import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.FirstPassAnnotationVisitor; import net.fabricmc.tinyremapper.extension.mixin.soft.data.MemberInfo; /** @@ -45,26 +44,92 @@ * {@code method} element has multiple matches (i.e. no desc), then the non-synthetic * method with the first occurrence in ASM will be remapped. */ -class CommonInjectionAnnotationVisitor extends FirstPassAnnotationVisitor { +class CommonInjectionAnnotationVisitor extends AnnotationVisitor { private final CommonData data; - private final AnnotationVisitor delegate; private final List targets; - CommonInjectionAnnotationVisitor(String descriptor, CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(descriptor, remap); + CommonInjectionAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(Constant.ASM_VERSION, Objects.requireNonNull(delegate)); this.data = Objects.requireNonNull(data); - this.delegate = Objects.requireNonNull(delegate); this.targets = Objects.requireNonNull(targets); } @Override - public void visitEnd() { - // The second pass is needed regardless of remap, because it may have - // children annotation need to remap. - this.accept(new CommonInjectionSecondPassAnnotationVisitor(data, delegate, remap, targets)); + public AnnotationVisitor visitAnnotation(String name, String descriptor) { + AnnotationVisitor av = super.visitAnnotation(name, descriptor); - super.visitEnd(); + if (name.equals(AnnotationElement.AT)) { // @ModifyArg, @ModifyArgs, @Redirect, @ModifyVariable + if (!descriptor.equals(Annotation.AT)) { + throw new RuntimeException("Unexpected annotation " + descriptor); + } + + av = new AtAnnotationVisitor(data, av); + } else if (name.equals(AnnotationElement.SLICE)) { // @ModifyArg, @ModifyArgs, @Redirect, @ModifyVariable + if (!descriptor.equals(Annotation.SLICE)) { + throw new RuntimeException("Unexpected annotation " + descriptor); + } + + av = new SliceAnnotationVisitor(data, av); + } + + return av; + } + + @Override + public AnnotationVisitor visitArray(String name) { + AnnotationVisitor av = super.visitArray(name); + + if (name.equals(AnnotationElement.METHOD)) { // All + return new AnnotationVisitor(Constant.ASM_VERSION, av) { + @Override + public void visit(String name, Object value) { + Optional info = Optional.ofNullable(MemberInfo.parse(Objects.requireNonNull((String) value).replaceAll("\\s", ""))); + + value = info.map(i -> new InjectMethodMappable(data, i, targets).result().toString()).orElse((String) value); + + super.visit(name, value); + } + }; + } else if (name.equals(AnnotationElement.TARGET)) { // All + return new AnnotationVisitor(Constant.ASM_VERSION, av) { + @Override + public AnnotationVisitor visitAnnotation(String name, String descriptor) { + if (!descriptor.equals(Annotation.DESC)) { + throw new RuntimeException("Unexpected annotation " + descriptor); + } + + AnnotationVisitor av1 = super.visitAnnotation(name, descriptor); + return new DescAnnotationVisitor(targets, data, av1, MemberType.METHOD); + } + }; + } else if (name.equals(AnnotationElement.AT)) { // @Inject + return new AnnotationVisitor(Constant.ASM_VERSION, av) { + @Override + public AnnotationVisitor visitAnnotation(String name, String descriptor) { + if (!descriptor.equals(Annotation.AT)) { + throw new RuntimeException("Unexpected annotation " + descriptor); + } + + AnnotationVisitor av1 = super.visitAnnotation(name, descriptor); + return new AtAnnotationVisitor(data, av1); + } + }; + } else if (name.equals(AnnotationElement.SLICE)) { // @Inject @ModifyConstant + return new AnnotationVisitor(Constant.ASM_VERSION, av) { + @Override + public AnnotationVisitor visitAnnotation(String name, String descriptor) { + if (!descriptor.equals(Annotation.SLICE)) { + throw new RuntimeException("Unexpected annotation " + descriptor); + } + + AnnotationVisitor av1 = super.visitAnnotation(name, descriptor); + return new SliceAnnotationVisitor(data, av1); + } + }; + } + + return av; } private static class InjectMethodMappable implements IMappable { @@ -122,99 +187,4 @@ public MemberInfo result() { .orElse(info); } } - - private static class CommonInjectionSecondPassAnnotationVisitor extends AnnotationVisitor { - private final CommonData data; - - private final boolean remap; - private final List targets; - - CommonInjectionSecondPassAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Constant.ASM_VERSION, delegate); - - this.data = Objects.requireNonNull(data); - - this.targets = Objects.requireNonNull(targets); - this.remap = remap; - } - - @Override - public AnnotationVisitor visitAnnotation(String name, String descriptor) { - AnnotationVisitor av = super.visitAnnotation(name, descriptor); - - if (name.equals(AnnotationElement.AT)) { // @ModifyArg, @ModifyArgs, @Redirect, @ModifyVariable - if (!descriptor.equals(Annotation.AT)) { - throw new RuntimeException("Unexpected annotation " + descriptor); - } - - av = new AtAnnotationVisitor(data, av, remap); - } else if (name.equals(AnnotationElement.SLICE)) { // @ModifyArg, @ModifyArgs, @Redirect, @ModifyVariable - if (!descriptor.equals(Annotation.SLICE)) { - throw new RuntimeException("Unexpected annotation " + descriptor); - } - - av = new SliceAnnotationVisitor(data, av, remap); - } - - return av; - } - - @Override - public AnnotationVisitor visitArray(String name) { - AnnotationVisitor av = super.visitArray(name); - - if (name.equals(AnnotationElement.METHOD)) { // All - return new AnnotationVisitor(Constant.ASM_VERSION, av) { - @Override - public void visit(String name, Object value) { - if (remap) { - Optional info = Optional.ofNullable(MemberInfo.parse(Objects.requireNonNull((String) value).replaceAll("\\s", ""))); - - value = info.map(i -> new InjectMethodMappable(data, i, targets).result().toString()).orElse((String) value); - } - - super.visit(name, value); - } - }; - } else if (remap && name.equals(AnnotationElement.TARGET)) { // All - return new AnnotationVisitor(Constant.ASM_VERSION, av) { - @Override - public AnnotationVisitor visitAnnotation(String name, String descriptor) { - if (!descriptor.equals(Annotation.DESC)) { - throw new RuntimeException("Unexpected annotation " + descriptor); - } - - AnnotationVisitor av1 = super.visitAnnotation(name, descriptor); - return new DescAnnotationVisitor(targets, data, av1, MemberType.METHOD); - } - }; - } else if (name.equals(AnnotationElement.AT)) { // @Inject - return new AnnotationVisitor(Constant.ASM_VERSION, av) { - @Override - public AnnotationVisitor visitAnnotation(String name, String descriptor) { - if (!descriptor.equals(Annotation.AT)) { - throw new RuntimeException("Unexpected annotation " + descriptor); - } - - AnnotationVisitor av1 = super.visitAnnotation(name, descriptor); - return new AtAnnotationVisitor(data, av1, remap); - } - }; - } else if (name.equals(AnnotationElement.SLICE)) { // @Inject @ModifyConstant - return new AnnotationVisitor(Constant.ASM_VERSION, av) { - @Override - public AnnotationVisitor visitAnnotation(String name, String descriptor) { - if (!descriptor.equals(Annotation.SLICE)) { - throw new RuntimeException("Unexpected annotation " + descriptor); - } - - AnnotationVisitor av1 = super.visitAnnotation(name, descriptor); - return new SliceAnnotationVisitor(data, av1, remap); - } - }; - } - - return av; - } - } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/InjectAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/InjectAnnotationVisitor.java index 0ba2d40a..958364c4 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/InjectAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/InjectAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class InjectAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public InjectAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.INJECT, data, delegate, remap, targets); + public InjectAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgAnnotationVisitor.java index e54b2625..a35e906f 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class ModifyArgAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public ModifyArgAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MODIFY_ARG, data, delegate, remap, targets); + public ModifyArgAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgsAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgsAnnotationVisitor.java index aa1f5f68..2642bffb 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgsAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyArgsAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class ModifyArgsAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public ModifyArgsAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MODIFY_ARGS, data, delegate, remap, targets); + public ModifyArgsAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyConstantAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyConstantAnnotationVisitor.java index 2afeb702..023ddd02 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyConstantAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyConstantAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class ModifyConstantAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public ModifyConstantAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MODIFY_CONSTANT, data, delegate, remap, targets); + public ModifyConstantAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyExpressionValueAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyExpressionValueAnnotationVisitor.java index 51fc4b88..006468dc 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyExpressionValueAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyExpressionValueAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class ModifyExpressionValueAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public ModifyExpressionValueAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MIXIN_EXTRAS_MODIFY_EXPRESSION_VALUE, data, delegate, remap, targets); + public ModifyExpressionValueAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReceiverAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReceiverAnnotationVisitor.java index 39f34aee..e23165c5 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReceiverAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReceiverAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class ModifyReceiverAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public ModifyReceiverAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MIXIN_EXTRAS_MODIFY_RECEIVER, data, delegate, remap, targets); + public ModifyReceiverAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReturnValueAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReturnValueAnnotationVisitor.java index 3b702230..33c6a3b7 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReturnValueAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyReturnValueAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class ModifyReturnValueAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public ModifyReturnValueAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MIXIN_EXTRAS_MODIFY_RETURN_VALUE, data, delegate, remap, targets); + public ModifyReturnValueAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyVariableAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyVariableAnnotationVisitor.java index 9727f086..8dc6714b 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyVariableAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/ModifyVariableAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class ModifyVariableAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public ModifyVariableAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MODIFY_VARIABLE, data, delegate, remap, targets); + public ModifyVariableAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/RedirectAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/RedirectAnnotationVisitor.java index 2e706fc0..6f9e28c8 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/RedirectAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/RedirectAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class RedirectAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public RedirectAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.REDIRECT, data, delegate, remap, targets); + public RedirectAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/SliceAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/SliceAnnotationVisitor.java index 25baa62a..d3d7362a 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/SliceAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/SliceAnnotationVisitor.java @@ -29,12 +29,10 @@ public class SliceAnnotationVisitor extends AnnotationVisitor { private final CommonData data; - private final boolean remap; - public SliceAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap) { + public SliceAnnotationVisitor(CommonData data, AnnotationVisitor delegate) { super(Constant.ASM_VERSION, delegate); this.data = Objects.requireNonNull(data); - this.remap = remap; } @Override @@ -46,7 +44,7 @@ public AnnotationVisitor visitAnnotation(String name, String descriptor) { throw new RuntimeException("Unexpected annotation " + descriptor); } - av = new AtAnnotationVisitor(data, av, remap); + av = new AtAnnotationVisitor(data, av); } return av; diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapMethodAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapMethodAnnotationVisitor.java index df817bb3..d9d25ec4 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapMethodAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapMethodAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class WrapMethodAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public WrapMethodAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MIXIN_EXTRAS_WRAP_METHOD, data, delegate, remap, targets); + public WrapMethodAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapOperationAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapOperationAnnotationVisitor.java index 99a6d03f..3e00c717 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapOperationAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapOperationAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class WrapOperationAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public WrapOperationAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MIXIN_EXTRAS_WRAP_OPERATION, data, delegate, remap, targets); + public WrapOperationAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionAnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionAnnotationVisitor.java index 1653d094..e39f8282 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionAnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionAnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class WrapWithConditionAnnotationVisitor extends CommonInjectionAnnotationVisitor { - public WrapWithConditionAnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MIXIN_EXTRAS_WRAP_WITH_CONDITION, data, delegate, remap, targets); + public WrapWithConditionAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } } diff --git a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionV2AnnotationVisitor.java b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionV2AnnotationVisitor.java index efc9fc1c..440ce1db 100644 --- a/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionV2AnnotationVisitor.java +++ b/src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/WrapWithConditionV2AnnotationVisitor.java @@ -22,11 +22,10 @@ import org.objectweb.asm.AnnotationVisitor; -import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation; import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData; public class WrapWithConditionV2AnnotationVisitor extends CommonInjectionAnnotationVisitor { - public WrapWithConditionV2AnnotationVisitor(CommonData data, AnnotationVisitor delegate, boolean remap, List targets) { - super(Annotation.MIXIN_EXTRAS_WRAP_WITH_CONDITION_V2, data, delegate, remap, targets); + public WrapWithConditionV2AnnotationVisitor(CommonData data, AnnotationVisitor delegate, List targets) { + super(data, delegate, targets); } }