From a8b863c8bf049c7e810cca0f7fe12bff6134c725 Mon Sep 17 00:00:00 2001 From: Ross Goldberg <484615+rgoldberg@users.noreply.github.com> Date: Mon, 29 Nov 2021 06:13:29 -0500 Subject: [PATCH] AbstractCommandSpecProcessor#isSubcommand(ExecutableElement, RoundEnvironment): Simplified Improved performance Fixed possible correctness bug if RoundEnvironment#getElementsAnnotatedWith(Class) ever returns an unmodifiable Set --- .../AbstractCommandSpecProcessor.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/picocli-codegen/src/main/java/picocli/codegen/annotation/processing/AbstractCommandSpecProcessor.java b/picocli-codegen/src/main/java/picocli/codegen/annotation/processing/AbstractCommandSpecProcessor.java index 354e62831..60f0feb29 100644 --- a/picocli-codegen/src/main/java/picocli/codegen/annotation/processing/AbstractCommandSpecProcessor.java +++ b/picocli-codegen/src/main/java/picocli/codegen/annotation/processing/AbstractCommandSpecProcessor.java @@ -59,6 +59,7 @@ import java.util.logging.Logger; import static java.lang.String.format; +import static java.util.Collections.disjoint; import static javax.lang.model.element.ElementKind.ENUM; /** @@ -301,18 +302,20 @@ private void updateCommandFromMethodElement(ExecutableElement method, Context co private boolean isSubcommand(ExecutableElement method, RoundEnvironment roundEnv) { Element typeElement = method.getEnclosingElement(); Command cmd = typeElement.getAnnotation(Command.class); - if (cmd == null) { - Set elements = new HashSet(typeElement.getEnclosedElements()); - - // The class is a Command if it has any fields or methods annotated with the below: - return roundEnv.getElementsAnnotatedWith(Option.class).removeAll(elements) - || roundEnv.getElementsAnnotatedWith(Parameters.class).removeAll(elements) - || roundEnv.getElementsAnnotatedWith(Mixin.class).removeAll(elements) - || roundEnv.getElementsAnnotatedWith(ArgGroup.class).removeAll(elements) - || roundEnv.getElementsAnnotatedWith(Unmatched.class).removeAll(elements) - || roundEnv.getElementsAnnotatedWith(Spec.class).removeAll(elements); + + if (cmd != null) { + return cmd.addMethodSubcommands(); } - return cmd.addMethodSubcommands(); + + List elements = typeElement.getEnclosedElements(); + + // The class is a Command if it has any fields or methods annotated with the below: + return !disjoint(roundEnv.getElementsAnnotatedWith(Option.class), elements) + || !disjoint(roundEnv.getElementsAnnotatedWith(Parameters.class), elements) + || !disjoint(roundEnv.getElementsAnnotatedWith(Mixin.class), elements) + || !disjoint(roundEnv.getElementsAnnotatedWith(ArgGroup.class), elements) + || !disjoint(roundEnv.getElementsAnnotatedWith(Unmatched.class), elements) + || !disjoint(roundEnv.getElementsAnnotatedWith(Spec.class), elements); } private Stack buildTypeHierarchy(TypeElement typeElement) {