Skip to content

Commit d1b8102

Browse files
LlamaLad7modmuss50
authored andcommitted
New: Support for MixinExtras @Definitions.
1 parent 6220326 commit d1b8102

File tree

5 files changed

+144
-0
lines changed

5 files changed

+144
-0
lines changed

src/main/java/net/fabricmc/tinyremapper/extension/mixin/common/data/Annotation.java

+2
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,6 @@ public final class Annotation {
7171
public static final String MIXIN_EXTRAS_WRAP_OPERATION = "Lcom/llamalad7/mixinextras/injector/wrapoperation/WrapOperation;";
7272
public static final String MIXIN_EXTRAS_WRAP_WITH_CONDITION = "Lcom/llamalad7/mixinextras/injector/WrapWithCondition;";
7373
public static final String MIXIN_EXTRAS_WRAP_WITH_CONDITION_V2 = "Lcom/llamalad7/mixinextras/injector/v2/WrapWithCondition;";
74+
public static final String MIXIN_EXTRAS_DEFINITIONS = "Lcom/llamalad7/mixinextras/expression/Definitions;";
75+
public static final String MIXIN_EXTRAS_DEFINITION = "Lcom/llamalad7/mixinextras/expression/Definition;";
7476
}

src/main/java/net/fabricmc/tinyremapper/extension/mixin/common/data/AnnotationElement.java

+2
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ public final class AnnotationElement {
3434
public static final String TO = "to";
3535
public static final String SLICE = "slice";
3636
public static final String METHOD = "method";
37+
public static final String DEFINITION_METHOD = "method";
38+
public static final String DEFINITION_FIELD = "field";
3739
}

src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/SoftTargetMixinMethodVisitor.java

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import net.fabricmc.tinyremapper.extension.mixin.common.data.MxMember;
3131
import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.AccessorAnnotationVisitor;
3232
import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.InvokerAnnotationVisitor;
33+
import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection.DefinitionAnnotationVisitor;
34+
import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection.DefinitionsAnnotationVisitor;
3335
import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection.InjectAnnotationVisitor;
3436
import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection.ModifyArgAnnotationVisitor;
3537
import net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection.ModifyArgsAnnotationVisitor;
@@ -93,6 +95,10 @@ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
9395
return new WrapWithConditionAnnotationVisitor(data, av, targets);
9496
case Annotation.MIXIN_EXTRAS_WRAP_WITH_CONDITION_V2:
9597
return new WrapWithConditionV2AnnotationVisitor(data, av, targets);
98+
case Annotation.MIXIN_EXTRAS_DEFINITIONS:
99+
return new DefinitionsAnnotationVisitor(data, av);
100+
case Annotation.MIXIN_EXTRAS_DEFINITION:
101+
return new DefinitionAnnotationVisitor(data, av);
96102
}
97103

98104
return av;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright (c) 2016, 2018, Player, asie
3+
* Copyright (c) 2025, FabricMC
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Lesser General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
19+
package net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection;
20+
21+
import java.util.Objects;
22+
23+
import org.objectweb.asm.AnnotationVisitor;
24+
25+
import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement;
26+
import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData;
27+
import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant;
28+
import net.fabricmc.tinyremapper.extension.mixin.soft.data.MemberInfo;
29+
30+
public class DefinitionAnnotationVisitor extends AnnotationVisitor {
31+
private final CommonData data;
32+
33+
public DefinitionAnnotationVisitor(CommonData data, AnnotationVisitor delegate) {
34+
super(Constant.ASM_VERSION, Objects.requireNonNull(delegate));
35+
36+
this.data = Objects.requireNonNull(data);
37+
}
38+
39+
@Override
40+
public AnnotationVisitor visitArray(String name) {
41+
AnnotationVisitor av = super.visitArray(name);
42+
switch (name) {
43+
case AnnotationElement.DEFINITION_METHOD:
44+
case AnnotationElement.DEFINITION_FIELD:
45+
return new MemberRemappingVisitor(data, av);
46+
}
47+
48+
return av;
49+
}
50+
51+
private static class MemberRemappingVisitor extends AnnotationVisitor {
52+
private final CommonData data;
53+
54+
MemberRemappingVisitor(CommonData data, AnnotationVisitor delegate) {
55+
super(Constant.ASM_VERSION, Objects.requireNonNull(delegate));
56+
57+
this.data = Objects.requireNonNull(data);
58+
}
59+
60+
@Override
61+
public void visit(String name, Object value) {
62+
MemberInfo info = MemberInfo.parse(Objects.requireNonNull((String) value));
63+
64+
if (info != null) {
65+
value = new AtMemberMappable(data, info).result().toString();
66+
}
67+
68+
super.visit(name, value);
69+
}
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Copyright (c) 2016, 2018, Player, asie
3+
* Copyright (c) 2025, FabricMC
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Lesser General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
19+
package net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection;
20+
21+
import java.util.Objects;
22+
23+
import org.objectweb.asm.AnnotationVisitor;
24+
25+
import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement;
26+
import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData;
27+
import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant;
28+
29+
public class DefinitionsAnnotationVisitor extends AnnotationVisitor {
30+
private final CommonData data;
31+
32+
public DefinitionsAnnotationVisitor(CommonData data, AnnotationVisitor delegate) {
33+
super(Constant.ASM_VERSION, Objects.requireNonNull(delegate));
34+
35+
this.data = Objects.requireNonNull(data);
36+
}
37+
38+
@Override
39+
public AnnotationVisitor visitArray(String name) {
40+
AnnotationVisitor av = super.visitArray(name);
41+
42+
if (name.equals(AnnotationElement.VALUE)) {
43+
return new DefinitionRemappingVisitor(data, av);
44+
}
45+
46+
return av;
47+
}
48+
49+
private static class DefinitionRemappingVisitor extends AnnotationVisitor {
50+
private final CommonData data;
51+
52+
DefinitionRemappingVisitor(CommonData data, AnnotationVisitor delegate) {
53+
super(Constant.ASM_VERSION, Objects.requireNonNull(delegate));
54+
55+
this.data = Objects.requireNonNull(data);
56+
}
57+
58+
@Override
59+
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
60+
return new DefinitionAnnotationVisitor(data, super.visitAnnotation(name, descriptor));
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)