}
}
- i0 := -1 // if i0 >= 0 we are in a run and i0 is the start of the run
- var keepType bool
+ i0 := -1 // if i0 >= 0 we are in a run and i0 is the start of the run
+ var keepType bool // valid if we are in a run (i0 >= 0)
for i, s := range specs {
- t := s.(*ast.ValueSpec)
- if t.Values != nil {
+ var hasValues, hasType bool
+ switch t := s.(type) {
+ case *ast.AliasSpec:
+ // like a ValueSpec with values (alias origin), but no type
+ hasValues = true
+
+ case *ast.ValueSpec:
+ hasValues = len(t.Values) > 0
+ hasType = t.Type != nil
+
+ default:
+ panic("internal error: unexpected ast.Spec")
+ }
+
+ if hasValues {
if i0 < 0 {
- // start of a run of ValueSpecs with non-nil Values
+ // start of a run with values
i0 = i
keepType = false
}
i0 = -1
}
}
- if t.Type != nil {
+ if hasType {
keepType = true
}
}
return m
}
+func (p *printer) aliasSpec(s *ast.AliasSpec, keepTypeCol bool) {
+ p.setComment(s.Doc)
+ p.expr(s.Name)
+ extraTabs := 3
+ if keepTypeCol {
+ p.print(vtab)
+ extraTabs--
+ }
+ p.print(vtab, token.ALIAS, blank)
+ p.expr(s.Orig)
+ extraTabs--
+ if s.Comment != nil {
+ for ; extraTabs > 0; extraTabs-- {
+ p.print(vtab)
+ }
+ p.setComment(s.Comment)
+ }
+}
+
func (p *printer) valueSpec(s *ast.ValueSpec, keepType bool) {
p.setComment(s.Doc)
p.identList(s.Names, false) // always present
p.setComment(s.Comment)
p.print(s.EndPos)
+ case *ast.AliasSpec:
+ p.setComment(s.Doc)
+ p.expr(s.Name)
+ if n == 1 {
+ p.print(blank)
+ } else {
+ p.print(vtab)
+ }
+ p.print(token.ALIAS, blank)
+ p.expr(s.Orig)
+
case *ast.ValueSpec:
if n != 1 {
p.internalError("expected n = 1; got", n)
p.linebreak(p.lineFor(s.Pos()), 1, ignore, p.linesFrom(line) > 0)
}
p.recordLine(&line)
- p.valueSpec(s.(*ast.ValueSpec), keepType[i])
+ switch t := s.(type) {
+ case *ast.AliasSpec:
+ p.aliasSpec(t, keepType[i])
+
+ case *ast.ValueSpec:
+ p.valueSpec(t, keepType[i])
+
+ default:
+ p.internalError("unknown ast.Spec type: %T", t)
+ }
}
} else {
var line int
x int
y int
}) // no extra comma between } and )
+
+// alias declarations
+const c => C
+const c => p.C
+const (
+ a = 123
+ b int = 456
+ c => foo
+ ddd => p.Foo
+)
+
+// TODO(gri) Currently = and => line up in the formatted output,
+// but because = and => have different lengths, the
+// text following doesn't line up. Consider putting that
+// text into its own column.
+const (
+ a int = iota // a comment
+ b => p.B // b comment
+ c // c comment
+ d => p.C // d comment
+ e => p.E
+ f
+ g float32 = 9.8
+)
+
+type c => C
+type c => p.C
+type (
+ s struct{}
+ a => A
+ b => A
+ c => foo
+ ddd => p.Foo
+)
+
+var c => C
+var c => p.C
+var (
+ a = 123
+ b int = 456
+ c => foo
+ ddd => p.Foo
+)
+
+func f => F
+func f_long => p.F
x int
y int
}) // no extra comma between } and )
+
+// alias declarations
+const c => C
+const c => p.C
+const (
+ a = 123
+ b int = 456
+ c => foo
+ ddd => p.Foo
+)
+
+// TODO(gri) Currently = and => line up in the formatted output,
+// but because = and => have different lengths, the
+// text following doesn't line up. Consider putting that
+// text into its own column.
+const (
+ a int = iota // a comment
+ b => p.B // b comment
+ c // c comment
+ d => p.C // d comment
+ e => p.E
+ f
+ g float32 = 9.8
+)
+
+type c => C
+type c => p.C
+type (
+ s struct{}
+ a => A
+ b = A
+ c = foo
+ ddd => p.Foo
+)
+
+var c => C
+var c => p.C
+var (
+ a = 123
+ b int = 456
+ c => foo
+ ddd => p.Foo
+)
+
+func f => F
+func f_long => p.F
\ No newline at end of file