Commit 8e2333b2 authored by Robert Griesemer's avatar Robert Griesemer

go/types: fix scope printing (debugging support)

Printing of scopes was horribly wrong: If a scope contained
no object declarations, it would abort printing even if the
scope had children scopes. Also, the line breaks were not
inserted consistently. The actual test case (ExampleScope)
was incorrect as well.

Fixed and simplified printing, and adjusted example which
tests the printing output.

Change-Id: If21c1d4ad71b15a517d4a54da16de5e6228eb4b5
Reviewed-on: https://go-review.googlesource.com/135115
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
parent 0ef42f4d
......@@ -51,6 +51,7 @@ type Celsius float64
func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) }
func FToC(f float64) Celsius { return Celsius(f - 32 / 9 * 5) }
const Boiling Celsius = 100
func Unused() { {}; {{ var x int; _ = x }} } // make sure empty block scopes get printed
`},
} {
f, err := parser.ParseFile(fset, file.name, file.input, 0)
......@@ -81,23 +82,33 @@ const Boiling Celsius = 100
// . const temperature.Boiling temperature.Celsius
// . type temperature.Celsius float64
// . func temperature.FToC(f float64) temperature.Celsius
// . func temperature.Unused()
// . func temperature.main()
//
// . main.go scope {
// . . package fmt
//
// . . function scope {
// . . . var freezing temperature.Celsius
// . . }. }
// . . }
// . }
// . celsius.go scope {
// . . package fmt
//
// . . function scope {
// . . . var c temperature.Celsius
// . . }
// . . function scope {
// . . . var f float64
// . . }. }}
// . . }
// . . function scope {
// . . . block scope {
// . . . }
// . . . block scope {
// . . . . block scope {
// . . . . . var x int
// . . . . }
// . . . }
// . . }
// . }
// }
}
// ExampleMethodSet prints the method sets of various types.
......
......@@ -161,13 +161,8 @@ func (s *Scope) WriteTo(w io.Writer, n int, recurse bool) {
const ind = ". "
indn := strings.Repeat(ind, n)
fmt.Fprintf(w, "%s%s scope %p {", indn, s.comment, s)
if len(s.elems) == 0 {
fmt.Fprintf(w, "}\n")
return
}
fmt.Fprintf(w, "%s%s scope %p {\n", indn, s.comment, s)
fmt.Fprintln(w)
indn1 := indn + ind
for _, name := range s.Names() {
fmt.Fprintf(w, "%s%s\n", indn1, s.elems[name])
......@@ -175,12 +170,11 @@ func (s *Scope) WriteTo(w io.Writer, n int, recurse bool) {
if recurse {
for _, s := range s.children {
fmt.Fprintln(w)
s.WriteTo(w, n+1, recurse)
}
}
fmt.Fprintf(w, "%s}", indn)
fmt.Fprintf(w, "%s}\n", indn)
}
// String returns a string representation of the scope, for debugging.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment