@@ -58,7 +58,7 @@ func toSingular(s string) string { return inflection.Singular(s) }
5858// For example: Id -> ID, Api -> API, Sql -> SQL, Url -> URL.
5959func FixAcronyms (content []byte ) []byte {
6060 // Common Go acronyms that should be all caps, with their correct form.
61- acronymReplacements := []struct {
61+ acronyms := []struct {
6262 pattern string
6363 replacement string
6464 }{
@@ -73,7 +73,6 @@ func FixAcronyms(content []byte) []byte {
7373 {"Ip" , "IP" },
7474 {"Json" , "JSON" },
7575 {"Jwt" , "JWT" },
76- {"S3" , "S3" }, // already correct, included for completeness
7776 {"Sql" , "SQL" },
7877 {"Ssh" , "SSH" },
7978 {"Tcp" , "TCP" },
@@ -85,26 +84,22 @@ func FixAcronyms(content []byte) []byte {
8584
8685 result := string (content )
8786
88- for _ , r := range acronymReplacements {
89- // Only process if the pattern differs from replacement (skip already-correct cases)
90- if r .pattern == r .replacement {
91- continue
92- }
93-
94- // Use three patterns to handle acronym in different positions:
95- // 1. `([a-z])(Acronym)([A-Z])` - acronym in middle of camelCase, e.g., "JsonM" in "userJsonM"
96- // 2. `([a-z])(Acronym)$` - acronym at end of identifier, e.g., "Id" in "userId"
97- // 3. `([a-z])(Acronym)([^A-Za-z])` - acronym followed by non-letter (space, punctuation, etc.)
98- regexMid := regexp .MustCompile (`([a-z])(` + r .pattern + `)([A-Z])` )
99- regexEnd := regexp .MustCompile (`([a-z])(` + r .pattern + `)$` )
100- regexNonLetter := regexp .MustCompile (`([a-z])(` + r .pattern + `)([^A-Za-z])` )
101-
102- // For middle case: preserve the following uppercase letter via ${3}
103- result = regexMid .ReplaceAllString (result , "${1}" + r .replacement + "${3}" )
104- // For non-letter case: preserve the following character via ${3}
105- result = regexNonLetter .ReplaceAllString (result , "${1}" + r .replacement + "${3}" )
106- // For end case: no ${3} since there's no following letter
107- result = regexEnd .ReplaceAllString (result , "${1}" + r .replacement )
87+ for _ , a := range acronyms {
88+ // Pre-compile regexes once per acronym (not inside inner loop).
89+ // Use three patterns to handle acronyms in different positions:
90+ // 1. Mid: `([a-z])(Acronym)([A-Z])` - acronym in middle of camelCase.
91+ // 2. End: `([a-z])(Acronym)$` - acronym at end of identifier.
92+ // 3. NonLetter: `([a-z])(Acronym)([^A-Za-z])` - acronym followed by non-letter.
93+ regexMid := regexp .MustCompile (`([a-z])(` + a .pattern + `)([A-Z])` )
94+ regexEnd := regexp .MustCompile (`([a-z])(` + a .pattern + `)$` )
95+ regexNonLetter := regexp .MustCompile (`([a-z])(` + a .pattern + `)([^A-Za-z])` )
96+
97+ // For middle case: preserve the following uppercase letter via ${3}.
98+ result = regexMid .ReplaceAllString (result , "${1}" + a .replacement + "${3}" )
99+ // For non-letter case: preserve the following character via ${3}.
100+ result = regexNonLetter .ReplaceAllString (result , "${1}" + a .replacement + "${3}" )
101+ // For end case: no ${3} since there's no following letter.
102+ result = regexEnd .ReplaceAllString (result , "${1}" + a .replacement )
108103 }
109104
110105 return []byte (result )
0 commit comments