Skip to content

Commit dcdf970

Browse files
committed
WIP7
Signed-off-by: Koichi Shiraishi <[email protected]>
1 parent 26e06f8 commit dcdf970

File tree

11 files changed

+17304
-97
lines changed

11 files changed

+17304
-97
lines changed

protocol/types_generics.go

Lines changed: 444 additions & 26 deletions
Large diffs are not rendered by default.

tools/protocol-gen/generator/client_server.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,13 @@ func (gen *Generator) request(g Printer, meth string, req *protocol.Request) (nR
374374
gen.renderRequestssOrTypeNull(g, req, r)
375375
g.P(`, `)
376376
default:
377-
genericsType := genericsType{
377+
genericsProp := &protocol.Property{
378378
Name: meth + "Result",
379379
Documentation: req.Documentation,
380380
Since: req.Since,
381381
Proposed: req.Proposed,
382382
}
383-
gen.renderRequestssOrType(g, r, genericsType)
383+
gen.renderRequestssOrType(g, r, genericsProp)
384384
g.P(`, `)
385385
}
386386

@@ -410,13 +410,13 @@ func (gen *Generator) renderRequestsArrayType(g Printer, req *protocol.Request,
410410
g.P(`[]*`)
411411
gen.renderRequestssOrTypeNull(g, req, elem)
412412
default:
413-
genericsType := genericsType{
413+
genericsProp := &protocol.Property{
414414
Name: normalizeMethodName(req.TypeName) + "Result",
415415
Documentation: req.Documentation,
416416
Since: req.Since,
417417
Proposed: req.Proposed,
418418
}
419-
gen.renderRequestssOrType(g, elem, genericsType)
419+
gen.renderRequestssOrType(g, elem, genericsProp)
420420
}
421421

422422
default:
@@ -447,7 +447,7 @@ func (gen *Generator) renderRequestssOrTypeNull(g Printer, req *protocol.Request
447447
}
448448
}
449449

450-
func (gen *Generator) renderRequestssOrType(g Printer, or *protocol.OrType, genericsType genericsType) {
451-
g.P(` *`, genericsType.Name)
452-
gen.genericsTypes[genericsType] = or.Items
450+
func (gen *Generator) renderRequestssOrType(g Printer, or *protocol.OrType, genericsProp *protocol.Property) {
451+
g.P(` *`, genericsProp.Name)
452+
gen.genericsTypes[genericsProp] = or.Items
453453
}

tools/protocol-gen/generator/generator.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import (
1414
"strconv"
1515
"strings"
1616

17-
"github.com/davecgh/go-spew/spew"
1817
"github.com/gobuffalo/flect"
18+
"github.com/kortschak/utter"
1919

2020
"go.lsp.dev/protocol/tools/protocol-gen/protocol"
2121
)
@@ -25,10 +25,17 @@ var acronyms = [...]string{
2525
}
2626

2727
func init() {
28-
spew.Config = spew.ConfigState{
29-
Indent: " ",
30-
ContinueOnMethod: true,
31-
SortKeys: true,
28+
utter.Config = utter.ConfigState{
29+
Indent: " ",
30+
NumericWidth: 1,
31+
StringWidth: 1,
32+
Quoting: utter.AvoidEscapes,
33+
BytesWidth: 16,
34+
CommentBytes: true,
35+
AddressBytes: true,
36+
CommentPointers: true,
37+
ElideType: true,
38+
SortKeys: true,
3239
}
3340

3441
var buf bytes.Buffer
@@ -51,27 +58,20 @@ const (
5158
pkgJSONRPC = `"go.lsp.dev/jsonrpc2"`
5259
)
5360

54-
type genericsType struct {
55-
Name string
56-
Documentation string
57-
Since string
58-
Proposed bool
59-
}
60-
6161
type Generator struct {
6262
enumerations []Printer
6363
typeAliases []Printer
6464
structures []Printer
6565
client []Printer
6666
server []Printer
6767
generics map[string]bool
68-
genericsTypes map[genericsType][]protocol.Type
68+
genericsTypes map[*protocol.Property][]protocol.Type
6969
files map[string]*os.File
7070
}
7171

7272
func (gen *Generator) Init() {
7373
gen.generics = make(map[string]bool)
74-
gen.genericsTypes = make(map[genericsType][]protocol.Type)
74+
gen.genericsTypes = make(map[*protocol.Property][]protocol.Type)
7575
gen.files = make(map[string]*os.File)
7676
}
7777

tools/protocol-gen/generator/generics_types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ import (
1616
func (gen *Generator) GenericsTypes() error {
1717
g := NewPrinter("types_generics")
1818

19-
sorted := make([]genericsType, len(gen.genericsTypes))
19+
sorted := make([]*protocol.Property, len(gen.genericsTypes))
2020
i := 0
2121
for generics := range gen.genericsTypes {
2222
sorted[i] = generics
2323
i++
2424
}
25-
slices.SortFunc(sorted, func(a, b genericsType) int {
25+
slices.SortFunc(sorted, func(a, b *protocol.Property) int {
2626
return cmp.Compare(a.Name, b.Name)
2727
})
2828

tools/protocol-gen/generator/structure.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -512,23 +512,23 @@ func (gen *Generator) Structures(structures []*protocol.Structure) error {
512512
gen.renderStructuresReferenceType(g, prop, node)
513513

514514
case *protocol.ArrayType:
515-
genericsType := genericsType{
515+
genericsProp := &protocol.Property{
516516
Name: structuresName + propName,
517517
Documentation: prop.Documentation,
518518
Since: structure.Since,
519519
Proposed: structure.Proposed,
520520
}
521521
g.P(` `)
522-
gen.renderStructuresArrayTypeGeneric(g, node, genericsType)
522+
gen.renderStructuresArrayTypeGeneric(g, node, genericsProp)
523523

524524
case *protocol.MapType:
525-
genericsType := genericsType{
525+
genericsProp := &protocol.Property{
526526
Name: structuresName + propName,
527527
Documentation: prop.Documentation,
528528
Since: structure.Since,
529529
Proposed: structure.Proposed,
530530
}
531-
gen.renderStructuresMapType(g, node, genericsType)
531+
gen.renderStructuresMapType(g, node, genericsProp)
532532

533533
case *protocol.OrType:
534534
switch {
@@ -554,13 +554,15 @@ func (gen *Generator) Structures(structures []*protocol.Structure) error {
554554
if isNull(node.Items...) {
555555
prop.Optional = true
556556
}
557-
genericsType := genericsType{
557+
genericsProp := &protocol.Property{
558558
Name: structuresName + propName,
559+
Optional: prop.Optional,
559560
Documentation: prop.Documentation,
560-
Since: structure.Since,
561-
Proposed: structure.Proposed,
561+
Proposed: prop.Proposed,
562+
Since: prop.Since,
563+
Deprecated: prop.Deprecated,
562564
}
563-
gen.renderStructuresOrType(g, node, genericsType)
565+
gen.renderStructuresOrType(g, node, genericsProp)
564566
}
565567

566568
default:
@@ -599,7 +601,7 @@ func (gen *Generator) renderStructuresReferenceType(g Printer, prop *protocol.Pr
599601
case `LSPArray`:
600602
name = `[]any`
601603
default:
602-
if _, ok := enumerationNames[ref.Name]; !ok && prop.Optional {
604+
if _, ok := enumerationNames[name]; !ok && prop.Optional {
603605
g.P(`*`)
604606
}
605607
}
@@ -618,7 +620,7 @@ func (gen *Generator) renderStructuresArrayType(g Printer, array *protocol.Array
618620
}
619621
}
620622

621-
func (gen *Generator) renderStructuresArrayTypeGeneric(g Printer, array *protocol.ArrayType, genericsType genericsType) {
623+
func (gen *Generator) renderStructuresArrayTypeGeneric(g Printer, array *protocol.ArrayType, genericsProp *protocol.Property) {
622624
elem := array.Element
623625
switch elem := elem.(type) {
624626
case protocol.BaseType:
@@ -628,14 +630,14 @@ func (gen *Generator) renderStructuresArrayTypeGeneric(g Printer, array *protoco
628630
g.P(`[]` + normalizeLSPTypes(elem.String()))
629631

630632
case *protocol.OrType:
631-
gen.renderStructuresOrType(g, elem, genericsType)
633+
gen.renderStructuresOrType(g, elem, genericsProp)
632634

633635
default:
634636
panic(fmt.Sprintf("structures.ArrayKind: %#v\n", elem))
635637
}
636638
}
637639

638-
func (gen *Generator) renderStructuresMapType(g Printer, m *protocol.MapType, genericsType genericsType) {
640+
func (gen *Generator) renderStructuresMapType(g Printer, m *protocol.MapType, genericsProp *protocol.Property) {
639641
g.P(` map`)
640642

641643
// write map key
@@ -656,17 +658,17 @@ func (gen *Generator) renderStructuresMapType(g Printer, m *protocol.MapType, ge
656658
g.P(normalizeLSPTypes(val.String()))
657659

658660
case *protocol.ArrayType:
659-
gen.renderStructuresArrayTypeGeneric(g, val, genericsType)
661+
gen.renderStructuresArrayTypeGeneric(g, val, genericsProp)
660662

661663
case *protocol.OrType:
662-
gen.renderStructuresOrType(g, val, genericsType)
664+
gen.renderStructuresOrType(g, val, genericsProp)
663665

664666
default:
665667
panic(fmt.Sprintf("structures.MapType.Value: %[1]T = %#[1]v\n", m.Value))
666668
}
667669
}
668670

669-
func (gen *Generator) renderStructuresOrType(g Printer, or *protocol.OrType, genericsType genericsType) {
670-
g.P(` `, genericsType.Name)
671-
gen.genericsTypes[genericsType] = or.Items
671+
func (gen *Generator) renderStructuresOrType(g Printer, or *protocol.OrType, genericsProp *protocol.Property) {
672+
g.P(` `, genericsProp.Name)
673+
gen.genericsTypes[genericsProp] = or.Items
672674
}

tools/protocol-gen/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
module go.lsp.dev/protocol/tools/protocol-gen
22

3-
go 1.22.2
3+
go 1.23
44

55
require (
6-
github.com/davecgh/go-spew v1.1.1
76
github.com/gobuffalo/flect v1.0.2
7+
github.com/kortschak/utter v1.7.0
88
golang.org/x/text v0.14.0
99
)

tools/protocol-gen/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
33
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
44
github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA=
55
github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
6+
github.com/kortschak/utter v1.7.0 h1:6NKMynvGUyqfeMTawfah4zyInlrgwzjkDAHrT+skx/w=
7+
github.com/kortschak/utter v1.7.0/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc=
68
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
79
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
810
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

tools/protocol-gen/main.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"os"
1414
"strings"
1515

16-
"github.com/davecgh/go-spew/spew"
16+
"github.com/kortschak/utter"
1717

1818
"go.lsp.dev/protocol/tools/protocol-gen/generator"
1919
"go.lsp.dev/protocol/tools/protocol-gen/resolver"
@@ -26,10 +26,17 @@ const (
2626
)
2727

2828
func init() {
29-
spew.Config = spew.ConfigState{
30-
Indent: " ",
31-
ContinueOnMethod: true,
32-
SortKeys: true,
29+
utter.Config = utter.ConfigState{
30+
Indent: " ",
31+
NumericWidth: 1,
32+
StringWidth: 1,
33+
Quoting: utter.AvoidEscapes,
34+
BytesWidth: 16,
35+
CommentBytes: true,
36+
AddressBytes: true,
37+
CommentPointers: true,
38+
ElideType: true,
39+
SortKeys: true,
3340
}
3441
}
3542

tools/protocol-gen/resolver/resolver.go

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -187,31 +187,34 @@ func (r *resolver) structure(in schema.Structure) *protocol.Structure {
187187
NestedNames: []string{name},
188188
}
189189
for _, propertyIn := range in.Properties {
190-
defer scopedAssignment(&r.newStructureLiteralType, func(in *schema.StructureLiteralType) protocol.Type {
191-
name := cases.Title(language.Und, cases.NoLower).String(propertyIn.Name)
192-
out.NestedStructures = append(out.NestedStructures,
193-
&protocol.Structure{
194-
Deprecated: in.Value.Deprecated,
195-
Documentation: r.documentation(in.Value.Documentation),
196-
Properties: transform(in.Value.Properties, r.property),
197-
Name: name,
198-
Proposed: in.Value.Proposed,
199-
Since: in.Value.Since,
200-
NestedNames: append(append([]string{}, out.NestedNames...), name),
201-
},
202-
)
203-
ref := &protocol.ReferenceType{Name: name}
204-
r.allReferenceTypes = append(r.allReferenceTypes, ref)
205-
return ref
206-
})()
207-
propertyOut := r.property(propertyIn)
208-
if propertyOut.JSONName == "kind" {
209-
if lit, ok := propertyOut.Type.(*protocol.StringLiteralType); ok {
210-
out.Kind = lit.Value
211-
continue
190+
func() {
191+
defer scopedAssignment(&r.newStructureLiteralType, func(in *schema.StructureLiteralType) protocol.Type {
192+
name := cases.Title(language.Und, cases.NoLower).String(propertyIn.Name)
193+
out.NestedStructures = append(out.NestedStructures,
194+
&protocol.Structure{
195+
Deprecated: in.Value.Deprecated,
196+
Documentation: r.documentation(in.Value.Documentation),
197+
Properties: transform(in.Value.Properties, r.property),
198+
Name: name,
199+
Proposed: in.Value.Proposed,
200+
Since: in.Value.Since,
201+
NestedNames: append(append([]string{}, out.NestedNames...), name),
202+
},
203+
)
204+
ref := &protocol.ReferenceType{Name: name}
205+
r.allReferenceTypes = append(r.allReferenceTypes, ref)
206+
return ref
207+
})()
208+
209+
propertyOut := r.property(propertyIn)
210+
if propertyOut.JSONName == "kind" {
211+
if lit, ok := propertyOut.Type.(*protocol.StringLiteralType); ok {
212+
out.Kind = lit.Value
213+
return
214+
}
212215
}
213-
}
214-
out.Properties = append(out.Properties, propertyOut)
216+
out.Properties = append(out.Properties, propertyOut)
217+
}()
215218
}
216219
return out
217220
}

0 commit comments

Comments
 (0)