apidiff: represent a Report as a list of Changes

Modify the Report representation to be a list of Change values,
instead of two string slices.

This will enable adding more information to each change, like source
location.

Change-Id: Ia7389d7bc552479ea5e06efd7fdefe004058e66f
Reviewed-on: https://go-review.googlesource.com/c/tools/+/172777
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
diff --git a/internal/apidiff/apidiff.go b/internal/apidiff/apidiff.go
index dc0f0e7..76669d8 100644
--- a/internal/apidiff/apidiff.go
+++ b/internal/apidiff/apidiff.go
@@ -24,10 +24,14 @@
 func Changes(old, new *types.Package) Report {
 	d := newDiffer(old, new)
 	d.checkPackage()
-	return Report{
-		Incompatible: d.incompatibles.collect(),
-		Compatible:   d.compatibles.collect(),
+	r := Report{}
+	for _, m := range d.incompatibles.collect() {
+		r.Changes = append(r.Changes, Change{Message: m, Compatible: false})
 	}
+	for _, m := range d.compatibles.collect() {
+		r.Changes = append(r.Changes, Change{Message: m, Compatible: true})
+	}
+	return r
 }
 
 type differ struct {
diff --git a/internal/apidiff/apidiff_test.go b/internal/apidiff/apidiff_test.go
index 3991a9a..4925509 100644
--- a/internal/apidiff/apidiff_test.go
+++ b/internal/apidiff/apidiff_test.go
@@ -37,11 +37,13 @@
 
 	report := Changes(oldpkg.Types, newpkg.Types)
 
-	if !reflect.DeepEqual(report.Incompatible, wanti) {
-		t.Errorf("incompatibles: got %v\nwant %v\n", report.Incompatible, wanti)
+	got := report.messages(false)
+	if !reflect.DeepEqual(got, wanti) {
+		t.Errorf("incompatibles: got %v\nwant %v\n", got, wanti)
 	}
-	if !reflect.DeepEqual(report.Compatible, wantc) {
-		t.Errorf("compatibles: got %v\nwant %v\n", report.Compatible, wantc)
+	got = report.messages(true)
+	if !reflect.DeepEqual(got, wantc) {
+		t.Errorf("compatibles: got %v\nwant %v\n", got, wantc)
 	}
 }
 
diff --git a/internal/apidiff/report.go b/internal/apidiff/report.go
index fd346b1..ce79e27 100644
--- a/internal/apidiff/report.go
+++ b/internal/apidiff/report.go
@@ -8,7 +8,23 @@
 
 // Report describes the changes detected by Changes.
 type Report struct {
-	Incompatible, Compatible []string
+	Changes []Change
+}
+
+// A Change describes a single API change.
+type Change struct {
+	Message    string
+	Compatible bool
+}
+
+func (r Report) messages(compatible bool) []string {
+	var msgs []string
+	for _, c := range r.Changes {
+		if c.Compatible == compatible {
+			msgs = append(msgs, c.Message)
+		}
+	}
+	return msgs
 }
 
 func (r Report) String() string {
@@ -28,13 +44,13 @@
 
 func (r Report) TextIncompatible(w io.Writer, withHeader bool) error {
 	if withHeader {
-		return r.writeMessages(w, "Incompatible changes:", r.Incompatible)
+		return r.writeMessages(w, "Incompatible changes:", r.messages(false))
 	}
-	return r.writeMessages(w, "", r.Incompatible)
+	return r.writeMessages(w, "", r.messages(false))
 }
 
 func (r Report) TextCompatible(w io.Writer) error {
-	return r.writeMessages(w, "Compatible changes:", r.Compatible)
+	return r.writeMessages(w, "Compatible changes:", r.messages(true))
 }
 
 func (r Report) writeMessages(w io.Writer, header string, msgs []string) error {