Skip to content

Commit 1203b00

Browse files
authored
Remap Desc target in At (#161)
* Remap Desc target in At * Fix Desc target in FIELD At * Fix style
1 parent 269165f commit 1203b00

File tree

6 files changed

+110
-9
lines changed

6 files changed

+110
-9
lines changed

src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/AtAnnotationVisitor.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818

1919
package net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection;
2020

21+
import java.util.List;
2122
import java.util.Objects;
2223

2324
import org.objectweb.asm.AnnotationVisitor;
2425
import org.objectweb.asm.tree.AnnotationNode;
2526

27+
import net.fabricmc.tinyremapper.api.TrMember;
2628
import net.fabricmc.tinyremapper.extension.mixin.common.IMappable;
2729
import net.fabricmc.tinyremapper.extension.mixin.common.data.Annotation;
2830
import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement;
@@ -37,14 +39,16 @@
3739
class AtAnnotationVisitor extends AnnotationNode {
3840
private final CommonData data;
3941
private final AnnotationVisitor delegate;
42+
private final List<String> targets;
4043

4144
private String value;
4245

43-
AtAnnotationVisitor(CommonData data, AnnotationVisitor delegate) {
46+
AtAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List<String> targets) {
4447
super(Constant.ASM_VERSION, Annotation.AT);
4548

4649
this.data = Objects.requireNonNull(data);
4750
this.delegate = Objects.requireNonNull(delegate);
51+
this.targets = Objects.requireNonNull(targets);
4852
}
4953

5054
@Override
@@ -58,20 +62,22 @@ public void visit(String name, Object value) {
5862

5963
@Override
6064
public void visitEnd() {
61-
accept(new AtSecondPassAnnotationVisitor(data, delegate, value));
65+
accept(new AtSecondPassAnnotationVisitor(data, delegate, value, targets));
6266

6367
super.visitEnd();
6468
}
6569

6670
private static class AtSecondPassAnnotationVisitor extends AnnotationVisitor {
6771
private final CommonData data;
6872
private final String value;
73+
private final List<String> targets;
6974

70-
AtSecondPassAnnotationVisitor(CommonData data, AnnotationVisitor delegate, String value) {
75+
AtSecondPassAnnotationVisitor(CommonData data, AnnotationVisitor delegate, String value, List<String> targets) {
7176
super(Constant.ASM_VERSION, delegate);
7277

7378
this.data = Objects.requireNonNull(data);
7479
this.value = Objects.requireNonNull(value);
80+
this.targets = Objects.requireNonNull(targets);
7581
}
7682

7783
@Override
@@ -91,6 +97,21 @@ public void visit(String name, Object value) {
9197
super.visit(name, value);
9298
}
9399

100+
@Override
101+
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
102+
AnnotationVisitor av = super.visitAnnotation(name, descriptor);
103+
104+
if (name.equals(AnnotationElement.DESC)) {
105+
if (!descriptor.equals(Annotation.DESC)) {
106+
throw new RuntimeException("Unexpected annotation " + descriptor);
107+
}
108+
109+
av = new DescAnnotationVisitor(targets, data, av, this.value.equals("FIELD") ? TrMember.MemberType.FIELD : TrMember.MemberType.METHOD);
110+
}
111+
112+
return av;
113+
}
114+
94115
@Override
95116
public AnnotationVisitor visitArray(String name) {
96117
AnnotationVisitor av = super.visitArray(name);

src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/CommonInjectionAnnotationVisitor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ public AnnotationVisitor visitAnnotation(String name, String descriptor) {
6565
throw new RuntimeException("Unexpected annotation " + descriptor);
6666
}
6767

68-
av = new AtAnnotationVisitor(data, av);
68+
av = new AtAnnotationVisitor(data, av, targets);
6969
} else if (name.equals(AnnotationElement.SLICE)) { // @ModifyArg, @ModifyArgs, @Redirect, @ModifyVariable
7070
if (!descriptor.equals(Annotation.SLICE)) {
7171
throw new RuntimeException("Unexpected annotation " + descriptor);
7272
}
7373

74-
av = new SliceAnnotationVisitor(data, av);
74+
av = new SliceAnnotationVisitor(data, av, targets);
7575
}
7676

7777
return av;
@@ -113,7 +113,7 @@ public AnnotationVisitor visitAnnotation(String name, String descriptor) {
113113
}
114114

115115
AnnotationVisitor av1 = super.visitAnnotation(name, descriptor);
116-
return new AtAnnotationVisitor(data, av1);
116+
return new AtAnnotationVisitor(data, av1, targets);
117117
}
118118
};
119119
} else if (name.equals(AnnotationElement.SLICE)) { // @Inject @ModifyConstant
@@ -125,7 +125,7 @@ public AnnotationVisitor visitAnnotation(String name, String descriptor) {
125125
}
126126

127127
AnnotationVisitor av1 = super.visitAnnotation(name, descriptor);
128-
return new SliceAnnotationVisitor(data, av1);
128+
return new SliceAnnotationVisitor(data, av1, targets);
129129
}
130130
};
131131
}

src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/injection/SliceAnnotationVisitor.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package net.fabricmc.tinyremapper.extension.mixin.soft.annotation.injection;
2020

21+
import java.util.List;
2122
import java.util.Objects;
2223

2324
import org.objectweb.asm.AnnotationVisitor;
@@ -29,10 +30,12 @@
2930

3031
public class SliceAnnotationVisitor extends AnnotationVisitor {
3132
private final CommonData data;
33+
private final List<String> targets;
3234

33-
public SliceAnnotationVisitor(CommonData data, AnnotationVisitor delegate) {
35+
public SliceAnnotationVisitor(CommonData data, AnnotationVisitor delegate, List<String> targets) {
3436
super(Constant.ASM_VERSION, delegate);
3537
this.data = Objects.requireNonNull(data);
38+
this.targets = Objects.requireNonNull(targets);
3639
}
3740

3841
@Override
@@ -44,7 +47,7 @@ public AnnotationVisitor visitAnnotation(String name, String descriptor) {
4447
throw new RuntimeException("Unexpected annotation " + descriptor);
4548
}
4649

47-
av = new AtAnnotationVisitor(data, av);
50+
av = new AtAnnotationVisitor(data, av, targets);
4851
}
4952

5053
return av;

src/test/java/net/fabricmc/tinyremapper/extension/mixin/integration/MixinIntegrationTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@
4242
import net.fabricmc.tinyremapper.TinyRemapper;
4343
import net.fabricmc.tinyremapper.extension.mixin.MixinExtension;
4444
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.AmbiguousRemappedNameMixin;
45+
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.DescAtMixin;
4546
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.LvtRemapTargetMixin;
4647
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.NonObfuscatedOverrideMixin;
4748
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.WildcardTargetMixin;
4849
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.AmbiguousRemappedNameTarget;
50+
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.DescAtTarget;
4951
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.LvtRemapTarget;
5052
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.NonObfuscatedOverrideTarget;
5153
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.WildcardTarget;
@@ -109,6 +111,18 @@ public void remapLvtName() throws IOException {
109111
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/ModifyVariable;(method={\"targetRemapped\"}, at=@Lorg/spongepowered/asm/mixin/injection/At;(value=\"HEAD\"), name={\"remappedStr3\"})"));
110112
}
111113

114+
@Test
115+
public void remapDescAt() throws IOException {
116+
String remapped = remap(DescAtTarget.class, DescAtMixin.class, out -> {
117+
String fqn = "net/fabricmc/tinyremapper/extension/mixin/integration/targets/DescAtTarget";
118+
out.acceptClass(fqn, "com/example/Remapped");
119+
out.acceptMethod(new IMappingProvider.Member(fqn, "mainTarget", "(I)V"), "mainTargetRemapped");
120+
out.acceptMethod(new IMappingProvider.Member(fqn, "atTarget", "(Ljava/lang/String;)I"), "at");
121+
});
122+
123+
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/Desc;(args={java.lang.String.class}, ret=int.class, value=\"at\""));
124+
}
125+
112126
private String remap(Class<?> target, Class<?> mixin, IMappingProvider mappings) throws IOException {
113127
Path classpath = createJar(target);
114128
Path input = createJar(mixin);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright (c) 2016, 2018, Player, asie
3+
* Copyright (c) 2026, 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.integration.mixins;
20+
21+
import org.spongepowered.asm.mixin.Mixin;
22+
import org.spongepowered.asm.mixin.injection.At;
23+
import org.spongepowered.asm.mixin.injection.Desc;
24+
import org.spongepowered.asm.mixin.injection.Inject;
25+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
26+
27+
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.DescAtTarget;
28+
29+
@Mixin(DescAtTarget.class)
30+
public class DescAtMixin {
31+
@Inject(method = "mainTarget", at = @At(value = "INVOKE", desc = @Desc(value = "atTarget", args = {String.class}, ret = int.class)))
32+
private void injectAddString(String string, CallbackInfo ci) {
33+
}
34+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright (c) 2016, 2018, Player, asie
3+
* Copyright (c) 2026, 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.integration.targets;
20+
21+
public class DescAtTarget {
22+
public void mainTarget(int a) {
23+
a = atTarget("test");
24+
}
25+
26+
public int atTarget(String param) {
27+
return 0;
28+
}
29+
}

0 commit comments

Comments
 (0)