internal/lsp: link to the new pkg.go.dev instead of godoc.org

Updates golang/go#35563

Change-Id: I88ae3f742daf5043d4784fe8827454fb1ce1f9db
Reviewed-on: https://go-review.googlesource.com/c/tools/+/209337
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/gopls/doc/settings.md b/gopls/doc/settings.md
index 8cf60d5..4e99a19 100644
--- a/gopls/doc/settings.md
+++ b/gopls/doc/settings.md
@@ -46,6 +46,16 @@
 
 Default: `false`.
 
+### **linkTarget** *string*
+
+This controls where points documentation for given package in `textDocument/documentLink`.
+It might be one of:
+* `"godoc.org"`   
+* `"pkg.go.dev"`
+If company chooses to use its own `godoc.org`, it's address can be used as well.
+
+Default: `"pkg.go.dev"`.
+
 ## Experimental
 
 The below settings are considered experimental. They may be deprecated or changed in the future. They are typically used to test experimental opt-in features or to disable features.
diff --git a/internal/lsp/link.go b/internal/lsp/link.go
index c9f89f2..86e6084 100644
--- a/internal/lsp/link.go
+++ b/internal/lsp/link.go
@@ -6,6 +6,7 @@
 
 import (
 	"context"
+	"fmt"
 	"go/ast"
 	"go/token"
 	"regexp"
@@ -47,7 +48,7 @@
 			if target == "" {
 				return false
 			}
-			target = "https://godoc.org/" + target
+			target = fmt.Sprintf("https://%s/%s", view.Options().LinkTarget, target)
 			l, err := toProtocolLink(view, m, target, n.Path.Pos()+1, n.Path.End()-1)
 			if err != nil {
 				log.Error(ctx, "cannot initialize DocumentLink", err, tag.Of("Path", n.Path.Value))
diff --git a/internal/lsp/source/options.go b/internal/lsp/source/options.go
index f049091..4770351 100644
--- a/internal/lsp/source/options.go
+++ b/internal/lsp/source/options.go
@@ -69,6 +69,7 @@
 		ComputeEdits: myers.ComputeEdits,
 		Analyzers:    defaultAnalyzers,
 		GoDiff:       true,
+		LinkTarget:   "pkg.go.dev",
 	}
 )
 
@@ -110,6 +111,8 @@
 	LocalPrefix string
 
 	VerboseOutput bool
+
+	LinkTarget string
 }
 
 type CompletionOptions struct {
@@ -164,6 +167,8 @@
 	OptionUnexpected
 )
 
+type LinkTarget string
+
 func SetOptions(options *Options, opts interface{}) OptionResults {
 	var results OptionResults
 	switch opts := opts.(type) {
@@ -265,6 +270,14 @@
 			result.errorf("Unsupported hover kind", tag.Of("HoverKind", hoverKind))
 		}
 
+	case "linkTarget":
+		linkTarget, ok := value.(string)
+		if !ok {
+			result.errorf("invalid type %T for string option %q", value, name)
+			break
+		}
+		o.LinkTarget = linkTarget
+
 	case "experimentalDisabledAnalyses":
 		disabledAnalyses, ok := value.([]interface{})
 		if !ok {
diff --git a/internal/lsp/testdata/links/links.go b/internal/lsp/testdata/links/links.go
index f726e38..e2be5b6 100644
--- a/internal/lsp/testdata/links/links.go
+++ b/internal/lsp/testdata/links/links.go
@@ -1,13 +1,13 @@
 package links
 
 import (
-	"fmt" //@link(`fmt`,"https://godoc.org/fmt")
+	"fmt" //@link(`fmt`,"https://pkg.go.dev/fmt")
 
-	"golang.org/x/tools/internal/lsp/foo" //@link(`golang.org/x/tools/internal/lsp/foo`,`https://godoc.org/golang.org/x/tools/internal/lsp/foo`)
+	"golang.org/x/tools/internal/lsp/foo" //@link(`golang.org/x/tools/internal/lsp/foo`,`https://pkg.go.dev/golang.org/x/tools/internal/lsp/foo`)
 
-	_ "database/sql" //@link(`database/sql`, `https://godoc.org/database/sql`)
+	_ "database/sql" //@link(`database/sql`, `https://pkg.go.dev/database/sql`)
 
-	errors "golang.org/x/xerrors" //@link(`golang.org/x/xerrors`, `https://godoc.org/golang.org/x/xerrors`)
+	errors "golang.org/x/xerrors" //@link(`golang.org/x/xerrors`, `https://pkg.go.dev/golang.org/x/xerrors`)
 )
 
 var (