# HG changeset patch # User Steve Losh # Date 1389800885 18000 # Node ID dd2ad752826b00b45676cc98d99a8d9bf3fc5cc7 # Parent d66bfb2537feead7f6c88fdc7d0d5a69bf491ddc ssi diff -r d66bfb2537fe -r dd2ad752826b bin/sort-scala-imports --- a/bin/sort-scala-imports Mon Jan 13 09:55:17 2014 -0500 +++ b/bin/sort-scala-imports Wed Jan 15 10:48:05 2014 -0500 @@ -18,42 +18,78 @@ class ImportGroup(object): def __init__(self, line): self.main_line = line.rstrip() + self.prefix = None self.guts = [] + def set_line(self): + """Set the main_line and guts for the given prefix and guts. + + If the import will fit into 100 chars, the short group syntax will be + used. Otherwise the longer one will be used. + + """ + prefix = self.prefix + guts = self.guts + + if not prefix: + # This is just a single-line, single-item import, so we don't need + # to do any setup. + return + + single = '%s{%s%s%s}' % (prefix, + bracket_padding, + ', '.join(guts), + bracket_padding) + if len(single) > 100: + self.main_line = prefix + '{' + self.guts = guts + self.guts.sort(key=lambda s: s.lower()) + else: + self.main_line = single + self.guts = [] + def slurp(self): global l, bracket_padding + line = self.main_line if self.main_line.endswith('}'): # This is a line like: import foo.{ a, b, c } if bracket_padding is None: - if self.main_line[self.main_line.index("{") + 1] == " ": + if line[line.index("{") + 1] == " ": bracket_padding = " " else: bracket_padding = "" - prefix, rest = self.main_line.split('{', 1) + prefix, rest = line.split('{', 1) guts = [item.strip() for item in re.split(", +| +|,", rest.strip('{}, '))] - guts.sort(key=lambda s: s.lower()) + + self.prefix = prefix + self.guts = guts - self.main_line = '%s{%s%s%s}' % (prefix, - bracket_padding, - ', '.join(guts), - bracket_padding) l = next_line() - elif self.main_line.endswith('{'): + elif line.endswith('{'): + # This is the first line of a multi-line set + prefix = line.rstrip('{') + guts = [] while True: l = next_line() if l.rstrip().endswith('}'): l = next_line() break else: - self.guts.append(l.strip().rstrip(',')) + guts.append(l.strip().rstrip(',')) + + self.prefix = prefix + self.guts = guts else: + # Just a normal single import line, pass it on. l = next_line() def spit(self): + self.set_line() + sys.stdout.write(self.main_line + '\n') if self.guts: @@ -71,6 +107,9 @@ ig.slurp() imports.append(ig) +if bracket_padding is None: + bracket_padding = " " + imports.sort(key=lambda ig: ig.key()) for i in imports: