1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package settings
import (
"fmt"
"io"
"regexp"
"strings"
)
type APIJSON struct {
Options map[string][]*OptionJSON
Commands []*CommandJSON
Lenses []*LensJSON
Analyzers []*AnalyzerJSON
Hints []*HintJSON
}
type OptionJSON struct {
Name string
Type string
Doc string
EnumKeys EnumKeys
EnumValues []EnumValue
Default string
Status string
Hierarchy string
}
func (o *OptionJSON) String() string {
return o.Name
}
func (o *OptionJSON) Write(w io.Writer) {
fmt.Fprintf(w, "**%v** *%v*\n\n", o.Name, o.Type)
writeStatus(w, o.Status)
enumValues := collectEnums(o)
fmt.Fprintf(w, "%v%v\nDefault: `%v`.\n\n", o.Doc, enumValues, o.Default)
}
func writeStatus(section io.Writer, status string) {
switch status {
case "":
case "advanced":
fmt.Fprint(section, "**This is an advanced setting and should not be configured by most `gopls` users.**\n\n")
case "debug":
fmt.Fprint(section, "**This setting is for debugging purposes only.**\n\n")
case "experimental":
fmt.Fprint(section, "**This setting is experimental and may be deleted.**\n\n")
default:
fmt.Fprintf(section, "**Status: %s.**\n\n", status)
}
}
var parBreakRE = regexp.MustCompile("\n{2,}")
func collectEnums(opt *OptionJSON) string {
var b strings.Builder
write := func(name, doc string) {
if doc != "" {
unbroken := parBreakRE.ReplaceAllString(doc, "\\\n")
fmt.Fprintf(&b, "* %s\n", strings.TrimSpace(unbroken))
} else {
fmt.Fprintf(&b, "* `%s`\n", name)
}
}
if len(opt.EnumValues) > 0 && opt.Type == "enum" {
b.WriteString("\nMust be one of:\n\n")
for _, val := range opt.EnumValues {
write(val.Value, val.Doc)
}
} else if len(opt.EnumKeys.Keys) > 0 && shouldShowEnumKeysInSettings(opt.Name) {
b.WriteString("\nCan contain any of:\n\n")
for _, val := range opt.EnumKeys.Keys {
write(val.Name, val.Doc)
}
}
return b.String()
}
func shouldShowEnumKeysInSettings(name string) bool {
// These fields have too many possible options to print.
return !(name == "analyses" || name == "codelenses" || name == "hints")
}
type EnumKeys struct {
ValueType string
Keys []EnumKey
}
type EnumKey struct {
Name string
Doc string
Default string
}
type EnumValue struct {
Value string
Doc string
}
type CommandJSON struct {
Command string
Title string
Doc string
ArgDoc string
ResultDoc string
}
func (c *CommandJSON) String() string {
return c.Command
}
func (c *CommandJSON) Write(w io.Writer) {
fmt.Fprintf(w, "### **%v**\nIdentifier: `%v`\n\n%v\n\n", c.Title, c.Command, c.Doc)
if c.ArgDoc != "" {
fmt.Fprintf(w, "Args:\n\n```\n%s\n```\n\n", c.ArgDoc)
}
if c.ResultDoc != "" {
fmt.Fprintf(w, "Result:\n\n```\n%s\n```\n\n", c.ResultDoc)
}
}
type LensJSON struct {
Lens string
Title string
Doc string
}
func (l *LensJSON) String() string {
return l.Title
}
func (l *LensJSON) Write(w io.Writer) {
fmt.Fprintf(w, "%s (%s): %s", l.Title, l.Lens, l.Doc)
}
type AnalyzerJSON struct {
Name string
Doc string
URL string
Default bool
}
func (a *AnalyzerJSON) String() string {
return a.Name
}
func (a *AnalyzerJSON) Write(w io.Writer) {
fmt.Fprintf(w, "%s (%s): %v", a.Name, a.Doc, a.Default)
}
type HintJSON struct {
Name string
Doc string
Default bool
}
func (h *HintJSON) String() string {
return h.Name
}
func (h *HintJSON) Write(w io.Writer) {
fmt.Fprintf(w, "%s (%s): %v", h.Name, h.Doc, h.Default)
}
|