forked from OSchip/llvm-project
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
// Copyright 2013 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package ssautil_test
|
|
|
|
import (
|
|
"go/parser"
|
|
"strings"
|
|
"testing"
|
|
|
|
"llvm.org/llgo/third_party/gotools/go/loader"
|
|
"llvm.org/llgo/third_party/gotools/go/ssa"
|
|
"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
|
|
)
|
|
|
|
func TestSwitches(t *testing.T) {
|
|
conf := loader.Config{ParserMode: parser.ParseComments}
|
|
f, err := conf.ParseFile("testdata/switches.go", nil)
|
|
if err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
|
|
conf.CreateFromFiles("main", f)
|
|
iprog, err := conf.Load()
|
|
if err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
|
|
prog := ssa.Create(iprog, 0)
|
|
mainPkg := prog.Package(iprog.Created[0].Pkg)
|
|
mainPkg.Build()
|
|
|
|
for _, mem := range mainPkg.Members {
|
|
if fn, ok := mem.(*ssa.Function); ok {
|
|
if fn.Synthetic != "" {
|
|
continue // e.g. init()
|
|
}
|
|
// Each (multi-line) "switch" comment within
|
|
// this function must match the printed form
|
|
// of a ConstSwitch.
|
|
var wantSwitches []string
|
|
for _, c := range f.Comments {
|
|
if fn.Syntax().Pos() <= c.Pos() && c.Pos() < fn.Syntax().End() {
|
|
text := strings.TrimSpace(c.Text())
|
|
if strings.HasPrefix(text, "switch ") {
|
|
wantSwitches = append(wantSwitches, text)
|
|
}
|
|
}
|
|
}
|
|
|
|
switches := ssautil.Switches(fn)
|
|
if len(switches) != len(wantSwitches) {
|
|
t.Errorf("in %s, found %d switches, want %d", fn, len(switches), len(wantSwitches))
|
|
}
|
|
for i, sw := range switches {
|
|
got := sw.String()
|
|
if i >= len(wantSwitches) {
|
|
continue
|
|
}
|
|
want := wantSwitches[i]
|
|
if got != want {
|
|
t.Errorf("in %s, found switch %d: got <<%s>>, want <<%s>>", fn, i, got, want)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|