Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions enumer.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ func %[1]sString(s string) (%[1]s, error) {
return val, nil
}

if val, ok := _%[1]sNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _%[1]sLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, %[2]s
Expand Down Expand Up @@ -99,9 +99,21 @@ func (g *Generator) buildBasicExtras(runs [][]Value, typeName string, runsThresh
}
}

// printValueMap prints the map from exact string name to value, and a second
// map from lower-cased name to value. Keeping them separate means a name that
// differs from another only by case is still found by its exact spelling.
func (g *Generator) printValueMap(runs [][]Value, typeName string, runsThreshold int) {
g.printNameToValueMap(runs, typeName, runsThreshold, "_%sNameToValueMap", "_%sName")
g.printNameToValueMap(runs, typeName, runsThreshold, "_%sLowerNameToValueMap", "_%sLowerName")
}

// printNameToValueMap prints one map literal named by mapNameFmt whose keys
// are slices of the string constant named by strNameFmt.
func (g *Generator) printNameToValueMap(runs [][]Value, typeName string, runsThreshold int, mapNameFmt, strNameFmt string) {
thereAreRuns := len(runs) > 1 && len(runs) <= runsThreshold
g.Printf("\nvar _%sNameToValueMap = map[string]%s{\n", typeName, typeName)
mapName := fmt.Sprintf(mapNameFmt, typeName)
strName := fmt.Sprintf(strNameFmt, typeName)
g.Printf("\nvar %s = map[string]%s{\n", mapName, typeName)

var n int
var runID string
Expand All @@ -114,13 +126,13 @@ func (g *Generator) printValueMap(runs [][]Value, typeName string, runsThreshold
}

for _, value := range values {
g.Printf("\t_%sName%s[%d:%d]: %s,\n", typeName, runID, n, n+len(value.name), value.originalName)
g.Printf("\t_%sLowerName%s[%d:%d]: %s,\n", typeName, runID, n, n+len(value.name), value.originalName)
g.Printf("\t%s%s[%d:%d]: %s,\n", strName, runID, n, n+len(value.name), value.originalName)
n += len(value.name)
}
}
g.Printf("}\n\n")
}

func (g *Generator) printNamesSlice(runs [][]Value, typeName string, runsThreshold int) {
thereAreRuns := len(runs) > 1 && len(runs) <= runsThreshold
g.Printf("\nvar _%sNames = []string{\n", typeName)
Expand Down
53 changes: 53 additions & 0 deletions testdata/casecollision.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Copyright 2014 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.

// Names that differ only by case must each be found by their exact spelling.
// Before the exact and lower-cased names were split into two maps, the
// lower-cased entry for one constant overwrote the exact entry for another.

package main

import "fmt"

type Casecollision int

const (
example Casecollision = iota
Example
EXAMPLE
)

func main() {
ck(example, "example")
ck(Example, "Example")
ck(EXAMPLE, "EXAMPLE")
ck(-127, "Casecollision(-127)")

// Exact spellings win.
ckLookup("example", example)
ckLookup("Example", Example)
ckLookup("EXAMPLE", EXAMPLE)

// A spelling that matches none exactly still resolves case-insensitively.
if v, err := CasecollisionString("eXaMpLe"); err != nil || !v.IsACasecollision() {
panic(fmt.Sprintf("casecollision.go: eXaMpLe -> %v, %v", v, err))
}

if _, err := CasecollisionString("nope"); err == nil {
panic("casecollision.go: expected error for nope")
}
}

func ck(v Casecollision, str string) {
if fmt.Sprint(v) != str {
panic("casecollision.go: " + str)
}
}

func ckLookup(s string, want Casecollision) {
got, err := CasecollisionString(s)
if err != nil || got != want {
panic(fmt.Sprintf("casecollision.go: CasecollisionString(%q) = %v, %v; want %v", s, got, err, want))
}
}
19 changes: 11 additions & 8 deletions testdata/day.golden
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,22 @@ func _DayNoOp() {
var _DayValues = []Day{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}

var _DayNameToValueMap = map[string]Day{
_DayName[0:6]: Monday,
_DayName[0:6]: Monday,
_DayName[6:13]: Tuesday,
_DayName[13:22]: Wednesday,
_DayName[22:30]: Thursday,
_DayName[30:36]: Friday,
_DayName[36:44]: Saturday,
_DayName[44:50]: Sunday,
}

var _DayLowerNameToValueMap = map[string]Day{
_DayLowerName[0:6]: Monday,
_DayName[6:13]: Tuesday,
_DayLowerName[6:13]: Tuesday,
_DayName[13:22]: Wednesday,
_DayLowerName[13:22]: Wednesday,
_DayName[22:30]: Thursday,
_DayLowerName[22:30]: Thursday,
_DayName[30:36]: Friday,
_DayLowerName[30:36]: Friday,
_DayName[36:44]: Saturday,
_DayLowerName[36:44]: Saturday,
_DayName[44:50]: Sunday,
_DayLowerName[44:50]: Sunday,
}

Expand All @@ -65,7 +68,7 @@ func DayString(s string) (Day, error) {
return val, nil
}

if val, ok := _DayNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _DayLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Day values", s)
Expand Down
19 changes: 11 additions & 8 deletions testdata/dayTrimAndPrefix.golden
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,22 @@ func _DayNoOp() {
var _DayValues = []Day{DayMonday, DayTuesday, DayWednesday, DayThursday, DayFriday, DaySaturday, DaySunday}

var _DayNameToValueMap = map[string]Day{
_DayName[0:11]: DayMonday,
_DayName[0:11]: DayMonday,
_DayName[11:23]: DayTuesday,
_DayName[23:37]: DayWednesday,
_DayName[37:50]: DayThursday,
_DayName[50:61]: DayFriday,
_DayName[61:74]: DaySaturday,
_DayName[74:85]: DaySunday,
}

var _DayLowerNameToValueMap = map[string]Day{
_DayLowerName[0:11]: DayMonday,
_DayName[11:23]: DayTuesday,
_DayLowerName[11:23]: DayTuesday,
_DayName[23:37]: DayWednesday,
_DayLowerName[23:37]: DayWednesday,
_DayName[37:50]: DayThursday,
_DayLowerName[37:50]: DayThursday,
_DayName[50:61]: DayFriday,
_DayLowerName[50:61]: DayFriday,
_DayName[61:74]: DaySaturday,
_DayLowerName[61:74]: DaySaturday,
_DayName[74:85]: DaySunday,
_DayLowerName[74:85]: DaySunday,
}

Expand All @@ -61,7 +64,7 @@ func DayString(s string) (Day, error) {
return val, nil
}

if val, ok := _DayNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _DayLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Day values", s)
Expand Down
19 changes: 11 additions & 8 deletions testdata/dayWithLinecomment.golden
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,22 @@ func _DayNoOp() {
var _DayValues = []Day{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}

var _DayNameToValueMap = map[string]Day{
_DayName[0:5]: Monday,
_DayName[0:5]: Monday,
_DayName[5:12]: Tuesday,
_DayName[12:21]: Wednesday,
_DayName[21:29]: Thursday,
_DayName[29:36]: Friday,
_DayName[36:44]: Saturday,
_DayName[44:50]: Sunday,
}

var _DayLowerNameToValueMap = map[string]Day{
_DayLowerName[0:5]: Monday,
_DayName[5:12]: Tuesday,
_DayLowerName[5:12]: Tuesday,
_DayName[12:21]: Wednesday,
_DayLowerName[12:21]: Wednesday,
_DayName[21:29]: Thursday,
_DayLowerName[21:29]: Thursday,
_DayName[29:36]: Friday,
_DayLowerName[29:36]: Friday,
_DayName[36:44]: Saturday,
_DayLowerName[36:44]: Saturday,
_DayName[44:50]: Sunday,
_DayLowerName[44:50]: Sunday,
}

Expand All @@ -61,7 +64,7 @@ func DayString(s string) (Day, error) {
return val, nil
}

if val, ok := _DayNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _DayLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Day values", s)
Expand Down
19 changes: 11 additions & 8 deletions testdata/dayWithPrefix.golden
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,22 @@ func _DayNoOp() {
var _DayValues = []Day{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}

var _DayNameToValueMap = map[string]Day{
_DayName[0:9]: Monday,
_DayName[0:9]: Monday,
_DayName[9:19]: Tuesday,
_DayName[19:31]: Wednesday,
_DayName[31:42]: Thursday,
_DayName[42:51]: Friday,
_DayName[51:62]: Saturday,
_DayName[62:71]: Sunday,
}

var _DayLowerNameToValueMap = map[string]Day{
_DayLowerName[0:9]: Monday,
_DayName[9:19]: Tuesday,
_DayLowerName[9:19]: Tuesday,
_DayName[19:31]: Wednesday,
_DayLowerName[19:31]: Wednesday,
_DayName[31:42]: Thursday,
_DayLowerName[31:42]: Thursday,
_DayName[42:51]: Friday,
_DayLowerName[42:51]: Friday,
_DayName[51:62]: Saturday,
_DayLowerName[51:62]: Saturday,
_DayName[62:71]: Sunday,
_DayLowerName[62:71]: Sunday,
}

Expand All @@ -61,7 +64,7 @@ func DayString(s string) (Day, error) {
return val, nil
}

if val, ok := _DayNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _DayLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Day values", s)
Expand Down
19 changes: 11 additions & 8 deletions testdata/flagvalue.golden
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,22 @@ func _DayNoOp() {
var _DayValues = []Day{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}

var _DayNameToValueMap = map[string]Day{
_DayName[0:6]: Monday,
_DayName[0:6]: Monday,
_DayName[6:13]: Tuesday,
_DayName[13:22]: Wednesday,
_DayName[22:30]: Thursday,
_DayName[30:36]: Friday,
_DayName[36:44]: Saturday,
_DayName[44:50]: Sunday,
}

var _DayLowerNameToValueMap = map[string]Day{
_DayLowerName[0:6]: Monday,
_DayName[6:13]: Tuesday,
_DayLowerName[6:13]: Tuesday,
_DayName[13:22]: Wednesday,
_DayLowerName[13:22]: Wednesday,
_DayName[22:30]: Thursday,
_DayLowerName[22:30]: Thursday,
_DayName[30:36]: Friday,
_DayLowerName[30:36]: Friday,
_DayName[36:44]: Saturday,
_DayLowerName[36:44]: Saturday,
_DayName[44:50]: Sunday,
_DayLowerName[44:50]: Sunday,
}

Expand All @@ -61,7 +64,7 @@ func DayString(s string) (Day, error) {
return val, nil
}

if val, ok := _DayNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _DayLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Day values", s)
Expand Down
21 changes: 12 additions & 9 deletions testdata/gap.golden
Original file line number Diff line number Diff line change
Expand Up @@ -50,21 +50,24 @@ func _GapNoOp() {
var _GapValues = []Gap{Two, Three, Five, Six, Seven, Eight, Nine, Eleven}

var _GapNameToValueMap = map[string]Gap{
_GapName_0[0:3]: Two,
_GapName_0[0:3]: Two,
_GapName_0[3:8]: Three,
_GapName_1[0:4]: Five,
_GapName_1[4:7]: Six,
_GapName_1[7:12]: Seven,
_GapName_1[12:17]: Eight,
_GapName_1[17:21]: Nine,
_GapName_2[0:6]: Eleven,
}

var _GapLowerNameToValueMap = map[string]Gap{
_GapLowerName_0[0:3]: Two,
_GapName_0[3:8]: Three,
_GapLowerName_0[3:8]: Three,
_GapName_1[0:4]: Five,
_GapLowerName_1[0:4]: Five,
_GapName_1[4:7]: Six,
_GapLowerName_1[4:7]: Six,
_GapName_1[7:12]: Seven,
_GapLowerName_1[7:12]: Seven,
_GapName_1[12:17]: Eight,
_GapLowerName_1[12:17]: Eight,
_GapName_1[17:21]: Nine,
_GapLowerName_1[17:21]: Nine,
_GapName_2[0:6]: Eleven,
_GapLowerName_2[0:6]: Eleven,
}

Expand All @@ -86,7 +89,7 @@ func GapString(s string) (Gap, error) {
return val, nil
}

if val, ok := _GapNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _GapLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Gap values", s)
Expand Down
15 changes: 9 additions & 6 deletions testdata/num.golden
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,18 @@ func _NumNoOp() {
var _NumValues = []Num{m_2, m_1, m0, m1, m2}

var _NumNameToValueMap = map[string]Num{
_NumName[0:3]: m_2,
_NumName[0:3]: m_2,
_NumName[3:6]: m_1,
_NumName[6:8]: m0,
_NumName[8:10]: m1,
_NumName[10:12]: m2,
}

var _NumLowerNameToValueMap = map[string]Num{
_NumLowerName[0:3]: m_2,
_NumName[3:6]: m_1,
_NumLowerName[3:6]: m_1,
_NumName[6:8]: m0,
_NumLowerName[6:8]: m0,
_NumName[8:10]: m1,
_NumLowerName[8:10]: m1,
_NumName[10:12]: m2,
_NumLowerName[10:12]: m2,
}

Expand All @@ -58,7 +61,7 @@ func NumString(s string) (Num, error) {
return val, nil
}

if val, ok := _NumNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _NumLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Num values", s)
Expand Down
11 changes: 7 additions & 4 deletions testdata/offset.golden
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,14 @@ func _NumberNoOp() {
var _NumberValues = []Number{One, Two, Three}

var _NumberNameToValueMap = map[string]Number{
_NumberName[0:3]: One,
_NumberName[0:3]: One,
_NumberName[3:6]: Two,
_NumberName[6:11]: Three,
}

var _NumberLowerNameToValueMap = map[string]Number{
_NumberLowerName[0:3]: One,
_NumberName[3:6]: Two,
_NumberLowerName[3:6]: Two,
_NumberName[6:11]: Three,
_NumberLowerName[6:11]: Three,
}

Expand All @@ -50,7 +53,7 @@ func NumberString(s string) (Number, error) {
return val, nil
}

if val, ok := _NumberNameToValueMap[strings.ToLower(s)]; ok {
if val, ok := _NumberLowerNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to Number values", s)
Expand Down
Loading
Loading