Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
Ursprung
ee1a82b5d3
Commit
3e38e27b73
@ -26,7 +26,6 @@ import javax.lang.model.SourceVersion;
|
||||
import javax.lang.model.element.*;
|
||||
import javax.lang.model.type.DeclaredType;
|
||||
import javax.tools.Diagnostic;
|
||||
import javax.tools.JavaFileObject;
|
||||
import java.io.Writer;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
@ -111,6 +110,49 @@ public class LinkageProcessor extends AbstractProcessor {
|
||||
fields.add(typeElement.getQualifiedName().toString() + " " + typeElement.getSimpleName().toString());
|
||||
});
|
||||
|
||||
Map<String, TypeElement> eventClasses = new HashMap<>();
|
||||
Map<TypeElement, Map<TypeElement, ExecutableElement>> eventMethods = new HashMap<>();
|
||||
for (Element element : elements) {
|
||||
if (element.getKind() != ElementKind.CLASS) {
|
||||
continue;
|
||||
}
|
||||
TypeElement typeElement = (TypeElement) element;
|
||||
|
||||
typeElement.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.METHOD).map(ExecutableElement.class::cast).filter(e -> {
|
||||
return e.getAnnotationMirrors().stream().anyMatch(annotationMirror -> {
|
||||
return annotationMirror.getAnnotationType().asElement().getSimpleName().toString().equals("EventHandler");
|
||||
});
|
||||
}).forEach(e -> {
|
||||
TypeElement current = ((TypeElement)((DeclaredType) e.getParameters().get(0).asType()).asElement());
|
||||
eventClasses.put(current.getQualifiedName().toString(), current);
|
||||
eventMethods.computeIfAbsent(typeElement, k -> new HashMap<>()).put(current, e);
|
||||
});
|
||||
}
|
||||
if (!eventMethods.isEmpty()) {
|
||||
List<String> eventLines = new ArrayList<>();
|
||||
linkLines.put(LinkageType.LISTENER, eventLines);
|
||||
eventMethods.forEach((typeElement, map) -> {
|
||||
String instance = "local" + typeElement.getSimpleName().toString();
|
||||
eventLines.add(typeElement.getQualifiedName().toString() + " " + instance + " = " + getElement(typeElement, neededFields));
|
||||
map.forEach((typeElement1, executableElement) -> {
|
||||
AnnotationMirror eventHandler = executableElement.getAnnotationMirrors().stream().filter(annotationMirror -> annotationMirror.getAnnotationType().asElement().getSimpleName().toString().equals("EventHandler")).findFirst().orElse(null);
|
||||
if (eventHandler == null) {
|
||||
return;
|
||||
}
|
||||
String priority = "NORMAL";
|
||||
String ignoreCancelled = "false";
|
||||
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : eventHandler.getElementValues().entrySet()) {
|
||||
if (entry.getKey().getSimpleName().toString().equals("priority")) {
|
||||
priority = entry.getValue().getValue().toString();
|
||||
} else if (entry.getKey().getSimpleName().toString().equals("ignoreCancelled")) {
|
||||
ignoreCancelled = entry.getValue().getValue().toString();
|
||||
}
|
||||
}
|
||||
eventLines.add(typeElement1.getSimpleName().toString() + "(" + instance + ", " + instance + "::" + executableElement.getSimpleName().toString() + ", org.bukkit.event.EventPriority." + priority + ", " + ignoreCancelled + ")");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
for (Element element : elements) {
|
||||
if (element.getKind() != ElementKind.CLASS) {
|
||||
continue;
|
||||
@ -184,6 +226,18 @@ public class LinkageProcessor extends AbstractProcessor {
|
||||
writer.write(" }\n");
|
||||
writer.write("\n");
|
||||
}
|
||||
for (Map.Entry<String, TypeElement> entry : eventClasses.entrySet()) {
|
||||
writer.write(" private static org.bukkit.event.HandlerList handlerList" + entry.getValue().getSimpleName().toString() + " = " + entry.getKey() + ".getHandlerList();\n");
|
||||
writer.write(" private static void " + entry.getValue().getSimpleName().toString() + "(org.bukkit.event.Listener listener, java.util.function.Consumer<" + entry.getKey() + "> consumer, org.bukkit.event.EventPriority eventPriority, boolean ignoreCancelled) {\n");
|
||||
writer.write(" org.bukkit.plugin.EventExecutor eventExecutor = (l, event) -> {\n");
|
||||
writer.write(" if (event instanceof " + entry.getKey() + ") {\n");
|
||||
writer.write(" consumer.accept((" + entry.getKey() + ") event);\n");
|
||||
writer.write(" }\n");
|
||||
writer.write(" };\n");
|
||||
writer.write(" handlerList" + entry.getValue().getSimpleName() + ".register(new org.bukkit.plugin.RegisteredListener(listener, eventExecutor, eventPriority, de.steamwar.bausystem.BauSystem.getInstance(), ignoreCancelled));\n");
|
||||
writer.write(" }\n");
|
||||
writer.write("\n");
|
||||
}
|
||||
writer.write("}\n");
|
||||
writer.flush();
|
||||
writer.close();
|
||||
|
@ -29,7 +29,7 @@ public enum LinkageType {
|
||||
ENABLE_LINK("$.enable()", null, "de.steamwar.bausystem.linkage.Enable"),
|
||||
DISABLE_LINK("$.disable()", null, "de.steamwar.bausystem.linkage.Disable"),
|
||||
PLAIN(),
|
||||
LISTENER("org.bukkit.Bukkit.getPluginManager().registerEvents($, de.steamwar.bausystem.BauSystem.getInstance())", null, "org.bukkit.event.Listener"),
|
||||
LISTENER(), // Is handled internally from LinkageProcessor
|
||||
UNLINK_LISTENER("org.bukkit.event.HandlerList.unregisterAll($)", null, "org.bukkit.event.Listener"),
|
||||
|
||||
// SPECIFIC
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren