cmd/callgraph: add -algo=vta option

This option uses Variable Type Analysis, a refinement of CHA
suitable for partial programs.

Change-Id: I6c8b074e915d29eb9425656f345e8160417ba594
Reviewed-on: https://go-review.googlesource.com/c/tools/+/410138
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Alan Donovan <adonovan@google.com>
Reviewed-by: Zvonimir Pavlinovic <zpavlinovic@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
diff --git a/cmd/callgraph/main.go b/cmd/callgraph/main.go
index b5533ac..eb8c0d1 100644
--- a/cmd/callgraph/main.go
+++ b/cmd/callgraph/main.go
@@ -37,6 +37,7 @@
 	"golang.org/x/tools/go/callgraph/cha"
 	"golang.org/x/tools/go/callgraph/rta"
 	"golang.org/x/tools/go/callgraph/static"
+	"golang.org/x/tools/go/callgraph/vta"
 	"golang.org/x/tools/go/packages"
 	"golang.org/x/tools/go/pointer"
 	"golang.org/x/tools/go/ssa"
@@ -46,7 +47,7 @@
 // flags
 var (
 	algoFlag = flag.String("algo", "rta",
-		`Call graph construction algorithm (static, cha, rta, pta)`)
+		`Call graph construction algorithm (static, cha, rta, vta, pta)`)
 
 	testFlag = flag.Bool("test", false,
 		"Loads test code (*_test.go) for imported packages")
@@ -67,7 +68,7 @@
 
 Usage:
 
-  callgraph [-algo=static|cha|rta|pta] [-test] [-format=...] package...
+  callgraph [-algo=static|cha|rta|vta|pta] [-test] [-format=...] package...
 
 Flags:
 
@@ -76,6 +77,7 @@
             static      static calls only (unsound)
             cha         Class Hierarchy Analysis
             rta         Rapid Type Analysis
+            vta         Variable Type Analysis
             pta         inclusion-based Points-To Analysis
 
            The algorithms are ordered by increasing precision in their
@@ -251,6 +253,9 @@
 
 		// NB: RTA gives us Reachable and RuntimeTypes too.
 
+	case "vta":
+		cg = vta.CallGraph(ssautil.AllFunctions(prog), cha.CallGraph(prog))
+
 	default:
 		return fmt.Errorf("unknown algorithm: %s", algo)
 	}