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  }