in tools/generate.go [115:272]
func main() {
flag.Parse()
// Assume this is running from the vscode-go directory.
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
packageJSONFile := filepath.Join(dir, "package.json")
// Find the package.json file.
data, err := ioutil.ReadFile(packageJSONFile)
if err != nil {
log.Fatal(err)
}
if *updateGoplsSettingsFlag {
newData, err := updateGoplsSettings(data, packageJSONFile, *debugFlag)
if err != nil {
log.Fatal(err)
}
data = newData
}
pkgJSON := &PackageJSON{}
if err := json.Unmarshal(data, pkgJSON); err != nil {
log.Fatal(err)
}
rewrite := func(filename string, toAdd []byte) {
oldContent, err := ioutil.ReadFile(filename)
if err != nil {
log.Fatal(err)
}
gen := []byte(`<!-- Everything below this line is generated. DO NOT EDIT. -->`)
split := bytes.Split(oldContent, gen)
if len(split) == 1 {
log.Fatalf("expected to find %q in %s, not found", gen, filename)
}
var s []byte
if strings.HasSuffix(filename, ".ts") {
s = bytes.Join([][]byte{
split[0],
gen,
[]byte("\n\n"),
toAdd,
}, []byte{})
} else {
s = bytes.Join([][]byte{
bytes.TrimSpace(split[0]),
gen,
toAdd,
}, []byte("\n\n"))
}
newContent := append(s, '\n')
checkAndWrite(filename, oldContent, newContent)
}
b := &bytes.Buffer{}
for i, c := range pkgJSON.Contributes.Commands {
fmt.Fprintf(b, "### `%s`\n\n%s", c.Title, c.Description)
if i != len(pkgJSON.Contributes.Commands)-1 {
b.WriteString("\n\n")
}
}
rewrite(filepath.Join(dir, "docs", "commands.md"), b.Bytes())
// Clear so that we can rewrite settings.md.
b.Reset()
var properties []*Property
var goplsProperty *Property
for name, p := range pkgJSON.Contributes.Configuration.Properties {
p.name = name
if name == "gopls" {
goplsProperty = p
}
properties = append(properties, p)
}
sort.Slice(properties, func(i, j int) bool {
return properties[i].name < properties[j].name
})
for _, p := range properties {
if p.name == "gopls" {
desc := "Customize `gopls` behavior by specifying the gopls' settings in this section. " +
"For example, \n```\n\"gopls\" : {\n\t\"build.directoryFilters\": [\"-node_modules\"]\n\t...\n}\n```\n" +
"This section is directly read by `gopls`. See the [`gopls` section](#settings-for-gopls) section " +
"for the full list of `gopls` settings."
fmt.Fprintf(b, "### `%s`\n\n%s", p.name, desc)
b.WriteString("\n\n")
continue
}
writeProperty(b, "###", p)
b.WriteString("\n")
}
// Write gopls section.
b.WriteString("## Settings for `gopls`\n\n")
writeGoplsSettingsSection(b, goplsProperty)
rewrite(filepath.Join(dir, "docs", "settings.md"), b.Bytes())
b.Reset()
generateDebugConfigTable(b, pkgJSON)
rewriteDebugDoc(filepath.Join(dir, "docs", "debugging.md"), b.Bytes())
// Only update the latest tool versions if the flag is set.
if !*updateLatestToolVersionsFlag {
return
}
// Clear so that we can rewrite src/goToolsInformation.ts.
b.Reset()
// Check for the latest gopls version.
versions, err := listAllModuleVersions("golang.org/x/tools/gopls")
if err != nil {
log.Fatal(err)
}
latestIndex := len(versions.Versions) - 1
latestPre := versions.Versions[latestIndex]
// We need to find the last version that was not a pre-release.
var latest string
for ; latestIndex >= 0; latestIndex-- {
latest = versions.Versions[latestIndex]
if !strings.Contains(latest, "pre") {
break
}
}
goplsVersion, err := listModuleVersion(fmt.Sprintf("golang.org/x/tools/gopls@%s", latest))
if err != nil {
log.Fatal(err)
}
goplsVersionPre, err := listModuleVersion(fmt.Sprintf("golang.org/x/tools/gopls@%s", latestPre))
if err != nil {
log.Fatal(err)
}
allToolsFile := filepath.Join(dir, "tools", "allTools.ts.in")
// Find the package.json file.
data, err = ioutil.ReadFile(allToolsFile)
if err != nil {
log.Fatal(err)
}
// TODO(suzmue): change input to json and avoid magic string printing.
toolsString := fmt.Sprintf(string(data), goplsVersion.Version, goplsVersion.Time[:len("YYYY-MM-DD")], goplsVersionPre.Version, goplsVersionPre.Time[:len("YYYY-MM-DD")])
// Write tools section.
b.WriteString(toolsString)
rewrite(filepath.Join(dir, "src", "goToolsInformation.ts"), b.Bytes())
}