diff --git a/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/HandlerForVariableElement.java b/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/HandlerForVariableElement.java index abc670fa..492a08a5 100644 --- a/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/HandlerForVariableElement.java +++ b/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/HandlerForVariableElement.java @@ -19,12 +19,13 @@ package de.steamwar.command; -import de.steamwar.command.handler.RegisterHandler; - +import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.VariableElement; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -69,9 +70,31 @@ public class HandlerForVariableElement implements Handler.ParameterWrapper { @Override public List getAnnotations() { - parameter.getAnnotationMirrors().forEach(annotationMirror -> { - System.out.println(annotationMirror); - }); - return Collections.emptyList(); + List annotations = new ArrayList<>(); + for (AnnotationMirror annotationMirror : parameter.getAnnotationMirrors()) { + Class clazz = getClass(annotationMirror.getAnnotationType().toString()); + if (clazz == null) continue; + annotations.addAll(Arrays.asList(parameter.getAnnotationsByType((Class) clazz))); + } + annotations.removeIf(annotation -> !annotation.annotationType().isAnnotationPresent(Handler.Implementation.class)); + return annotations; + } + + private Class getClass(String name) { + try { + return Class.forName(name); + } catch (ClassNotFoundException e) { + // Ignore + } + if (!name.contains(".")) return null; + Class outerClass = getClass(name.substring(0, name.lastIndexOf('.'))); + if (outerClass == null) return null; + name = name.substring(name.lastIndexOf('.') + 1); + for (Class declaredClass : outerClass.getDeclaredClasses()) { + if (declaredClass.getSimpleName().equals(name)) { + return declaredClass; + } + } + return null; } } diff --git a/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/annotationprocessor/AbstractAnnotationProcessor.java b/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/annotationprocessor/AbstractAnnotationProcessor.java index e0dfbab9..f42aee58 100644 --- a/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/annotationprocessor/AbstractAnnotationProcessor.java +++ b/CommandFramework/CommandFrameworkAnnotationProcessor/src/de/steamwar/command/annotationprocessor/AbstractAnnotationProcessor.java @@ -21,14 +21,16 @@ package de.steamwar.command.annotationprocessor; import de.steamwar.command.Handler; import de.steamwar.command.HandlerForExecutableElement; -import de.steamwar.command.HandlerForVariableElement; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; -import javax.lang.model.element.*; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; import javax.tools.Diagnostic; @@ -75,38 +77,10 @@ public abstract class AbstractAnnotationProcessor extends AbstractProcessor { if (elements.isEmpty()) return false; elements.forEach(element -> { checkMethodAnnotation(element, element.getAnnotation(getAnnotationClass())); - - List parameters = element.getParameters(); - for (int index = 0; index < parameters.size(); index++) { - VariableElement parameter = parameters.get(index); - for (AnnotationMirror annotationMirror : parameter.getAnnotationMirrors()) { - Class clazz = getClass(annotationMirror.getAnnotationType().toString()); - if (clazz == null) return; - checkParameterAnnotation(element, parameter, index, parameter.getAnnotation((Class) clazz)); - } - } }); return false; } - private Class getClass(String name) { - try { - return Class.forName(name); - } catch (ClassNotFoundException e) { - // Ignore - } - if (!name.contains(".")) return null; - Class outerClass = getClass(name.substring(0, name.lastIndexOf('.'))); - if (outerClass == null) return null; - name = name.substring(name.lastIndexOf('.') + 1); - for (Class declaredClass : outerClass.getDeclaredClasses()) { - if (declaredClass.getSimpleName().equals(name)) { - return declaredClass; - } - } - return null; - } - private Handler getHandler(Annotation annotation, Element element) { Handler.Implementation implementation = annotation.annotationType().getAnnotation(Handler.Implementation.class); if (implementation == null) return null; @@ -134,21 +108,6 @@ public abstract class AbstractAnnotationProcessor extends AbstractProcessor { } } - private void checkParameterAnnotation(ExecutableElement method, VariableElement parameter, int index, Annotation annotation) { - Handler handler = getHandler(annotation, parameter); - if (handler == null) return; - if (!(handler instanceof Handler.HandlerParameter)) { - messager.printMessage(Diagnostic.Kind.ERROR, "Handler " + handler.getClass().getName() + " is not a HandlerParameter", method); - return; - } - Handler.HandlerParameter handlerParameter = (Handler.HandlerParameter) handler; - try { - handlerParameter.check(annotation, new HandlerForExecutableElement(method, types, elements), new HandlerForVariableElement(parameter, types, elements, index == method.getParameters().size() - 1 && method.isVarArgs()), index, DataCheckableImpl.INSTANCE); - } catch (Handler.HandlerException e) { - messager.printMessage(Diagnostic.Kind.ERROR, e.getMessage(), parameter); - } - } - private static final class DataCheckableImpl implements Handler.DataCheckable { private static final DataCheckableImpl INSTANCE = new DataCheckableImpl();