40
40
import org .spongepowered .asm .mixin .injection .selectors .ITargetSelectorByName ;
41
41
import org .spongepowered .asm .mixin .injection .selectors .ITargetSelectorConstructor ;
42
42
import org .spongepowered .asm .mixin .injection .selectors .ITargetSelectorRemappable ;
43
+ import org .spongepowered .asm .mixin .injection .selectors .InvalidSelectorException ;
43
44
import org .spongepowered .asm .mixin .injection .selectors .TargetSelector ;
44
45
import org .spongepowered .asm .mixin .injection .struct .InjectionPointData ;
45
46
import org .spongepowered .asm .mixin .injection .struct .InvalidMemberDescriptorException ;
@@ -125,6 +126,11 @@ public boolean shouldRemap() {
125
126
public AnnotationHandle getAt () {
126
127
return this .at ;
127
128
}
129
+
130
+ public AnnotationMirror getAtErrorElement (CompilerEnvironment compilerEnvironment ) {
131
+ // JDT supports hanging the error on the @At annotation directly, doing this in javac doesn't work
132
+ return (compilerEnvironment == CompilerEnvironment .JDT ? this .getAt () : this .getAnnotation ()).asMirror ();
133
+ }
128
134
129
135
@ Override
130
136
public IAnnotationHandle getSelectorAnnotation () {
@@ -183,33 +189,38 @@ public void registerInjector(AnnotatedElementInjector elem) {
183
189
}
184
190
185
191
for (String reference : elem .getAnnotation ().<String >getList ("method" )) {
186
- ITargetSelector targetSelector = TargetSelector .parse (reference , elem );
187
-
188
- try {
189
- targetSelector .validate ();
190
- } catch (InvalidMemberDescriptorException ex ) {
191
- elem .printMessage (this .ap , Kind .ERROR , ex .getMessage ());
192
- }
192
+ this .registerInjectorTarget (elem , reference , TargetSelector .parse (reference , elem ), elem + ".method=\" " + reference + "\" " );
193
+ }
194
+
195
+ for (IAnnotationHandle desc : elem .getAnnotation ().getAnnotationList ("target" )) {
196
+ String subject = String .format ("%s.target=@Desc(id = \" %s\" )" , elem , desc .<String >getValue ("id" , "" ));
197
+ this .registerInjectorTarget (elem , null , TargetSelector .parse (desc , elem ), subject );
198
+ }
199
+ }
200
+
201
+ private void registerInjectorTarget (AnnotatedElementInjector elem , String reference , ITargetSelector targetSelector , String subject ) {
202
+ try {
203
+ targetSelector .validate ();
204
+ } catch (InvalidSelectorException ex ) {
205
+ elem .printMessage (this .ap , Kind .ERROR , ex .getMessage ());
206
+ }
193
207
194
- if (!(targetSelector instanceof ITargetSelectorRemappable )) {
195
- continue ;
196
- }
197
-
198
- ITargetSelectorRemappable targetMember = (ITargetSelectorRemappable )targetSelector ;
199
- if (targetMember .getName () == null ) {
200
- continue ;
201
- }
202
-
203
- if (targetMember .getDesc () != null ) {
204
- this .validateReferencedTarget (elem .getElement (), elem .getAnnotation (), targetMember , elem .toString ());
205
- }
206
-
207
- if (!elem .shouldRemap ()) {
208
- continue ;
209
- }
210
-
208
+ if (!(targetSelector instanceof ITargetSelectorByName )) {
209
+ return ;
210
+ }
211
+
212
+ ITargetSelectorByName targetMember = (ITargetSelectorByName )targetSelector ;
213
+ if (targetMember .getName () == null ) {
214
+ return ;
215
+ }
216
+
217
+ if (targetMember .getDesc () != null ) {
218
+ this .validateReferencedTarget (elem , reference , targetMember , subject );
219
+ }
220
+
221
+ if (targetSelector instanceof ITargetSelectorRemappable && elem .shouldRemap ()) {
211
222
for (TypeHandle target : this .mixin .getTargets ()) {
212
- if (!this .registerInjector (elem , reference , targetMember , target )) {
223
+ if (!this .registerInjector (elem , reference , ( ITargetSelectorRemappable ) targetMember , target )) {
213
224
break ;
214
225
}
215
226
}
@@ -290,91 +301,87 @@ public void registerInjectionPoint(AnnotatedElementInjectionPoint elem, String f
290
301
this .ap .printMessage (Kind .ERROR , "Injector in interface is unsupported" , elem .getElement ());
291
302
}
292
303
293
- if (!elem .shouldRemap ()) {
304
+ String reference = elem .getAt ().<String >getValue ("target" );
305
+ if (reference == null ) {
294
306
return ;
295
307
}
296
308
297
- String type = InjectionPointData .parseType (elem .getAt ().<String >getValue ("value" ));
298
- String target = elem .getAt ().<String >getValue ("target" );
309
+ ITargetSelector selector = TargetSelector .parse (reference , elem );
310
+
311
+ try {
312
+ selector .validate ();
313
+ } catch (InvalidMemberDescriptorException ex ) {
314
+ this .ap .printMessage (Kind .ERROR , ex .getMessage (), elem .getElement (), elem .getAtErrorElement (this .ap .getCompilerEnvironment ()));
315
+ }
299
316
300
- if ("NEW" .equals (type )) {
301
- this .remapNewTarget (String .format (format , type + ".<target>" ), target , elem );
302
- this .remapNewTarget (String .format (format , type + ".args[class]" ), elem .getAtArg ("class" ), elem );
303
- } else {
304
- this .remapReference (String .format (format , type + ".<target>" ), target , elem );
317
+ if (elem .shouldRemap ()) {
318
+ String type = InjectionPointData .parseType (elem .getAt ().<String >getValue ("value" ));
319
+ if ("NEW" .equals (type )) {
320
+ String classReference = elem .getAtArg ("class" );
321
+ ITargetSelector classSelector = TargetSelector .parse (classReference , elem );
322
+
323
+ this .remapNewTarget (String .format (format , type + ".<target>" ), reference , selector , elem );
324
+ this .remapNewTarget (String .format (format , type + ".args[class]" ), classReference , classSelector , elem );
325
+ } else {
326
+ this .remapReference (String .format (format , type + ".<target>" ), reference , selector , elem );
327
+ }
305
328
}
306
329
}
307
330
308
- protected final void remapNewTarget (String subject , String reference , AnnotatedElementInjectionPoint elem ) {
309
- if (reference == null ) {
331
+ protected final void remapNewTarget (String subject , String reference , ITargetSelector selector , AnnotatedElementInjectionPoint elem ) {
332
+ if (!( selector instanceof ITargetSelectorConstructor ) ) {
310
333
return ;
311
334
}
335
+
336
+ ITargetSelectorConstructor member = (ITargetSelectorConstructor )selector ;
337
+ String target = member .toCtorType ();
338
+
339
+ if (target != null ) {
340
+ String desc = member .toCtorDesc ();
341
+ MappingMethod m = new MappingMethod (target , "." , desc != null ? desc : "()V" );
342
+ ObfuscationData <MappingMethod > remapped = this .obf .getDataProvider ().getRemappedMethod (m );
343
+ if (remapped .isEmpty () && !SpecialPackages .isExcludedPackage (member .toCtorType ())) {
344
+ this .ap .printMessage (Kind .WARNING , "Cannot find class mapping for " + subject + " '" + target + "'" , elem .getElement (),
345
+ elem .getAnnotation ().asMirror (), SuppressedBy .MAPPING );
346
+ return ;
347
+ }
312
348
313
- ITargetSelector selector = TargetSelector .parse (reference , elem );
314
- if (selector instanceof ITargetSelectorConstructor ) {
315
- ITargetSelectorConstructor member = (ITargetSelectorConstructor )selector ;
316
- String target = member .toCtorType ();
317
-
318
- if (target != null ) {
319
- String desc = member .toCtorDesc ();
320
- MappingMethod m = new MappingMethod (target , "." , desc != null ? desc : "()V" );
321
- ObfuscationData <MappingMethod > remapped = this .obf .getDataProvider ().getRemappedMethod (m );
322
- if (remapped .isEmpty () && !SpecialPackages .isExcludedPackage (member .toCtorType ())) {
323
- this .ap .printMessage (Kind .WARNING , "Cannot find class mapping for " + subject + " '" + target + "'" , elem .getElement (),
324
- elem .getAnnotation ().asMirror (), SuppressedBy .MAPPING );
325
- return ;
326
- }
327
-
328
- ObfuscationData <String > mappings = new ObfuscationData <String >();
329
- for (ObfuscationType type : remapped ) {
330
- MappingMethod mapping = remapped .get (type );
331
- if (desc == null ) {
332
- mappings .put (type , mapping .getOwner ());
333
- } else {
334
- mappings .put (type , mapping .getDesc ().replace (")V" , ")L" + mapping .getOwner () + ";" ));
335
- }
349
+ ObfuscationData <String > mappings = new ObfuscationData <String >();
350
+ for (ObfuscationType type : remapped ) {
351
+ MappingMethod mapping = remapped .get (type );
352
+ if (desc == null ) {
353
+ mappings .put (type , mapping .getOwner ());
354
+ } else {
355
+ mappings .put (type , mapping .getDesc ().replace (")V" , ")L" + mapping .getOwner () + ";" ));
336
356
}
337
-
338
- this .obf .getReferenceManager ().addClassMapping (this .classRef , reference , mappings );
339
357
}
358
+
359
+ this .obf .getReferenceManager ().addClassMapping (this .classRef , reference , mappings );
340
360
}
341
-
361
+
342
362
elem .notifyRemapped ();
343
363
}
344
364
345
- protected final void remapReference (String subject , String reference , AnnotatedElementInjectionPoint elem ) {
346
- if (reference == null ) {
365
+ protected final void remapReference (String subject , String reference , ITargetSelector selector , AnnotatedElementInjectionPoint elem ) {
366
+ if (!( selector instanceof ITargetSelectorRemappable ) ) {
347
367
return ;
348
368
}
349
-
350
- ITargetSelector targetSelector = TargetSelector .parse (reference , elem );
351
- if (!(targetSelector instanceof ITargetSelectorRemappable )) {
352
- return ;
353
- }
354
- ITargetSelectorRemappable targetMember = (ITargetSelectorRemappable )targetSelector ;
355
-
356
- // JDT supports hanging the error on the @At annotation directly, doing this in javac doesn't work
357
- AnnotationMirror errorsOn = (this .ap .getCompilerEnvironment () == CompilerEnvironment .JDT ? elem .getAt () : elem .getAnnotation ()).asMirror ();
369
+ ITargetSelectorRemappable targetMember = (ITargetSelectorRemappable )selector ;
370
+ AnnotationMirror errorElement = elem .getAtErrorElement (this .ap .getCompilerEnvironment ());
358
371
359
372
if (!targetMember .isFullyQualified ()) {
360
373
String missing = targetMember .getOwner () == null ? (targetMember .getDesc () == null ? "owner and signature" : "owner" ) : "signature" ;
361
- this .ap .printMessage (Kind .ERROR , subject + " is not fully qualified, missing " + missing , elem .getElement (), errorsOn );
374
+ this .ap .printMessage (Kind .ERROR , subject + " is not fully qualified, missing " + missing , elem .getElement (), errorElement );
362
375
return ;
363
376
}
364
377
365
- try {
366
- targetMember .validate ();
367
- } catch (InvalidMemberDescriptorException ex ) {
368
- this .ap .printMessage (Kind .ERROR , ex .getMessage (), elem .getElement (), errorsOn );
369
- }
370
-
371
378
try {
372
379
if (targetMember .isField ()) {
373
380
ObfuscationData <MappingField > obfFieldData = this .obf .getDataProvider ().getObfFieldRecursive (targetMember );
374
381
if (obfFieldData .isEmpty ()) {
375
382
if (targetMember .getOwner () == null || !SpecialPackages .isExcludedPackage (targetMember .getOwner ())) {
376
383
this .ap .printMessage (Kind .WARNING , "Cannot find field mapping for " + subject + " '" + reference + "'" , elem .getElement (),
377
- errorsOn , SuppressedBy .MAPPING );
384
+ errorElement , SuppressedBy .MAPPING );
378
385
}
379
386
return ;
380
387
}
@@ -384,7 +391,7 @@ protected final void remapReference(String subject, String reference, AnnotatedE
384
391
if (obfMethodData .isEmpty ()) {
385
392
if (targetMember .getOwner () == null || !SpecialPackages .isExcludedPackage (targetMember .getOwner ())) {
386
393
this .ap .printMessage (Kind .WARNING , "Cannot find method mapping for " + subject + " '" + reference + "'" , elem .getElement (),
387
- errorsOn , SuppressedBy .MAPPING );
394
+ errorElement , SuppressedBy .MAPPING );
388
395
}
389
396
return ;
390
397
}
@@ -394,7 +401,7 @@ protected final void remapReference(String subject, String reference, AnnotatedE
394
401
// Since references are fully-qualified, it shouldn't be possible for there to be multiple mappings, however
395
402
// we catch and log the error in case something weird happens in the mapping provider
396
403
this .ap .printMessage (Kind .ERROR , "Unexpected reference conflict for " + subject + ": " + reference + " -> "
397
- + ex .getNew () + " previously defined as " + ex .getOld (), elem .getElement (), errorsOn );
404
+ + ex .getNew () + " previously defined as " + ex .getOld (), elem .getElement (), errorElement );
398
405
return ;
399
406
}
400
407
0 commit comments