gitlab.com/Raven-IO/raven-delve@v1.22.4/service/dap/daptest/gen/main.go (about) 1 // Binary gen generates service/dap/daptest/responses.go. 2 package main 3 4 import ( 5 "bytes" 6 "flag" 7 "fmt" 8 "go/format" 9 "go/types" 10 "os" 11 "text/template" 12 13 "golang.org/x/tools/go/packages" 14 15 _ "github.com/google/go-dap" 16 ) 17 18 var oFlag = flag.String("o", "", "output file name") 19 20 var tmpl = template.Must(template.New("assert").Parse(`package daptest 21 22 // Code generated by go generate; DO NOT EDIT. 23 // The code generator program is in ./gen directory. 24 25 import ( 26 "testing" 27 28 "github.com/google/go-dap" 29 ) 30 {{range .}} 31 // Expect{{.}} reads a protocol message from the connection 32 // and fails the test if the read message is not *{{.}}. 33 func (c *Client) Expect{{.}}(t *testing.T) *dap.{{.}} { 34 t.Helper() 35 m := c.ExpectMessage(t) 36 return c.Check{{.}}(t, m) 37 } 38 39 // Check{{.}} fails the test if m is not *{{.}}. 40 func (c *Client) Check{{.}}(t *testing.T, m dap.Message) *dap.{{.}} { 41 t.Helper(){{if or (or (eq . "StepInResponse") (eq . "StepOutResponse")) (eq . "NextResponse") }} 42 _, ok := m.(*dap.ContinuedEvent) 43 if !ok { 44 t.Fatalf("got %#v, want *dap.ContinuedEvent", m) 45 } 46 m = c.ExpectMessage(t){{else}}{{if (eq . "ConfigurationDoneResponse") }} 47 oe, ok := m.(*dap.OutputEvent) 48 if !ok { 49 t.Fatalf("got %#v, want *dap.OutputEvent", m) 50 } 51 if oe.Body.Output != "Type 'dlv help' for list of commands.\n" { 52 t.Fatalf("got %#v, want Output=%q", m, "Type 'dlv help' for list of commands.\n") 53 } 54 m = c.ExpectMessage(t){{end}}{{end}} 55 r, ok := m.(*dap.{{.}}) 56 if !ok { 57 t.Fatalf("got %#v, want *dap.{{.}}", m) 58 } 59 return r 60 }{{end}} 61 `)) 62 63 func main() { 64 flag.Parse() 65 66 if *oFlag == "" { 67 fmt.Fprintf(os.Stderr, "-o must be provided\n") 68 } 69 70 pkgs, err := packages.Load(&packages.Config{ 71 Mode: packages.NeedTypes, 72 }, "github.com/google/go-dap") 73 if err != nil { 74 fmt.Fprintf(os.Stderr, "load: %v\n", err) 75 os.Exit(1) 76 } 77 if len(pkgs) != 1 || pkgs[0].Types == nil { 78 fmt.Fprintf(os.Stderr, "invalid package was loaded: %#v\n", pkgs) 79 os.Exit(1) 80 } 81 82 messages := []string{} 83 scope := pkgs[0].Types.Scope() 84 for _, name := range scope.Names() { 85 // Find only types that are embedding go-dap.Response message. 86 obj := scope.Lookup(name) 87 if !obj.Exported() { 88 continue // skip unexported 89 } 90 u, ok := obj.Type().Underlying().(*types.Struct) 91 if !ok { 92 continue 93 } 94 for i := 0; i < u.NumFields(); i++ { 95 if f := u.Field(i); f.Embedded() && (f.Type().String() == "github.com/google/go-dap.Response" || 96 f.Type().String() == "github.com/google/go-dap.Event") { 97 messages = append(messages, obj.Name()) 98 break 99 } 100 } 101 } 102 103 buf := &bytes.Buffer{} 104 if err := tmpl.Execute(buf, messages); err != nil { 105 fmt.Fprintf(os.Stderr, "Failed to generate: %v\n", err) 106 os.Exit(1) 107 } 108 formatted, err := format.Source(buf.Bytes()) 109 if err != nil { 110 fmt.Fprintf(os.Stderr, "Generated invalid go code: %v\n", err) 111 os.Exit(1) 112 } 113 if err := os.WriteFile(*oFlag, formatted, 0o644); err != nil { 114 fmt.Fprintf(os.Stderr, "Failed to write: %v\n", err) 115 os.Exit(1) 116 } 117 }