package joist.sourcegen; import java.util.ArrayList; import java.util.List; public class Argument { public final String type; public final String name; public static Argument arg(Class<?> type, String name) { return new Argument(type.getName(), name); } public static Argument arg(String type, String name) { return new Argument(type, name); } /** @param typesAndNames can be one "Foo f, Bar b" or multiple "Foo f", "Bar b" */ public static List<Argument> split(String... typesAndNames) { List<Argument> arguments = new ArrayList<Argument>(); if (typesAndNames.length == 1) { String line = typesAndNames[0].trim(); if (line.length() == 0) { return arguments; } int last = 0; int parenCount = 0; int current = 0; for (; current < line.length(); current++) { if (line.charAt(current) == '<') { parenCount++; } else if (line.charAt(current) == '>') { parenCount--; } else if (line.charAt(current) == ',' && parenCount == 0) { arguments.add(new Argument(line.substring(last, current))); last = current + 1; } } arguments.add(new Argument(line.substring(last, current))); } else { for (String typeAndName : typesAndNames) { arguments.add(new Argument(typeAndName)); } } return arguments; } public Argument(String typeAndName) { int lastSpace = typeAndName.lastIndexOf(' '); if (lastSpace == -1) { throw new IllegalArgumentException("No space in typeAndName " + typeAndName); } this.type = typeAndName.substring(0, lastSpace).trim(); this.name = typeAndName.substring(lastSpace + 1).trim(); } public Argument(String type, String name) { this.type = type; this.name = name; } public Argument importIfPossible(GClass gclass) { return new Argument(gclass.stripAndImportPackageIfPossible(this.type), this.name); } public String toString() { return this.type + " " + this.name; } }