go/ssa: tweak Function.Name() for generic instantiations

Was "f[[int]]", now "f[int]".

Change-Id: I361d2386cffbabd0a4eca180b49c6da2b42cb28a
Reviewed-on: https://go-review.googlesource.com/c/tools/+/407094
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Tim King <taking@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
Run-TryBot: Alan Donovan <adonovan@google.com>
diff --git a/go/callgraph/cha/testdata/generics.go b/go/callgraph/cha/testdata/generics.go
index 2711dc0..79250a5 100644
--- a/go/callgraph/cha/testdata/generics.go
+++ b/go/callgraph/cha/testdata/generics.go
@@ -27,7 +27,7 @@
 	h()
 
 	k(a)
-	g(b) // g:func(I) is not matched by instantiated[[B]]:func(B)
+	g(b) // g:func(I) is not matched by instantiated[B]:func(B)
 
 	instantiated[A](a) // static call
 	instantiated[B](b) // static call
@@ -38,8 +38,8 @@
 //   (*A).Foo --> (A).Foo
 //   (*B).Foo --> (B).Foo
 //   f --> Bar
-//   f --> instantiated[[main.A]]
-//   f --> instantiated[[main.A]]
-//   f --> instantiated[[main.B]]
-//   instantiated[[main.A]] --> (A).Foo
-//   instantiated[[main.B]] --> (B).Foo
+//   f --> instantiated[main.A]
+//   f --> instantiated[main.A]
+//   f --> instantiated[main.B]
+//   instantiated[main.A] --> (A).Foo
+//   instantiated[main.B] --> (B).Foo
diff --git a/go/callgraph/rta/testdata/generics.go b/go/callgraph/rta/testdata/generics.go
index 012a64c..d962fa4 100644
--- a/go/callgraph/rta/testdata/generics.go
+++ b/go/callgraph/rta/testdata/generics.go
@@ -53,27 +53,27 @@
 // All calls
 //   (*C).Foo --> (C).Foo
 //   (A).Foo$bound --> (A).Foo
-//   instantiated[[main.A]] --> (A).Foo
-//   instantiated[[main.B]] --> (B).Foo
+//   instantiated[main.A] --> (A).Foo
+//   instantiated[main.B] --> (B).Foo
 //   main --> (*C).Foo
 //   main --> (A).Foo$bound
 //   main --> (C).Foo
-//   main --> instantiated[[main.A]]
-//   main --> instantiated[[main.B]]
-//   main --> lambda[[main.A]]
-//   main --> lambda[[main.A]]$1
-//   main --> local[[main.C]]
+//   main --> instantiated[main.A]
+//   main --> instantiated[main.B]
+//   main --> lambda[main.A]
+//   main --> lambda[main.A]$1
+//   main --> local[main.C]
 // Reachable functions
 //   (*C).Foo
 //   (A).Foo
 //   (A).Foo$bound
 //   (B).Foo
 //   (C).Foo
-//   instantiated[[main.A]]
-//   instantiated[[main.B]]
-//   lambda[[main.A]]
-//   lambda[[main.A]]$1
-//   local[[main.C]]
+//   instantiated[main.A]
+//   instantiated[main.B]
+//   lambda[main.A]
+//   lambda[main.A]$1
+//   local[main.C]
 // Reflect types
 //   *C
 //   C
diff --git a/go/callgraph/static/static_test.go b/go/callgraph/static/static_test.go
index 47f32d7..0a108d3 100644
--- a/go/callgraph/static/static_test.go
+++ b/go/callgraph/static/static_test.go
@@ -93,10 +93,10 @@
 		{genericsInput, []string{
 			"(*A).F -> (A).F",
 			"(*B).F -> (B).F",
-			"f -> instantiated[[P.A]]",
-			"f -> instantiated[[P.B]]",
-			"instantiated[[P.A]] -> (A).F",
-			"instantiated[[P.B]] -> (B).F",
+			"f -> instantiated[P.A]",
+			"f -> instantiated[P.B]",
+			"instantiated[P.A] -> (A).F",
+			"instantiated[P.B] -> (B).F",
 		}, true},
 	} {
 		if e.typeparams && !typeparams.Enabled {
diff --git a/go/callgraph/vta/testdata/src/callgraph_generics.go b/go/callgraph/vta/testdata/src/callgraph_generics.go
index b0fcb02..da3dca5 100644
--- a/go/callgraph/vta/testdata/src/callgraph_generics.go
+++ b/go/callgraph/vta/testdata/src/callgraph_generics.go
@@ -45,17 +45,17 @@
 //  *t1 = b
 //  t2 = new bool (x)
 //  *t2 = true:bool
-//  t3 = instantiated[[bool]](t2)
+//  t3 = instantiated[bool](t2)
 //  t4 = new int (y)
 //  *t4 = 1:int
-//  t5 = instantiated[[int]](t4)
+//  t5 = instantiated[int](t4)
 //  t6 = *t0
-//  t7 = interfaceInstantiated[[testdata.A]](t6)
+//  t7 = interfaceInstantiated[testdata.A](t6)
 //  t8 = *t1
-//  t9 = interfaceInstantiated[[testdata.B]](t8)
+//  t9 = interfaceInstantiated[testdata.B](t8)
 //  return
 //
-//func interfaceInstantiated[[testdata.B]](x B):
+//func interfaceInstantiated[testdata.B](x B):
 //  t0 = local B (x)
 //  *t0 = x
 //  t1 = *t0
@@ -66,6 +66,6 @@
 //        (external)
 
 // WANT:
-// Foo: instantiated[[bool]](t2) -> instantiated[[bool]]; instantiated[[int]](t4) -> instantiated[[int]]; interfaceInstantiated[[testdata.A]](t6) -> interfaceInstantiated[[testdata.A]]; interfaceInstantiated[[testdata.B]](t8) -> interfaceInstantiated[[testdata.B]]
-// interfaceInstantiated[[testdata.B]]: (B).Bar(t1) -> B.Bar
-// interfaceInstantiated[[testdata.A]]: (A).Bar(t1) -> A.Bar
+// Foo: instantiated[bool](t2) -> instantiated[bool]; instantiated[int](t4) -> instantiated[int]; interfaceInstantiated[testdata.A](t6) -> interfaceInstantiated[testdata.A]; interfaceInstantiated[testdata.B](t8) -> interfaceInstantiated[testdata.B]
+// interfaceInstantiated[testdata.B]: (B).Bar(t1) -> B.Bar
+// interfaceInstantiated[testdata.A]: (A).Bar(t1) -> A.Bar
diff --git a/go/pointer/testdata/typeparams.go b/go/pointer/testdata/typeparams.go
index ddd0a74..461ba44 100644
--- a/go/pointer/testdata/typeparams.go
+++ b/go/pointer/testdata/typeparams.go
@@ -62,7 +62,7 @@
 	fn(&b)
 }
 
-// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[int]).String[[int]]
-// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[bool]).String[[bool]]
-// @calls command-line-arguments.Caller[[int]] -> (*command-line-arguments.S[int]).String[[int]]
-// @calls command-line-arguments.Caller[[bool]] -> (*command-line-arguments.S[bool]).String[[bool]]
+// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[int]).String[int]
+// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[bool]).String[bool]
+// @calls command-line-arguments.Caller[int] -> (*command-line-arguments.S[int]).String[int]
+// @calls command-line-arguments.Caller[bool] -> (*command-line-arguments.S[bool]).String[bool]
diff --git a/go/ssa/builder_test.go b/go/ssa/builder_test.go
index ba9aaf7..1975e26 100644
--- a/go/ssa/builder_test.go
+++ b/go/ssa/builder_test.go
@@ -627,19 +627,19 @@
 				"bound",
 				"*func() int",
 				"(p.S[int]).M$bound",
-				"(p.S[int]).M[[int]]",
+				"(p.S[int]).M[int]",
 			},
 			{
 				"thunk",
 				"*func(p.S[int]) int",
 				"(p.S[int]).M$thunk",
-				"(p.S[int]).M[[int]]",
+				"(p.S[int]).M[int]",
 			},
 			{
 				"indirect",
 				"*func(p.R[int]) int",
 				"(p.R[int]).M$thunk",
-				"(p.S[int]).M[[int]]",
+				"(p.S[int]).M[int]",
 			},
 		} {
 			entry := entry
@@ -871,7 +871,7 @@
 		}
 		sort.Strings(callees) // ignore the order in the code.
 
-		want := "[a.F[[int]] a.G[[int string]] a.H[[int]]]"
+		want := "[a.F[int] a.G[int string] a.H[int]]"
 		if got := fmt.Sprint(callees); got != want {
 			t.Errorf("Expected main() to contain calls %v. got %v", want, got)
 		}
diff --git a/go/ssa/instantiate.go b/go/ssa/instantiate.go
index 65c1e99..049b534 100644
--- a/go/ssa/instantiate.go
+++ b/go/ssa/instantiate.go
@@ -137,7 +137,7 @@
 		sig = prog.canon.Type(instance).(*types.Signature)
 	}
 
-	name := fmt.Sprintf("%s[%s]", fn.Name(), targs) // may not be unique
+	name := fmt.Sprintf("%s%s", fn.Name(), targs) // may not be unique
 	synthetic := fmt.Sprintf("instantiation of %s", fn.Name())
 	instance := &Function{
 		name:        name,