From 82bf9dcd75c00667010c07c9634e3bb5921ebce9 Mon Sep 17 00:00:00 2001 From: Jamie Doornbos Date: Tue, 14 Jun 2011 08:25:12 +0000 Subject: [PATCH] Make actionscript streamable sort and gorup the imports according to the aspirin convention. This doesn't yet accomodate imports that were added for non-generated blocks, but is very close to not requiring any postprocessing for the streamable who code, i.e. touchin mah filez git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6655 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../tools/GenActionScriptStreamableTask.java | 2 +- .../threerings/presents/tools/ImportSet.java | 63 +++++++++++++++++++ .../threerings/presents/tools/enum_as.tmpl | 7 ++- .../presents/tools/streamable_as.tmpl | 7 ++- 4 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java index 27481c7e2..e52d1538e 100644 --- a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java +++ b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java @@ -137,7 +137,7 @@ public class GenActionScriptStreamableTask extends GenTask "header", existing == null ? _header : "", "package", sclass.getPackage().getName(), "classname", ActionScriptUtils.toSimpleName(sclass), - "imports", imports.toList(), + "importGroups", imports.toGroups(), "extends", extendsName, "implements", Joiner.on(", ").join(implemented), "superclassStreamable", reqs.superclassStreamable, diff --git a/src/main/java/com/threerings/presents/tools/ImportSet.java b/src/main/java/com/threerings/presents/tools/ImportSet.java index d34a2f41b..e622ff8f3 100644 --- a/src/main/java/com/threerings/presents/tools/ImportSet.java +++ b/src/main/java/com/threerings/presents/tools/ImportSet.java @@ -21,11 +21,14 @@ package com.threerings.presents.tools; +import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; +import com.google.common.collect.ComparisonChain; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -319,6 +322,37 @@ public class ImportSet } } + /** + * Converts the set of imports to groups of class names, according to conventional package + * ordering and spacing. Within each group, sorting is alphabetical. + */ + public List> toGroups () + { + List list = Lists.newArrayList(_imports); + Collections.sort(list, new Comparator() { + public int compare (String class1, String class2) { + return ComparisonChain.start() + .compare(findImportGroup(class1), findImportGroup(class2)) + .compare(class1, class2) + .result(); + } + }); + List> result = Lists.newArrayList(); + List current = null; + int lastGroup = -1; + for (String imp : list) { + int group = findImportGroup(imp); + if (group != lastGroup) { + if (current == null || !current.isEmpty()) { + result.add(current = Lists.newArrayList()); + } + lastGroup = group; + } + current.add(imp); + } + return result; + } + /** * Convert the set of imports to a sorted list, ready to be output to a generated file. * @return the sorted list of imports @@ -367,8 +401,37 @@ public class ImportSet return Pattern.compile(pattern.toString()); } + protected static int findImportGroup (String imp) + { + String longest = null; + for (String prefix : IMPORT_GROUPS) { + if (!imp.startsWith(prefix)) { + continue; + } + if (longest == null || prefix.length() > longest.length()) { + longest = prefix; + } + } + return IMPORT_GROUPS.indexOf(longest); + } + protected HashSet _imports = Sets.newHashSet(); protected List _pushed = Lists.newArrayList(); protected static Pattern _splitter = Pattern.compile("\\*"); + + protected static String OOO = "com.threerings."; + protected static List DOMAIN_GROUPS = Lists.newArrayList("flash.", "fl.", "", OOO); + protected static List OOO_GROUPS = Lists.newArrayList("io.", "util.", "presents.", + "orth.", "riposte.", "samsara.", "flashbang.", "downtown.", "biteme.", "who.", + "blueharvest."); + protected static List IMPORT_GROUPS = Lists.newArrayList(); + + static + { + IMPORT_GROUPS.addAll(DOMAIN_GROUPS); + for (String prefix : OOO_GROUPS) { + IMPORT_GROUPS.add(OOO + prefix); + } + } } diff --git a/src/main/resources/com/threerings/presents/tools/enum_as.tmpl b/src/main/resources/com/threerings/presents/tools/enum_as.tmpl index fb4eabd85..31c553774 100644 --- a/src/main/resources/com/threerings/presents/tools/enum_as.tmpl +++ b/src/main/resources/com/threerings/presents/tools/enum_as.tmpl @@ -1,9 +1,12 @@ {{header}}// GENERATED PREAMBLE START package {{package}} { -{{#imports}} +{{#importGroups}} +{{#this}} import {{this}}; -{{/imports}} + +{{/this}} +{{/importGroups}} // GENERATED PREAMBLE END // GENERATED CLASSDECL START diff --git a/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl b/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl index aa7d08ae4..1bf27fc03 100644 --- a/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl +++ b/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl @@ -1,9 +1,12 @@ {{header}}// GENERATED PREAMBLE START package {{package}} { -{{#imports}} +{{#importGroups}} +{{#this}} import {{this}}; -{{/imports}} +{{/this}} + +{{/importGroups}} // GENERATED PREAMBLE END // GENERATED CLASSDECL START