Skip to content

Commit

Permalink
AbstractCommandSpecProcessor#isSubcommand(ExecutableElement, RoundEnv…
Browse files Browse the repository at this point in the history
…ironment):

Simplified
Improved performance
Fixed possible correctness bug if RoundEnvironment#getElementsAnnotatedWith(Class) ever returns an unmodifiable Set
  • Loading branch information
rgoldberg authored and remkop committed Nov 30, 2021
1 parent c12e041 commit a8b863c
Showing 1 changed file with 14 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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<Element> elements = new HashSet<Element>(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<? extends Element> 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<TypeElement> buildTypeHierarchy(TypeElement typeElement) {
Expand Down

0 comments on commit a8b863c

Please sign in to comment.