go/ssa: convert tests to new annotation system

Change-Id: I4f44da4fa6a4976b790b6707300cd4facf99c9a5
Reviewed-on: https://go-review.googlesource.com/c/144738
Reviewed-by: Alan Donovan <adonovan@google.com>
diff --git a/go/ssa/source_test.go b/go/ssa/source_test.go
index d543c1b..e3e7023 100644
--- a/go/ssa/source_test.go
+++ b/go/ssa/source_test.go
@@ -20,6 +20,7 @@
 	"testing"
 
 	"golang.org/x/tools/go/ast/astutil"
+	"golang.org/x/tools/go/expect"
 	"golang.org/x/tools/go/loader"
 	"golang.org/x/tools/go/ssa"
 	"golang.org/x/tools/go/ssa/ssautil"
@@ -232,37 +233,41 @@
 		}
 	}
 
-	// Find the actual AST node for each canonical position.
-	parenExprByPos := make(map[token.Pos]*ast.ParenExpr)
+	var parenExprs []*ast.ParenExpr
 	ast.Inspect(f, func(n ast.Node) bool {
 		if n != nil {
 			if e, ok := n.(*ast.ParenExpr); ok {
-				parenExprByPos[e.Pos()] = e
+				parenExprs = append(parenExprs, e)
 			}
 		}
 		return true
 	})
 
-	// Find all annotations of form /*@kind*/.
-	for _, c := range f.Comments {
-		text := strings.TrimSpace(c.Text())
-		if text == "" || text[0] != '@' {
-			continue
+	notes, err := expect.Extract(prog.Fset, f)
+	if err != nil {
+		t.Fatal(err)
+	}
+	for _, n := range notes {
+		want := n.Name
+		if want == "nil" {
+			want = "<nil>"
 		}
-		text = text[1:]
-		pos := c.End() + 1
-		position := prog.Fset.Position(pos)
+		position := prog.Fset.Position(n.Pos)
 		var e ast.Expr
-		if target := parenExprByPos[pos]; target == nil {
-			t.Errorf("%s: annotation doesn't precede ParenExpr: %q", position, text)
+		for _, paren := range parenExprs {
+			if paren.Pos() > n.Pos {
+				e = paren.X
+				break
+			}
+		}
+		if e == nil {
+			t.Errorf("%s: note doesn't precede ParenExpr: %q", position, want)
 			continue
-		} else {
-			e = target.X
 		}
 
-		path, _ := astutil.PathEnclosingInterval(f, pos, pos)
+		path, _ := astutil.PathEnclosingInterval(f, n.Pos, n.Pos)
 		if path == nil {
-			t.Errorf("%s: can't find AST path from root to comment: %s", position, text)
+			t.Errorf("%s: can't find AST path from root to comment: %s", position, want)
 			continue
 		}
 
@@ -274,7 +279,7 @@
 
 		v, gotAddr := fn.ValueForExpr(e) // (may be nil)
 		got := strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa.")
-		if want := text; got != want {
+		if got != want {
 			t.Errorf("%s: got value %q, want %q", position, got, want)
 		}
 		if v != nil {
diff --git a/go/ssa/testdata/valueforexpr.go b/go/ssa/testdata/valueforexpr.go
index 4a2cb85..fe65b94 100644
--- a/go/ssa/testdata/valueforexpr.go
+++ b/go/ssa/testdata/valueforexpr.go
@@ -10,12 +10,13 @@
 func f(spilled, unspilled int) {
 	_ = /*@UnOp*/ (spilled)
 	_ = /*@Parameter*/ (unspilled)
-	_ = /*@<nil>*/ (1 + 2) // (constant)
+	_ = /*@nil*/ (1 + 2) // (constant)
 	i := 0
 
 	f := func() (int, int) { return 0, 0 }
 
-	/*@Call*/ (print( /*@BinOp*/ (i + 1)))
+	/*@Call*/
+	(print( /*@BinOp*/ (i + 1)))
 	_, _ = /*@Call*/ (f())
 	ch := /*@MakeChan*/ (make(chan int))
 	/*@UnOp*/ (<-ch)
@@ -43,7 +44,7 @@
 	sl := []int{}
 	_ = /*@Slice*/ (sl[:0])
 
-	_ = /*@<nil>*/ (new(int)) // optimized away
+	_ = /*@nil*/ (new(int)) // optimized away
 	tmp := /*@Alloc*/ (new(int))
 	_ = tmp
 	var iface interface{}
@@ -88,7 +89,7 @@
 	_, _, _ = sl1, sl2, sl3
 
 	_ = /*@Slice*/ ([]int{})
-	_ = /*@<nil>*/ (& /*@Slice*/ ([]int{})) // & optimized away
+	_ = /*@nil*/ (& /*@Slice*/ ([]int{})) // & optimized away
 	_ = & /*@Slice*/ ([]int{})
 
 	// 2. Arrays
@@ -117,7 +118,7 @@
 	_, _, _ = m1, m2, m3
 
 	_ = /*@MakeMap*/ (M{})
-	_ = /*@<nil>*/ (& /*@MakeMap*/ (M{})) // & optimized away
+	_ = /*@nil*/ (& /*@MakeMap*/ (M{})) // & optimized away
 	_ = & /*@MakeMap*/ (M{})
 
 	// 4. Structs