| // Copyright 2021 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. |
| |
| //go:build ignore |
| |
| // mkconsts generates const definition files for each GOEXPERIMENT. |
| package main |
| |
| import ( |
| "bytes" |
| "fmt" |
| "internal/goexperiment" |
| "log" |
| "os" |
| "reflect" |
| "strings" |
| ) |
| |
| func main() { |
| // Delete existing experiment constant files. |
| ents, err := os.ReadDir(".") |
| if err != nil { |
| log.Fatal(err) |
| } |
| for _, ent := range ents { |
| name := ent.Name() |
| if !strings.HasPrefix(name, "exp_") { |
| continue |
| } |
| // Check that this is definitely a generated file. |
| data, err := os.ReadFile(name) |
| if err != nil { |
| log.Fatalf("reading %s: %v", name, err) |
| } |
| if !bytes.Contains(data, []byte("Code generated by mkconsts")) { |
| log.Fatalf("%s: expected generated file", name) |
| } |
| if err := os.Remove(name); err != nil { |
| log.Fatal(err) |
| } |
| } |
| |
| // Generate new experiment constant files. |
| rt := reflect.TypeOf(&goexperiment.Flags{}).Elem() |
| for i := 0; i < rt.NumField(); i++ { |
| f := rt.Field(i).Name |
| buildTag := "goexperiment." + strings.ToLower(f) |
| for _, val := range []bool{false, true} { |
| name := fmt.Sprintf("exp_%s_%s.go", strings.ToLower(f), pick(val, "off", "on")) |
| data := fmt.Sprintf(`// Code generated by mkconsts.go. DO NOT EDIT. |
| |
| //go:build %s%s |
| |
| package goexperiment |
| |
| const %s = %v |
| const %sInt = %s |
| `, pick(val, "!", ""), buildTag, f, val, f, pick(val, "0", "1")) |
| if err := os.WriteFile(name, []byte(data), 0666); err != nil { |
| log.Fatalf("writing %s: %v", name, err) |
| } |
| } |
| } |
| } |
| |
| func pick(v bool, f, t string) string { |
| if v { |
| return t |
| } |
| return f |
| } |