/
gen.go
68 lines (65 loc) · 1.43 KB
/
gen.go
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
package main
import (
"bytes"
"fmt"
"go/format"
"os"
"reflect"
"runtime"
"strings"
"runtime.link/api/call/internal/cgo"
)
func main() {
file, err := os.Create("./gen_" + runtime.GOOS + "_" + runtime.GOARCH + ".go")
if err != nil {
panic(err)
}
defer file.Close()
var buf bytes.Buffer
cgo.Dump(&buf)
data := buf.Bytes()
kinds := []reflect.Kind{
reflect.Invalid,
reflect.Bool,
reflect.Int,
reflect.Int8,
reflect.Int16,
reflect.Int32,
reflect.Int64,
reflect.Uint,
reflect.Uint8,
reflect.Uint16,
reflect.Uint32,
reflect.Uint64,
reflect.Uintptr,
reflect.Float32,
reflect.Float64,
reflect.Complex64,
reflect.Complex128,
reflect.Array,
reflect.Chan,
reflect.Func,
reflect.Interface,
reflect.Map,
reflect.Pointer,
reflect.Slice,
reflect.String,
reflect.Struct,
reflect.UnsafePointer,
}
for i := len(kinds) - 1; i >= 0; i-- {
data = bytes.ReplaceAll(data, []byte(fmt.Sprintf("kind:0x%x", int(kinds[i]))), []byte("kind:reflect."+strings.Title(kinds[i].String())))
}
data = bytes.ReplaceAll(data, []byte(","), []byte(",\n"))
data = bytes.ReplaceAll(data, []byte("{"), []byte("{\n"))
data = bytes.ReplaceAll(data, []byte("}"), []byte(",\n}"))
data, err = format.Source(data)
if err != nil {
panic(err)
}
fmt.Fprintln(file, "// Code generated by gen/gen.go. DO NOT EDIT.")
fmt.Fprintln(file, "package cgo")
fmt.Fprintln(file)
fmt.Fprintln(file, `import "reflect"`)
file.Write(data)
}