Skip to content

Commit 5d55be6

Browse files
deirnmodmuss50
andauthored
Remap mixin target owner and desc anyway even if it couldn't be resolved (#156)
* Remap target member owner and desc anyway even if it couldn't be resolved workaround for #155 * Fix tests --------- Co-authored-by: modmuss50 <[email protected]>
1 parent 282a136 commit 5d55be6

File tree

7 files changed

+119
-20
lines changed

7 files changed

+119
-20
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies {
2929
implementation "net.fabricmc:mapping-io:0.7.1"
3030

3131
testImplementation 'org.junit.jupiter:junit-jupiter:5.6.2'
32-
testCompileOnly ('net.fabricmc:sponge-mixin:0.16.2+mixin.0.8.7') {
32+
testImplementation ('net.fabricmc:sponge-mixin:0.16.2+mixin.0.8.7') {
3333
transitive = false
3434
}
3535
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Optional;
2323

2424
import net.fabricmc.tinyremapper.api.TrMember;
25+
import net.fabricmc.tinyremapper.api.TrRemapper;
2526
import net.fabricmc.tinyremapper.extension.mixin.common.IMappable;
2627
import net.fabricmc.tinyremapper.extension.mixin.common.ResolveUtility;
2728
import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData;
@@ -44,16 +45,20 @@ public MemberInfo result() {
4445
return info;
4546
}
4647

48+
TrRemapper trRemapper = data.mapper.asTrRemapper();
4749
Optional<TrMember> resolved = data.resolver.resolveMember(info.getOwner(), info.getName(), info.getDesc(), ResolveUtility.FLAG_UNIQUE | ResolveUtility.FLAG_RECURSIVE);
4850

4951
if (resolved.isPresent()) {
50-
String newOwner = data.mapper.asTrRemapper().map(info.getOwner());
52+
String newOwner = trRemapper.map(info.getOwner());
5153
String newName = data.mapper.mapName(resolved.get());
5254
String newDesc = data.mapper.mapDesc(resolved.get());
5355

5456
return new MemberInfo(newOwner, newName, info.getQuantifier(), newDesc);
55-
} else {
56-
return info;
5757
}
58+
59+
// Workaround for https://github.com/FabricMC/tiny-remapper/issues/155
60+
String newOwner = trRemapper.map(info.getOwner());
61+
String newDesc = info.getType() == TrMember.MemberType.FIELD ? trRemapper.mapDesc(info.getDesc()) : trRemapper.mapMethodDesc(info.getDesc());
62+
return new MemberInfo(newOwner, info.getName(), info.getQuantifier(), newDesc);
5863
}
5964
}

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

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,53 @@
3737
import org.objectweb.asm.util.Textifier;
3838
import org.objectweb.asm.util.TraceClassVisitor;
3939

40+
import net.fabricmc.tinyremapper.IMappingProvider;
4041
import net.fabricmc.tinyremapper.OutputConsumerPath;
4142
import net.fabricmc.tinyremapper.TinyRemapper;
4243
import net.fabricmc.tinyremapper.extension.mixin.MixinExtension;
43-
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.TargetMixin;
44-
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.Target;
44+
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.NonObfuscatedOverrideMixin;
45+
import net.fabricmc.tinyremapper.extension.mixin.integration.mixins.WildcardTargetMixin;
46+
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.NonObfuscatedOverrideTarget;
47+
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.WildcardTarget;
4548

4649
public class MixinIntegrationTest {
4750
@TempDir
48-
static Path folder;
51+
Path folder;
4952

5053
@Test
5154
public void remapWildcardName() throws IOException {
52-
Path classpath = createJar(Target.class);
53-
Path input = createJar(TargetMixin.class);
55+
String remapped = remap(WildcardTarget.class, WildcardTargetMixin.class, out ->
56+
out.acceptClass("java/lang/String", "com/example/NotString"));
57+
58+
// Check constructor inject did not gain a desc
59+
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/Inject;(method={\"<init>*\"}"));
60+
// Check that wildcard desc is remapped without a name
61+
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/Inject;(method={\"*()Lcom/example/NotString;\"}"));
62+
}
63+
64+
@Test
65+
public void remapInvokeNonObfuscatedOverride() throws IOException {
66+
String remapped = remap(NonObfuscatedOverrideTarget.class, NonObfuscatedOverrideMixin.class, out -> {
67+
String fqn = "net/fabricmc/tinyremapper/extension/mixin/integration/targets/NonObfuscatedOverrideTarget";
68+
out.acceptClass(fqn, "com/example/Obfuscated");
69+
out.acceptMethod(new IMappingProvider.Member(fqn, "callAdd", "(Ljava/lang/Object;)V"), "obfuscatedCallAdd");
70+
});
71+
72+
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/Inject;(method={\"obfuscatedCallAdd\""));
73+
// Method is implemented in the target class
74+
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/At;(value=\"INVOKE\", target=\"Lcom/example/Obfuscated;add(Ljava/lang/Object;)Z\""));
75+
// Method is NOT implemented in the target class and instead comes from unobfuscated super class
76+
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/At;(value=\"INVOKE\", target=\"Lcom/example/Obfuscated;addAll(Ljava/util/Collection;)Z\""));
77+
}
78+
79+
private String remap(Class<?> target, Class<?> mixin, IMappingProvider mappings) throws IOException {
80+
Path classpath = createJar(target);
81+
Path input = createJar(mixin);
5482
Path output = folder.resolve("output.jar");
5583

5684
TinyRemapper tinyRemapper = TinyRemapper.newRemapper()
5785
.extension(new MixinExtension())
58-
.withMappings(out -> out.acceptClass("java/lang/String", "com/example/NotString"))
86+
.withMappings(mappings)
5987
.build();
6088

6189
try (OutputConsumerPath outputConsumer = new OutputConsumerPath.Builder(output).build()) {
@@ -65,11 +93,7 @@ public void remapWildcardName() throws IOException {
6593
tinyRemapper.apply(outputConsumer);
6694
}
6795

68-
String remapped = textify(output, TargetMixin.class);
69-
// Check constructor inject did not gain a desc
70-
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/Inject;(method={\"<init>*\"}"));
71-
// Check that wildcard desc is remapped without a name
72-
assertTrue(remapped.contains("@Lorg/spongepowered/asm/mixin/injection/Inject;(method={\"*()Lcom/example/NotString;\"}"));
96+
return textify(output, mixin);
7397
}
7498

7599
// Create a zip file in the temp dir containing only the passed class file.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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.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.Inject;
24+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
25+
26+
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.NonObfuscatedOverrideTarget;
27+
28+
@Mixin(NonObfuscatedOverrideTarget.class)
29+
public class NonObfuscatedOverrideMixin {
30+
@Inject(method = "callAdd", at = @At(value = "INVOKE", target = "Lnet/fabricmc/tinyremapper/extension/mixin/integration/targets/NonObfuscatedOverrideTarget;add(Ljava/lang/Object;)Z"))
31+
private void overridingTarget(Object add, CallbackInfo ci) {
32+
}
33+
34+
@Inject(method = "callAdd", at = @At(value = "INVOKE", target = "Lnet/fabricmc/tinyremapper/extension/mixin/integration/targets/NonObfuscatedOverrideTarget;addAll(Ljava/util/Collection;)Z"))
35+
private void superTarget(Object add, CallbackInfo ci) {
36+
}
37+
}

src/test/java/net/fabricmc/tinyremapper/extension/mixin/integration/mixins/TargetMixin.java renamed to src/test/java/net/fabricmc/tinyremapper/extension/mixin/integration/mixins/WildcardTargetMixin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2525
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
2626

27-
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.Target;
27+
import net.fabricmc.tinyremapper.extension.mixin.integration.targets.WildcardTarget;
2828

29-
@Mixin(Target.class)
30-
public abstract class TargetMixin {
29+
@Mixin(WildcardTarget.class)
30+
public abstract class WildcardTargetMixin {
3131
@Inject(method = "<init>*", at = @At(value = "RETURN"))
3232
private void constructorHook(final CallbackInfo ci) {
3333
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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.integration.targets;
20+
21+
import java.util.ArrayList;
22+
23+
public class NonObfuscatedOverrideTarget<T> extends ArrayList<T> {
24+
@Override
25+
public boolean add(T t) {
26+
return super.add(t);
27+
}
28+
29+
public void callAdd(T t) {
30+
this.add(t);
31+
this.addAll(new ArrayList<>());
32+
}
33+
}

src/test/java/net/fabricmc/tinyremapper/extension/mixin/integration/targets/Target.java renamed to src/test/java/net/fabricmc/tinyremapper/extension/mixin/integration/targets/WildcardTarget.java

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

1919
package net.fabricmc.tinyremapper.extension.mixin.integration.targets;
2020

21-
public class Target {
22-
public Target(String name) {
21+
public class WildcardTarget {
22+
public WildcardTarget(String name) {
2323
}
2424

2525
public String getName() {

0 commit comments

Comments
 (0)