Skip to content

Commit 6f35fe1

Browse files
committed
Finalise desc selector and javadoc, enhancements to explicit selector
1 parent ae5bb84 commit 6f35fe1

40 files changed

+1665
-421
lines changed

Diff for: docs/javadoc/mixin.css

+35-2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ table.infoTable {
7272
border-collapse: collapse;
7373
}
7474

75-
table.infoTable td, table.infoTable th, table.cellTable td, table.cellTable th {
75+
table.infoTable td, table.infoTable th, table.cellTable td, table.cellTable th, table.selectorTable td, table.selectorTable th {
7676
padding: 6px 8px;
7777
background-color: #F0F0F0;
7878
}
@@ -81,11 +81,44 @@ table.cellTable th, table.cellTable td {
8181
text-align: center;
8282
}
8383

84-
table.infoTable th, table.cellTable th, table.infoTable td.th, table.cellTable td.th {
84+
table.infoTable th, table.cellTable th, table.infoTable td.th, table.cellTable td.th, table.selectorTable th, table.selectorTable td.th {
8585
background-color: #CCC;
8686
font-weight: bold;
8787
}
8888

89+
table.selectorTable tbody td, table.selectorTable thead th {
90+
border-left: 6px solid #FFF;
91+
}
92+
93+
table.selectorTable tbody td {
94+
font-family: 'Consolas', monospace;
95+
}
96+
97+
table.selectorTable th, table.selectorTable td.th {
98+
background: transparent;
99+
font-family: inherit;
100+
}
101+
102+
table.selectorTable thead th.ownr { background-color: #CFC }
103+
table.selectorTable thead th.name { background-color: #CCF }
104+
table.selectorTable thead th.quan { background-color: #FFC }
105+
table.selectorTable thead th.desc { background-color: #FCC }
106+
107+
table.selectorTable tbody td.ownr { background-color: #F0FFF0 }
108+
table.selectorTable tbody td.name { background-color: #F0F0FF }
109+
table.selectorTable tbody td.quan { background-color: #FFFFF0 }
110+
table.selectorTable tbody td.desc { background-color: #FFF0F0 }
111+
112+
span.aownr { background-color: #DFD }
113+
span.aname { background-color: #DDF }
114+
span.aquan { background-color: #FFD }
115+
span.adesc { background-color: #FDD }
116+
117+
span.ownr {color: #090 }
118+
span.name {color: #009 }
119+
span.quan {color: #990 }
120+
span.desc {color: #900 }
121+
89122
a[name] {
90123
color: #353833;
91124
}

Diff for: src/ap/java/org/spongepowered/tools/obfuscation/AnnotatedMixin.java

-1
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,6 @@ public void registerShadow(ExecutableElement method, AnnotationHandle shadow, bo
384384
}
385385

386386
public void registerInjector(ExecutableElement method, AnnotationHandle inject, InjectorRemap remap) {
387-
System.err.printf(">>> %s\n", method);
388387
this.methods.remove(method);
389388
AnnotatedElementInjector injectorElement = new AnnotatedElementInjector(method, inject, this, remap);
390389
this.injectors.registerInjector(injectorElement);

Diff for: src/ap/java/org/spongepowered/tools/obfuscation/AnnotatedMixinElementHandler.java

+15-5
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ public Object getMethod() {
143143
public IAnnotationHandle getAnnotation(Class<? extends Annotation> annotationClass) {
144144
return AnnotationHandle.of(AnnotatedElementExecutable.this.getElement(), annotationClass);
145145
}
146+
147+
@Override
148+
public String toString() {
149+
return AnnotatedElementExecutable.this.getElement().getSimpleName().toString();
150+
}
146151
};
147152
}
148153

@@ -161,6 +166,11 @@ public String remap(String reference) {
161166
return reference;
162167
}
163168

169+
@Override
170+
public String toString() {
171+
return TypeUtils.getName(this.element);
172+
}
173+
164174
}
165175

166176
/**
@@ -545,12 +555,12 @@ protected final void validateTargetField(VariableElement field, AnnotationHandle
545555
* Checks whether the referenced method exists in all targets and raises
546556
* warnings where appropriate
547557
*/
548-
protected final void validateReferencedTarget(ExecutableElement method, AnnotationHandle inject, ITargetSelector reference, String type) {
549-
if (!(reference instanceof ITargetSelectorByName)) {
558+
protected final void validateReferencedTarget(AnnotatedElementExecutable elem, String reference, ITargetSelector targetSelector, String subject) {
559+
if (!(targetSelector instanceof ITargetSelectorByName)) {
550560
return;
551561
}
552562

553-
ITargetSelectorByName nameRef = (ITargetSelectorByName)reference;
563+
ITargetSelectorByName nameRef = (ITargetSelectorByName)targetSelector;
554564
String signature = nameRef.toDescriptor();
555565

556566
for (TypeHandle target : this.mixin.getTargets()) {
@@ -560,8 +570,8 @@ protected final void validateReferencedTarget(ExecutableElement method, Annotati
560570

561571
MethodHandle targetMethod = target.findMethod(nameRef.getName(), signature);
562572
if (targetMethod == null) {
563-
this.ap.printMessage(Kind.WARNING, "Cannot find target method for " + type + " in " + target, method, inject.asMirror(),
564-
SuppressedBy.TARGET);
573+
this.ap.printMessage(Kind.WARNING, "Cannot find target method \"" + nameRef.getName() + nameRef.getDesc() + "\" for " + subject
574+
+ " in " + target, elem.getElement(), elem.getAnnotation().asMirror(), SuppressedBy.TARGET);
565575
}
566576
}
567577
}

Diff for: src/ap/java/org/spongepowered/tools/obfuscation/AnnotatedMixinElementHandlerInjector.java

+89-82
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.spongepowered.asm.mixin.injection.selectors.ITargetSelectorByName;
4141
import org.spongepowered.asm.mixin.injection.selectors.ITargetSelectorConstructor;
4242
import org.spongepowered.asm.mixin.injection.selectors.ITargetSelectorRemappable;
43+
import org.spongepowered.asm.mixin.injection.selectors.InvalidSelectorException;
4344
import org.spongepowered.asm.mixin.injection.selectors.TargetSelector;
4445
import org.spongepowered.asm.mixin.injection.struct.InjectionPointData;
4546
import org.spongepowered.asm.mixin.injection.struct.InvalidMemberDescriptorException;
@@ -125,6 +126,11 @@ public boolean shouldRemap() {
125126
public AnnotationHandle getAt() {
126127
return this.at;
127128
}
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+
}
128134

129135
@Override
130136
public IAnnotationHandle getSelectorAnnotation() {
@@ -183,33 +189,38 @@ public void registerInjector(AnnotatedElementInjector elem) {
183189
}
184190

185191
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+
}
193207

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()) {
211222
for (TypeHandle target : this.mixin.getTargets()) {
212-
if (!this.registerInjector(elem, reference, targetMember, target)) {
223+
if (!this.registerInjector(elem, reference, (ITargetSelectorRemappable)targetMember, target)) {
213224
break;
214225
}
215226
}
@@ -290,91 +301,87 @@ public void registerInjectionPoint(AnnotatedElementInjectionPoint elem, String f
290301
this.ap.printMessage(Kind.ERROR, "Injector in interface is unsupported", elem.getElement());
291302
}
292303

293-
if (!elem.shouldRemap()) {
304+
String reference = elem.getAt().<String>getValue("target");
305+
if (reference == null) {
294306
return;
295307
}
296308

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+
}
299316

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+
}
305328
}
306329
}
307330

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)) {
310333
return;
311334
}
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+
}
312348

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() + ";"));
336356
}
337-
338-
this.obf.getReferenceManager().addClassMapping(this.classRef, reference, mappings);
339357
}
358+
359+
this.obf.getReferenceManager().addClassMapping(this.classRef, reference, mappings);
340360
}
341-
361+
342362
elem.notifyRemapped();
343363
}
344364

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)) {
347367
return;
348368
}
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());
358371

359372
if (!targetMember.isFullyQualified()) {
360373
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);
362375
return;
363376
}
364377

365-
try {
366-
targetMember.validate();
367-
} catch (InvalidMemberDescriptorException ex) {
368-
this.ap.printMessage(Kind.ERROR, ex.getMessage(), elem.getElement(), errorsOn);
369-
}
370-
371378
try {
372379
if (targetMember.isField()) {
373380
ObfuscationData<MappingField> obfFieldData = this.obf.getDataProvider().getObfFieldRecursive(targetMember);
374381
if (obfFieldData.isEmpty()) {
375382
if (targetMember.getOwner() == null || !SpecialPackages.isExcludedPackage(targetMember.getOwner())) {
376383
this.ap.printMessage(Kind.WARNING, "Cannot find field mapping for " + subject + " '" + reference + "'", elem.getElement(),
377-
errorsOn, SuppressedBy.MAPPING);
384+
errorElement, SuppressedBy.MAPPING);
378385
}
379386
return;
380387
}
@@ -384,7 +391,7 @@ protected final void remapReference(String subject, String reference, AnnotatedE
384391
if (obfMethodData.isEmpty()) {
385392
if (targetMember.getOwner() == null || !SpecialPackages.isExcludedPackage(targetMember.getOwner())) {
386393
this.ap.printMessage(Kind.WARNING, "Cannot find method mapping for " + subject + " '" + reference + "'", elem.getElement(),
387-
errorsOn, SuppressedBy.MAPPING);
394+
errorElement, SuppressedBy.MAPPING);
388395
}
389396
return;
390397
}
@@ -394,7 +401,7 @@ protected final void remapReference(String subject, String reference, AnnotatedE
394401
// Since references are fully-qualified, it shouldn't be possible for there to be multiple mappings, however
395402
// we catch and log the error in case something weird happens in the mapping provider
396403
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);
398405
return;
399406
}
400407

Diff for: src/ap/java/org/spongepowered/tools/obfuscation/ObfuscationEnvironment.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import javax.tools.Diagnostic.Kind;
3838

3939
import org.spongepowered.asm.mixin.injection.selectors.ITargetSelectorRemappable;
40-
import org.spongepowered.asm.mixin.injection.struct.MemberInfo;
4140
import org.spongepowered.asm.obfuscation.mapping.common.MappingField;
4241
import org.spongepowered.asm.obfuscation.mapping.common.MappingMethod;
4342
import org.spongepowered.asm.util.ObfuscationUtil;
@@ -281,7 +280,7 @@ public ITargetSelectorRemappable remapDescriptor(ITargetSelectorRemappable metho
281280
}
282281
}
283282

284-
return transformed ? new MemberInfo(method.getName(), owner, desc, method.getMatchCount() > 1) : null;
283+
return transformed ? method.move(owner).transform(desc) : null;
285284
}
286285

287286
/**

Diff for: src/ap/java/org/spongepowered/tools/obfuscation/mirror/AnnotationHandle.java

+7
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ public AnnotationMirror asMirror() {
8080
*
8181
* @return true if the annotation exists
8282
*/
83+
@Override
8384
public boolean exists() {
8485
return this.annotation != null;
8586
}
@@ -239,6 +240,12 @@ public List<IAnnotationHandle> getAnnotationList(String key) {
239240
return Collections.<IAnnotationHandle>unmodifiableList(annotations);
240241
}
241242

243+
@Override
244+
public Type getTypeValue(String key) {
245+
TypeMirror typeMirror = this.<TypeMirror>getValue(key);
246+
return typeMirror == null ? Type.VOID_TYPE : Type.getType(TypeUtils.getInternalName(typeMirror));
247+
}
248+
242249
@Override
243250
public List<Type> getTypeList(String key) {
244251
List<Type> list = this.<Type>getList(key);

0 commit comments

Comments
 (0)