Add simple annotation processor, generate shaded processor JAR

This commit is contained in:
Kai S. K. Engelbart 2021-02-14 14:34:19 +01:00
parent fd255d65cc
commit 023acb9172
Signed by: kske
GPG Key ID: 8BEB13EC5DF7EF13
5 changed files with 124 additions and 0 deletions

View File

@ -27,5 +27,31 @@
<!-- Disable test folder -->
<testSourceDirectory />
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-proc:none</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,78 @@
package dev.kske.eventbus.ap;
import java.util.Set;
import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import javax.tools.Diagnostic.Kind;
import dev.kske.eventbus.core.*;
/**
* This annotation processor checks event handlers for common mistakes which can only be detected
* during runtime otherwise.
*
* @author Kai S. K. Engelbart
* @since 1.0.0
*/
@SupportedAnnotationTypes("dev.kske.eventbus.core.Event")
@SupportedSourceVersion(SourceVersion.RELEASE_11)
public class EventProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Event.class)) {
ExecutableElement method = (ExecutableElement) annotatedElement;
Event eventAnnotation = method.getAnnotation(Event.class);
boolean useParameter = false;
// Determine how the event type is defined
try {
eventAnnotation.eventType();
} catch (MirroredTypeException e) {
// Task failed successfully
useParameter = processingEnv.getTypeUtils().isSameType(e.getTypeMirror(),
processingEnv.getElementUtils()
.getTypeElement(Event.USE_PARAMETER.class.getCanonicalName()).asType());
}
// Check for correct method signature and return type
if (method.getParameters().size() == 0 && useParameter)
error(method, "The method or the annotation should define the event type");
if (method.getParameters().size() == 1 && !useParameter)
error(method, "Either the method or the annotation should define the event type");
if (method.getParameters().size() > 1)
error(method, "Method should not have more than one parameter");
if (!method.getReturnType().getKind().equals(TypeKind.VOID))
error(method, "Method needs a return type of void");
// Check event type
var paramType = ((ExecutableType) method.asType()).getParameterTypes().get(0);
if (useParameter && !processingEnv.getTypeUtils().isAssignable(paramType,
processingEnv.getElementUtils()
.getTypeElement(IEvent.class.getCanonicalName()).asType()))
error(method.getParameters().get(0), "Parameter should implement IEvent");
// Check listener for interface implementation
if (!((TypeElement) method.getEnclosingElement()).getInterfaces().contains(processingEnv
.getElementUtils().getTypeElement(EventListener.class.getCanonicalName()).asType()))
warning(method.getEnclosingElement(),
"Class should implement EventListener interface");
}
return true;
}
private void warning(Element e, String msg, Object... args) {
processingEnv.getMessager().printMessage(Kind.WARNING, String.format(msg, args), e);
}
private void error(Element e, String msg, Object... args) {
processingEnv.getMessager().printMessage(Kind.ERROR, String.format(msg, args), e);
}
}

View File

@ -0,0 +1,7 @@
/**
* Contains the Event Bus annotation processor.
*
* @author Kai S. K. Engelbart
* @since 1.0.0
*/
package dev.kske.eventbus.ap;

View File

@ -0,0 +1,12 @@
/**
* Contains an annotation processor for checking for errors related to the
* {@link dev.kske.eventbus.core.Event} annotation from Event Bus.
*
* @author Kai S. K. Engelbart
* @since 1.0.0
*/
module dev.kske.eventbus.ap {
requires java.compiler;
requires dev.kske.eventbus.core;
}

View File

@ -0,0 +1 @@
dev.kske.eventbus.ap.EventProcessor