summaryrefslogtreecommitdiffstats
path: root/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationVisitorReorderer.java
diff options
context:
space:
mode:
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.java42
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());
+ }
+ }
+}