diff options
Diffstat (limited to 'args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationVisitorReorderer.java')
-rw-r--r-- | args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationVisitorReorderer.java | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationVisitorReorderer.java b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationVisitorReorderer.java new file mode 100644 index 0000000..735a2cd --- /dev/null +++ b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationVisitorReorderer.java @@ -0,0 +1,42 @@ +package org.kohsuke.args4j.apt; + +import java.util.*; + +/** + * Reorders the annotation according to their canonical name + */ +public class AnnotationVisitorReorderer implements AnnotationVisitor { + private AnnotationVisitor target; + + private List<OptionWithUsage> arguments = new ArrayList<OptionWithUsage>(); + + public AnnotationVisitorReorderer(AnnotationVisitor target) { + this.target = target; + } + + public void onOption(String name, String usage) { + throw new UnsupportedOperationException("method not used"); + } + + public void onOption(OptionWithUsage optionWithUsage) { + arguments.add(optionWithUsage); + } + + public void done() { + reorderArguments(); + for (OptionWithUsage argument : arguments) { + target.onOption(argument); + } + target.done(); + } + + private void reorderArguments() { + Collections.sort(arguments, new NaturalOrderOptionsComparator()); + } + + private static class NaturalOrderOptionsComparator implements Comparator<OptionWithUsage> { + public int compare(OptionWithUsage o1, OptionWithUsage o2) { + return o1.option.name().compareTo(o2.option.name()); + } + } +} |