Skip to content

Commit 3f33ba1

Browse files
committed
Remap @desc targets in injections
1 parent 776f666 commit 3f33ba1

File tree

4 files changed

+53
-3
lines changed

4 files changed

+53
-3
lines changed

src/main/java/org/cadixdev/mercury/mixin/MixinRemapperVisitor.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ public boolean visit(final MethodDeclaration node) {
308308
}
309309
}
310310

311-
// @Inject, @Redirect, @ModifyConstant, & @ModifyVariable
311+
// @Inject, @Redirect, @ModifyConstant, @ModifyVariable
312312
if (Objects.equals(INJECT_CLASS, annotationType)
313313
|| Objects.equals(REDIRECT_CLASS, annotationType)
314314
|| Objects.equals(MODIFY_CONSTANT_CLASS, annotationType)
@@ -344,6 +344,21 @@ else if (pair.getValue() instanceof ArrayInitializer) {
344344
}
345345
}
346346

347+
// Remap the @Desc targets
348+
if ("target".equals(pair.getName().getIdentifier())) {
349+
if (pair.getValue() instanceof Annotation) {
350+
final Annotation original = (Annotation) pair.getValue();
351+
this.remapDescAnnotation(ast, declaringClass, original, inject.getDescTargets()[0]);
352+
}
353+
else if (pair.getValue() instanceof ArrayInitializer) {
354+
final ArrayInitializer array = (ArrayInitializer) pair.getValue();
355+
for (int j = 0; j < array.expressions().size(); j++) {
356+
final Annotation original = (Annotation) array.expressions().get(j);
357+
this.remapDescAnnotation(ast, declaringClass, original, inject.getDescTargets()[j]);
358+
}
359+
}
360+
}
361+
347362
// Remap @At
348363
if (Objects.equals("at", pair.getName().getIdentifier())) {
349364
// it could be a SingleMemberAnnotation here but we don't care about that case

src/main/java/org/cadixdev/mercury/mixin/annotation/InjectData.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class InjectData {
2323
// @Inject(method={"example"}, at=@At(...))
2424
public static InjectData from(final IAnnotationBinding binding) {
2525
InjectTarget[] injectTargets = {};
26+
DescData[] descTargets = {};
2627
AtData[] atData = {};
2728
SliceData[] sliceData = {};
2829

@@ -35,6 +36,14 @@ public static InjectData from(final IAnnotationBinding binding) {
3536
injectTargets[i] = InjectTarget.of((String) raw[i]);
3637
}
3738
}
39+
else if ("target".equals(pair.getName())) {
40+
final Object[] raw = (Object[]) pair.getValue();
41+
42+
descTargets = new DescData[raw.length];
43+
for (int i = 0; i < raw.length; i++) {
44+
descTargets[i] = DescData.from((IAnnotationBinding) raw[i]);
45+
}
46+
}
3847
else if (Objects.equals("at", pair.getName())) {
3948
final Object value = pair.getValue();
4049

@@ -71,15 +80,17 @@ else if (value instanceof IAnnotationBinding) {
7180
}
7281
}
7382

74-
return new InjectData(injectTargets, atData, sliceData);
83+
return new InjectData(injectTargets, descTargets, atData, sliceData);
7584
}
7685

7786
private final InjectTarget[] injectTargets;
87+
private final DescData[] descTargets;
7888
private final AtData[] atData;
7989
private final SliceData[] sliceData;
8090

81-
public InjectData(final InjectTarget[] injectTargets, final AtData[] atData, final SliceData[] sliceData) {
91+
public InjectData(final InjectTarget[] injectTargets, final DescData[] descTargets, final AtData[] atData, final SliceData[] sliceData) {
8292
this.injectTargets = injectTargets;
93+
this.descTargets = descTargets;
8394
this.atData = atData;
8495
this.sliceData = sliceData;
8596
}
@@ -88,6 +99,10 @@ public InjectTarget[] getInjectTargets() {
8899
return this.injectTargets;
89100
}
90101

102+
public DescData[] getDescTargets() {
103+
return this.descTargets;
104+
}
105+
91106
public AtData[] getAtData() {
92107
return this.atData;
93108
}

src/test/resources/mixin/a/TestTargetMixin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public void onStart(final CallbackInfo callbackInfo) {
4949
System.out.println("Hello, world!");
5050
}
5151

52+
@Inject(target = {@Desc("hhj"), @Desc("jjjj")}, at = @At("HEAD"))
53+
public void onStartModernTarget(final CallbackInfo callbackInfo) {
54+
System.out.println("Hello, world!");
55+
}
56+
5257
@Inject(method = {"hhj()V", "jjjj"}, at = @At("HEAD"))
5358
public void onStart2(final CallbackInfo callbackInfo) {
5459
System.out.println("Hello, world!");
@@ -69,6 +74,11 @@ public void injectIntoUnknownMethod(final CallbackInfo callbackInfo) {
6974
System.out.println("Hello from injection part 2!");
7075
}
7176

77+
@Inject(target = @Desc("hhj"), at = @At(value = "INVOKE", target = "Lhj;unknownMethod()V"))
78+
public void injectIntoUnknownMethodModernTarget(final CallbackInfo callbackInfo) {
79+
System.out.println("Hello from injection part 2!");
80+
}
81+
7282
@Inject(method = "hhj", at = {
7383
@At("HEAD"),
7484
@At(value = "INVOKE", target = "Lhj;julp()I"),

src/test/resources/mixin/b/TestTargetMixin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public void onStart(final CallbackInfo callbackInfo) {
4949
System.out.println("Hello, world!");
5050
}
5151

52+
@Inject(target = {@Desc("start"), @Desc("jjjj")}, at = @At("HEAD"))
53+
public void onStartModernTarget(final CallbackInfo callbackInfo) {
54+
System.out.println("Hello, world!");
55+
}
56+
5257
@Inject(method = {"start()V", "jjjj"}, at = @At("HEAD"))
5358
public void onStart2(final CallbackInfo callbackInfo) {
5459
System.out.println("Hello, world!");
@@ -69,6 +74,11 @@ public void injectIntoUnknownMethod(final CallbackInfo callbackInfo) {
6974
System.out.println("Hello from injection part 2!");
7075
}
7176

77+
@Inject(target = @Desc("start"), at = @At(value = "INVOKE", target = "LTestTarget;unknownMethod()V"))
78+
public void injectIntoUnknownMethodModernTarget(final CallbackInfo callbackInfo) {
79+
System.out.println("Hello from injection part 2!");
80+
}
81+
7282
@Inject(method = "start", at = {
7383
@At("HEAD"),
7484
@At(value = "INVOKE", target = "LTestTarget;getAge()I"),

0 commit comments

Comments
 (0)