diff --git a/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java b/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java index ef3e2798..242aaa0f 100644 --- a/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java +++ b/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java @@ -406,13 +406,16 @@ public final class AnnotationParser { final @NonNull Object instance, final @NonNull Collection<@NonNull CommandMethodPair> methodPairs ) { + final CommandMethod classCommandMethod = instance.getClass().getAnnotation(CommandMethod.class); + final String syntaxPrefix = classCommandMethod == null ? "" : (classCommandMethod.value() + " "); final Collection> commands = new ArrayList<>(); for (final CommandMethodPair commandMethodPair : methodPairs) { final CommandMethod commandMethod = commandMethodPair.getCommandMethod(); final Method method = commandMethodPair.getMethod(); - final List tokens = this.syntaxParser.apply(commandMethod.value()); + final String syntax = syntaxPrefix + commandMethod.value(); + final List tokens = this.syntaxParser.apply(syntax); /* Determine command name */ - final String commandToken = commandMethod.value().split(" ")[0].split("\\|")[0]; + final String commandToken = syntax.split(" ")[0].split("\\|")[0]; @SuppressWarnings("rawtypes") final CommandManager manager = this.manager; final SimpleCommandMeta.Builder metaBuilder = SimpleCommandMeta.builder() .with(this.metaFactory.apply(method)); diff --git a/cloud-annotations/src/main/java/cloud/commandframework/annotations/CommandMethod.java b/cloud-annotations/src/main/java/cloud/commandframework/annotations/CommandMethod.java index a1969773..bbabd8c1 100644 --- a/cloud-annotations/src/main/java/cloud/commandframework/annotations/CommandMethod.java +++ b/cloud-annotations/src/main/java/cloud/commandframework/annotations/CommandMethod.java @@ -34,7 +34,7 @@ import java.lang.annotation.Target; * Used to declare a class method as a command method */ @Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.TYPE}) public @interface CommandMethod { /** diff --git a/cloud-annotations/src/test/java/cloud/commandframework/annotations/AnnotationParserTest.java b/cloud-annotations/src/test/java/cloud/commandframework/annotations/AnnotationParserTest.java index 46b41fc9..836f59b2 100644 --- a/cloud-annotations/src/test/java/cloud/commandframework/annotations/AnnotationParserTest.java +++ b/cloud-annotations/src/test/java/cloud/commandframework/annotations/AnnotationParserTest.java @@ -37,6 +37,7 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.meta.SimpleCommandMeta; import io.leangen.geantyref.TypeToken; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -91,7 +92,9 @@ class AnnotationParserTest { (injector, builder) -> builder.argument(IntegerArgument.of(injector.value())) ); /* Parse the class. Required for both testMethodConstruction() and testNamedSuggestionProvider() */ - commands = annotationParser.parse(this); + commands = new ArrayList<>(); + commands.addAll(annotationParser.parse(this)); + commands.addAll(annotationParser.parse(new ClassCommandMethod())); } @Test @@ -104,6 +107,7 @@ class AnnotationParserTest { manager.executeCommand(new TestCommandSender(), "test 101").join()); manager.executeCommand(new TestCommandSender(), "flagcommand -p").join(); manager.executeCommand(new TestCommandSender(), "flagcommand --print --word peanut").join(); + manager.executeCommand(new TestCommandSender(), "class method").join(); } @Test @@ -253,6 +257,16 @@ class AnnotationParserTest { System.out.printf("Injected value: %s\n", injectableValue.toString()); } + @CommandMethod("class") + private static class ClassCommandMethod { + + @CommandMethod("method") + public void annotatedMethod() { + System.out.println("kekw"); + } + + } + @CommandPermission("some.permission") @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)