Skip to content

Commit

Permalink
gopls/doc: make doc generation work regardless of the current directory
Browse files Browse the repository at this point in the history
As a nice side effect, make it easier to migrate internal/lsp/ to
gopls/internal/lsp.

For golang/go#54509

Change-Id: Ib541c08426f1f1d1e2a42b2d1cab47eab96dc092
Reviewed-on: https://go-review.googlesource.com/c/tools/+/426775
Reviewed-by: Alan Donovan <[email protected]>
Run-TryBot: Robert Findley <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
gopls-CI: kokoro <[email protected]>
  • Loading branch information
findleyr committed Aug 31, 2022
1 parent ddbeb75 commit fe1a27b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
35 changes: 28 additions & 7 deletions gopls/doc/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"reflect"
"regexp"
Expand All @@ -39,37 +40,57 @@ import (
)

func main() {
if _, err := doMain("..", true); err != nil {
if _, err := doMain(true); err != nil {
fmt.Fprintf(os.Stderr, "Generation failed: %v\n", err)
os.Exit(1)
}
}

func doMain(baseDir string, write bool) (bool, error) {
func doMain(write bool) (bool, error) {
api, err := loadAPI()
if err != nil {
return false, err
}

if ok, err := rewriteFile(filepath.Join(baseDir, "internal/lsp/source/api_json.go"), api, write, rewriteAPI); !ok || err != nil {
sourceDir, err := pkgDir("golang.org/x/tools/internal/lsp/source")
if err != nil {
return false, err
}

if ok, err := rewriteFile(filepath.Join(sourceDir, "api_json.go"), api, write, rewriteAPI); !ok || err != nil {
return ok, err
}
if ok, err := rewriteFile(filepath.Join(baseDir, "gopls/doc/settings.md"), api, write, rewriteSettings); !ok || err != nil {

goplsDir, err := pkgDir("golang.org/x/tools/gopls")
if err != nil {
return false, err
}

if ok, err := rewriteFile(filepath.Join(goplsDir, "doc", "settings.md"), api, write, rewriteSettings); !ok || err != nil {
return ok, err
}
if ok, err := rewriteFile(filepath.Join(baseDir, "gopls/doc/commands.md"), api, write, rewriteCommands); !ok || err != nil {
if ok, err := rewriteFile(filepath.Join(goplsDir, "doc", "commands.md"), api, write, rewriteCommands); !ok || err != nil {
return ok, err
}
if ok, err := rewriteFile(filepath.Join(baseDir, "gopls/doc/analyzers.md"), api, write, rewriteAnalyzers); !ok || err != nil {
if ok, err := rewriteFile(filepath.Join(goplsDir, "doc", "analyzers.md"), api, write, rewriteAnalyzers); !ok || err != nil {
return ok, err
}
if ok, err := rewriteFile(filepath.Join(baseDir, "gopls/doc/inlayHints.md"), api, write, rewriteInlayHints); !ok || err != nil {
if ok, err := rewriteFile(filepath.Join(goplsDir, "doc", "inlayHints.md"), api, write, rewriteInlayHints); !ok || err != nil {
return ok, err
}

return true, nil
}

// pkgDir returns the directory corresponding to the import path pkgPath.
func pkgDir(pkgPath string) (string, error) {
out, err := exec.Command("go", "list", "-f", "{{.Dir}}", pkgPath).Output()
if err != nil {
return "", err
}
return strings.TrimSpace(string(out)), nil
}

func loadAPI() (*source.APIJSON, error) {
pkgs, err := packages.Load(
&packages.Config{
Expand Down
2 changes: 1 addition & 1 deletion gopls/doc/generate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
func TestGenerated(t *testing.T) {
testenv.NeedsGoBuild(t) // This is a lie. We actually need the source code.

ok, err := doMain("../..", false)
ok, err := doMain(false)
if err != nil {
t.Fatal(err)
}
Expand Down

0 comments on commit fe1a27b

Please sign in to comment.