tools: generate inlay hints settings from gopls settings
This updates the script to generate the inlay hints settings
automatically from gopls. I did some manual touch ups on the settings
from gopls for now and will send a CL to gopls to make the settings
fixes upstream.
Change-Id: Ib4d66b1f03b4e6aa0019d6a9094cc172c8dc952a
Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/419120
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Run-TryBot: Suzy Mueller <suzmue@golang.org>
diff --git a/docs/settings.md b/docs/settings.md
index 0b0299e..c6f9975 100644
--- a/docs/settings.md
+++ b/docs/settings.md
@@ -272,85 +272,68 @@
Default: `false`
### `go.inlayHints.assignVariableTypes`
-Enable/disable inlay hints for variable types in assign statements.
+Enable/disable inlay hints for variable types in assign statements:
```go
-
-i /*int*/, j /*int*/ := 0, len(r)-1
+ i/* int*/, j/* int*/ := 0, len(r)-1
```
Default: `false`
### `go.inlayHints.compositeLiteralFields`
-Enable/disable inlay hints for composite literal field names.
+Enable/disable inlay hints for composite literal field names:
```go
-
-for _, c := range []struct {in, want string}{
- {/*in:*/ "Hello, world", /*want:*/ "dlrow ,olleH"},
- {/*in:*/ "Hello, 世界", /*want:*/ "界世 ,olleH"},
- {/*in:*/ "", /*want:*/ ""},
-} {
- ...
-}
+ {/*in: */"Hello, world", /*want: */"dlrow ,olleH"}
```
Default: `false`
### `go.inlayHints.compositeLiteralTypes`
-Enable/disable inlay hints for composite literal types.
+Enable/disable inlay hints for composite literal types:
```go
-
-for _, c := range []struct {in, want string}{
- /*struct{ in, want string }*/{"Hello, world", "dlrow ,olleH"},
- /*struct{ in, want string }*/{"Hello, 世界", "界世 ,olleH"},
- /*struct{ in, want string }*/{"", ""},
-} {
- ...
-}
+ for _, c := range []struct {
+ in, want string
+ }{
+ /*struct{ in string; want string }*/{"Hello, world", "dlrow ,olleH"},
+ }
```
Default: `false`
### `go.inlayHints.constantValues`
-Enable/disable inlay hints for constant values.
+Enable/disable inlay hints for constant values:
```go
-
-const (
- KindNone = iota /*= 0*/
- KindPrint /*= 1*/
- KindPrintf /*= 2*/
- KindErrorf /*= 3*/
-)
+ const (
+ KindNone Kind = iota/* = 0*/
+ KindPrint/* = 1*/
+ KindPrintf/* = 2*/
+ KindErrorf/* = 3*/
+ )
```
Default: `false`
### `go.inlayHints.functionTypeParameters`
-Enable/disable inlay hints for implicit type parameters on generic functions.
+Enable/disable inlay hints for implicit type parameters on generic functions:
```go
-
-func myFunc[T any](a T) { ... }
-
-func main() {
- myFunc/*[int]*/(1)
-}
+ myFoo/*[int, string]*/(1, "hello")
```
Default: `false`
### `go.inlayHints.parameterNames`
-Enable/disable inlay hints for parameter names.
+Enable/disable inlay hints for parameter names:
```go
-
-http.HandleFunc(/*pattern:*/ "/", /*handler:*/ indexHandler)
+ parseInt(/* str: */ "123", /* radix: */ 8)
```
Default: `false`
### `go.inlayHints.rangeVariableTypes`
-Enable/disable inlay hints for variable types in range statements.
+Enable/disable inlay hints for variable types in range statements:
```go
-
-for k /*int*/, v /*string*/ := range []string{} { ... }
+ for k/* int*/, v/* string*/ := range []string{} {
+ fmt.Println(k, v)
+ }
```
Default: `false`
@@ -744,6 +727,7 @@
| `gc_details` | Toggle the calculation of gc annotations. <br/> Default: `false` |
| `generate` | Runs `go generate` for a given directory. <br/> Default: `true` |
| `regenerate_cgo` | Regenerates cgo definitions. <br/> Default: `true` |
+| `run_vulncheck_exp` | Run vulnerability check (`govulncheck`). <br/> Default: `false` |
| `test` | Runs `go test` for a specific set of test or benchmark functions. <br/> Default: `false` |
| `tidy` | Runs `go mod tidy` for a module. <br/> Default: `true` |
| `upgrade_dependency` | Upgrades a dependency in the go.mod file for a module. <br/> Default: `true` |
@@ -837,12 +821,14 @@
| `stubmethods` | stub methods analyzer <br/> This analyzer generates method stubs for concrete types in order to implement a target interface <br/> Default: `true` |
| `testinggoroutine` | report calls to (*testing.T).Fatal from goroutines started by a test. <br/> Functions that abruptly terminate a test, such as the Fatal, Fatalf, FailNow, and Skip{,f,Now} methods of *testing.T, must be called from the test goroutine itself. This checker detects calls to these functions that occur within a goroutine started by the test. For example: <br/> func TestFoo(t *testing.T) { go func() { t.Fatal("oops") // error: (*T).Fatal called from non-test goroutine }() } <br/> <br/> Default: `true` |
| `tests` | check for common mistaken usages of tests and examples <br/> The tests checker walks Test, Benchmark and Example functions checking malformed names, wrong signatures and examples documenting non-existent identifiers. <br/> Please see the documentation for package testing in golang.org/pkg/testing for the conventions that are enforced for Tests, Benchmarks, and Examples. <br/> Default: `true` |
+| `timeformat` | check for calls of (time.Time).Format or time.Parse with 2006-02-01 <br/> The timeformat checker looks for time formats with the 2006-02-01 (yyyy-dd-mm) format. Internationally, "yyyy-dd-mm" does not occur in common calendar date standards, and so it is more likely that 2006-01-02 (yyyy-mm-dd) was intended. <br/> <br/> Default: `true` |
| `undeclaredname` | suggested fixes for "undeclared name: <>" <br/> This checker provides suggested fixes for type errors of the type "undeclared name: <>". It will either insert a new statement, such as: <br/> "<> := " <br/> or a new function declaration, such as: <br/> func <>(inferred parameters) { <pre>panic("implement me!")</pre>} <br/> <br/> Default: `true` |
| `unmarshal` | report passing non-pointer or non-interface values to unmarshal <br/> The unmarshal analysis reports calls to functions such as json.Unmarshal in which the argument type is not a pointer or an interface. <br/> Default: `true` |
| `unreachable` | check for unreachable code <br/> The unreachable analyzer finds statements that execution can never reach because they are preceded by an return statement, a call to panic, an infinite loop, or similar constructs. <br/> Default: `true` |
| `unsafeptr` | check for invalid conversions of uintptr to unsafe.Pointer <br/> The unsafeptr analyzer reports likely incorrect uses of unsafe.Pointer to convert integers to pointers. A conversion from uintptr to unsafe.Pointer is invalid if it implies that there is a uintptr-typed word in memory that holds a pointer value, because that word will be invisible to stack copying and to the garbage collector. <br/> Default: `true` |
| `unusedparams` | check for unused parameters of functions <br/> The unusedparams analyzer checks functions to see if there are any parameters that are not being used. <br/> To reduce false positives it ignores: - methods - parameters that do not have a name or are underscored - functions in test files - functions with empty bodies or those with just a return stmt <br/> Default: `false` |
| `unusedresult` | check for unused results of calls to some functions <br/> Some functions like fmt.Errorf return a result and have no side effects, so it is always a mistake to discard the result. This analyzer reports calls to certain functions in which the result of the call is ignored. <br/> The set of functions may be controlled using flags. <br/> Default: `true` |
+| `unusedvariable` | check for unused variables <br/> The unusedvariable analyzer suggests fixes for unused variables errors. <br/> <br/> Default: `false` |
| `unusedwrite` | checks for unused writes <br/> The analyzer reports instances of writes to struct fields and arrays that are never read. Specifically, when a struct object or an array is copied, its elements are copied implicitly by the compiler, and any element write to this copy does nothing with the original object. <br/> For example: <br/> <pre>type T struct { x int }<br/>func f(input []T) {<br/> for i, v := range input { // v is a copy<br/> v.x = i // unused write to field x<br/> }<br/>}</pre><br/> Another example is about non-pointer receiver: <br/> <pre>type T struct { x int }<br/>func (t T) f() { // t is a copy<br/> t.x = i // unused write to field x<br/>}</pre><br/> <br/> Default: `false` |
| `useany` | check for constraints that could be simplified to "any" <br/> Default: `false` |
### `ui.diagnostic.annotations`
@@ -912,6 +898,9 @@
If company chooses to use its own `godoc.org`, its address can be used as well.
+Modules matching the GOPRIVATE environment variable will not have
+documentation links in hover.
+
Default: `"pkg.go.dev"`
### `ui.documentation.linksInHover`
@@ -962,6 +951,18 @@
Default: `"Dynamic"`
+### `ui.noSemanticNumber`
+
+(Experimental) noSemanticNumber turns off the sending of the semantic token 'number'
+
+
+Default: `false`
+### `ui.noSemanticString`
+
+(Experimental) noSemanticString turns off the sending of the semantic token 'string'
+
+
+Default: `false`
### `ui.semanticTokens`
(Experimental) semanticTokens controls whether the LSP server will send
diff --git a/package.json b/package.json
index f1f24b0..9898ca0 100644
--- a/package.json
+++ b/package.json
@@ -2049,41 +2049,6 @@
"scope": "resource",
"type": "boolean"
},
- "go.inlayHints.assignVariableTypes": {
- "type": "boolean",
- "markdownDescription": "Enable/disable inlay hints for variable types in assign statements.\n```go\n\ni /*int*/, j /*int*/ := 0, len(r)-1\n```",
- "default": false
- },
- "go.inlayHints.compositeLiteralFields": {
- "type": "boolean",
- "markdownDescription": "Enable/disable inlay hints for composite literal field names.\n```go\n\nfor _, c := range []struct {in, want string}{\n\t{/*in:*/ \"Hello, world\", /*want:*/ \"dlrow ,olleH\"},\n\t{/*in:*/ \"Hello, 世界\", /*want:*/ \"界世 ,olleH\"},\n\t{/*in:*/ \"\", /*want:*/ \"\"},\n} {\n\t...\n}\n```",
- "default": false
- },
- "go.inlayHints.compositeLiteralTypes": {
- "type": "boolean",
- "markdownDescription": "Enable/disable inlay hints for composite literal types.\n```go\n\nfor _, c := range []struct {in, want string}{\n\t/*struct{ in, want string }*/{\"Hello, world\", \"dlrow ,olleH\"},\n\t/*struct{ in, want string }*/{\"Hello, 世界\", \"界世 ,olleH\"},\n\t/*struct{ in, want string }*/{\"\", \"\"},\n} {\n\t...\n}\n```",
- "default": false
- },
- "go.inlayHints.constantValues": {
- "type": "boolean",
- "markdownDescription": "Enable/disable inlay hints for constant values.\n```go\n\nconst (\n\tKindNone = iota\t/*= 0*/\n\tKindPrint\t/*= 1*/\n\tKindPrintf\t/*= 2*/\n\tKindErrorf\t/*= 3*/\n)\n```",
- "default": false
- },
- "go.inlayHints.functionTypeParameters": {
- "type": "boolean",
- "markdownDescription": "Enable/disable inlay hints for implicit type parameters on generic functions.\n```go\n\nfunc myFunc[T any](a T) { ... }\n\nfunc main() {\n\tmyFunc/*[int]*/(1)\n}\n```",
- "default": false
- },
- "go.inlayHints.parameterNames": {
- "type": "boolean",
- "markdownDescription": "Enable/disable inlay hints for parameter names.\n```go\n\nhttp.HandleFunc(/*pattern:*/ \"/\", /*handler:*/ indexHandler)\n```",
- "default": false
- },
- "go.inlayHints.rangeVariableTypes": {
- "type": "boolean",
- "markdownDescription": "Enable/disable inlay hints for variable types in range statements.\n```go\n\nfor k /*int*/, v /*string*/ := range []string{} { ... }\n```",
- "default": false
- },
"gopls": {
"type": "object",
"markdownDescription": "Configure the default Go language server ('gopls'). In most cases, configuring this section is unnecessary. See [the documentation](https://github.com/golang/tools/blob/master/gopls/doc/settings.md) for all available settings.",
@@ -2196,6 +2161,11 @@
"markdownDescription": "Regenerates cgo definitions.",
"default": true
},
+ "run_vulncheck_exp": {
+ "type": "boolean",
+ "markdownDescription": "Run vulnerability check (`govulncheck`).",
+ "default": false
+ },
"test": {
"type": "boolean",
"markdownDescription": "Runs `go test` for a specific set of test or benchmark functions.",
@@ -2442,6 +2412,11 @@
"markdownDescription": "check for common mistaken usages of tests and examples\n\nThe tests checker walks Test, Benchmark and Example functions checking\nmalformed names, wrong signatures and examples documenting non-existent\nidentifiers.\n\nPlease see the documentation for package testing in golang.org/pkg/testing\nfor the conventions that are enforced for Tests, Benchmarks, and Examples.",
"default": true
},
+ "timeformat": {
+ "type": "boolean",
+ "markdownDescription": "check for calls of (time.Time).Format or time.Parse with 2006-02-01\n\nThe timeformat checker looks for time formats with the 2006-02-01 (yyyy-dd-mm)\nformat. Internationally, \"yyyy-dd-mm\" does not occur in common calendar date\nstandards, and so it is more likely that 2006-01-02 (yyyy-mm-dd) was intended.\n",
+ "default": true
+ },
"undeclaredname": {
"type": "boolean",
"markdownDescription": "suggested fixes for \"undeclared name: <>\"\n\nThis checker provides suggested fixes for type errors of the\ntype \"undeclared name: <>\". It will either insert a new statement,\nsuch as:\n\n\"<> := \"\n\nor a new function declaration, such as:\n\nfunc <>(inferred parameters) {\n\tpanic(\"implement me!\")\n}\n",
@@ -2472,6 +2447,11 @@
"markdownDescription": "check for unused results of calls to some functions\n\nSome functions like fmt.Errorf return a result and have no side effects,\nso it is always a mistake to discard the result. This analyzer reports\ncalls to certain functions in which the result of the call is ignored.\n\nThe set of functions may be controlled using flags.",
"default": true
},
+ "unusedvariable": {
+ "type": "boolean",
+ "markdownDescription": "check for unused variables\n\nThe unusedvariable analyzer suggests fixes for unused variables errors.\n",
+ "default": false
+ },
"unusedwrite": {
"type": "boolean",
"markdownDescription": "checks for unused writes\n\nThe analyzer reports instances of writes to struct fields and\narrays that are never read. Specifically, when a struct object\nor an array is copied, its elements are copied implicitly by\nthe compiler, and any element write to this copy does nothing\nwith the original object.\n\nFor example:\n\n\ttype T struct { x int }\n\tfunc f(input []T) {\n\t\tfor i, v := range input { // v is a copy\n\t\t\tv.x = i // unused write to field x\n\t\t}\n\t}\n\nAnother example is about non-pointer receiver:\n\n\ttype T struct { x int }\n\tfunc (t T) f() { // t is a copy\n\t\tt.x = i // unused write to field x\n\t}\n",
@@ -2551,7 +2531,7 @@
},
"ui.documentation.linkTarget": {
"type": "string",
- "markdownDescription": "linkTarget controls where documentation links go.\nIt might be one of:\n\n* `\"godoc.org\"`\n* `\"pkg.go.dev\"`\n\nIf company chooses to use its own `godoc.org`, its address can be used as well.\n",
+ "markdownDescription": "linkTarget controls where documentation links go.\nIt might be one of:\n\n* `\"godoc.org\"`\n* `\"pkg.go.dev\"`\n\nIf company chooses to use its own `godoc.org`, its address can be used as well.\n\nModules matching the GOPRIVATE environment variable will not have\ndocumentation links in hover.\n",
"default": "pkg.go.dev",
"scope": "resource"
},
@@ -2611,6 +2591,18 @@
"default": "Dynamic",
"scope": "resource"
},
+ "ui.noSemanticNumber": {
+ "type": "boolean",
+ "markdownDescription": "(Experimental) noSemanticNumber turns off the sending of the semantic token 'number'\n",
+ "default": false,
+ "scope": "resource"
+ },
+ "ui.noSemanticString": {
+ "type": "boolean",
+ "markdownDescription": "(Experimental) noSemanticString turns off the sending of the semantic token 'string'\n",
+ "default": false,
+ "scope": "resource"
+ },
"ui.semanticTokens": {
"type": "boolean",
"markdownDescription": "(Experimental) semanticTokens controls whether the LSP server will send\nsemantic tokens to the client.\n",
@@ -2624,6 +2616,41 @@
"scope": "resource"
}
}
+ },
+ "go.inlayHints.assignVariableTypes": {
+ "type": "boolean",
+ "markdownDescription": "Enable/disable inlay hints for variable types in assign statements:\n```go\n\ti/* int*/, j/* int*/ := 0, len(r)-1\n```",
+ "default": false
+ },
+ "go.inlayHints.compositeLiteralFields": {
+ "type": "boolean",
+ "markdownDescription": "Enable/disable inlay hints for composite literal field names:\n```go\n\t{/*in: */\"Hello, world\", /*want: */\"dlrow ,olleH\"}\n```",
+ "default": false
+ },
+ "go.inlayHints.compositeLiteralTypes": {
+ "type": "boolean",
+ "markdownDescription": "Enable/disable inlay hints for composite literal types:\n```go\n\tfor _, c := range []struct {\n\t\tin, want string\n\t}{\n\t\t/*struct{ in string; want string }*/{\"Hello, world\", \"dlrow ,olleH\"},\n\t}\n```",
+ "default": false
+ },
+ "go.inlayHints.constantValues": {
+ "type": "boolean",
+ "markdownDescription": "Enable/disable inlay hints for constant values:\n```go\n\tconst (\n\t\tKindNone Kind = iota/* = 0*/\n\t\tKindPrint/* = 1*/\n\t\tKindPrintf/* = 2*/\n\t\tKindErrorf/* = 3*/\n\t)\n```",
+ "default": false
+ },
+ "go.inlayHints.functionTypeParameters": {
+ "type": "boolean",
+ "markdownDescription": "Enable/disable inlay hints for implicit type parameters on generic functions:\n```go\n\tmyFoo/*[int, string]*/(1, \"hello\")\n```",
+ "default": false
+ },
+ "go.inlayHints.parameterNames": {
+ "type": "boolean",
+ "markdownDescription": "Enable/disable inlay hints for parameter names:\n```go\n\tparseInt(/* str: */ \"123\", /* radix: */ 8)\n```",
+ "default": false
+ },
+ "go.inlayHints.rangeVariableTypes": {
+ "type": "boolean",
+ "markdownDescription": "Enable/disable inlay hints for variable types in range statements:\n```go\n\tfor k/* int*/, v/* string*/ := range []string{} {\n\t\tfmt.Println(k, v)\n\t}\n```",
+ "default": false
}
}
},
diff --git a/tools/goplssetting/goplssetting.go b/tools/goplssetting/goplssetting.go
index e78d26c..b300ec1 100644
--- a/tools/goplssetting/goplssetting.go
+++ b/tools/goplssetting/goplssetting.go
@@ -17,10 +17,6 @@
"strings"
)
-var skipHierarchy map[string]bool = map[string]bool{
- "ui.inlayhint": true,
-}
-
// Generate reads package.json and updates the gopls settings section
// based on `gopls api-json` output. This function requires `jq` to
// manipulate package.json.
@@ -185,22 +181,21 @@
return v[i].Name < v[j].Name
})
}
- properties, err := collectProperties(seen)
+ goplsProperties, goProperties, err := collectProperties(seen)
if err != nil {
return nil, err
}
- return json.Marshal(map[string]*Object{
- "gopls": {
- Type: "object",
- MarkdownDescription: "Configure the default Go language server ('gopls'). In most cases, configuring this section is unnecessary. See [the documentation](https://github.com/golang/tools/blob/master/gopls/doc/settings.md) for all available settings.",
- Scope: "resource",
- AdditionalProperties: false,
- Properties: properties,
- },
- })
+ goProperties["gopls"] = &Object{
+ Type: "object",
+ MarkdownDescription: "Configure the default Go language server ('gopls'). In most cases, configuring this section is unnecessary. See [the documentation](https://github.com/golang/tools/blob/master/gopls/doc/settings.md) for all available settings.",
+ Scope: "resource",
+ AdditionalProperties: false,
+ Properties: goplsProperties,
+ }
+ return json.Marshal(goProperties)
}
-func collectProperties(m map[string][]*OptionJSON) (map[string]*Object, error) {
+func collectProperties(m map[string][]*OptionJSON) (goplsProperties, goProperties map[string]*Object, err error) {
var sorted []string
var containsEmpty bool
for k := range m {
@@ -214,9 +209,23 @@
if containsEmpty {
sorted = append(sorted, "")
}
- properties := map[string]*Object{}
+ goplsProperties, goProperties = map[string]*Object{}, map[string]*Object{}
for _, hierarchy := range sorted {
- if skip := skipHierarchy[hierarchy]; skip {
+ if hierarchy == "ui.inlayhint" {
+ for _, opt := range m[hierarchy] {
+ for _, k := range opt.EnumKeys.Keys {
+ unquotedName, err := strconv.Unquote(k.Name)
+ if err != nil {
+ return nil, nil, err
+ }
+ key := "go.inlayHints." + unquotedName
+ goProperties[key] = &Object{
+ MarkdownDescription: k.Doc,
+ Type: "boolean",
+ Default: formatDefault(k.Default, "boolean"),
+ }
+ }
+ }
continue
}
for _, opt := range m[hierarchy] {
@@ -237,7 +246,7 @@
for _, v := range opt.EnumValues {
unquotedName, err := strconv.Unquote(v.Value)
if err != nil {
- return nil, err
+ return nil, nil, err
}
obj.Enum = append(obj.Enum, unquotedName)
obj.MarkdownEnumDescriptions = append(obj.MarkdownEnumDescriptions, v.Doc)
@@ -251,7 +260,7 @@
for _, k := range opt.EnumKeys.Keys {
unquotedName, err := strconv.Unquote(k.Name)
if err != nil {
- return nil, err
+ return nil, nil, err
}
obj.Properties[unquotedName] = &Object{
Type: propertyType(opt.EnumKeys.ValueType),
@@ -267,10 +276,10 @@
if hierarchy != "" {
key = hierarchy + "." + key
}
- properties[key] = obj
+ goplsProperties[key] = obj
}
}
- return properties, nil
+ return goplsProperties, goProperties, nil
}
func formatOptionDefault(opt *OptionJSON) interface{} {