Answer stability round 1: unexport the grammar's helpers the root never calls, and drop CheckName's note of its callers
This commit is contained in:
@@ -99,12 +99,12 @@ func ParseFormat(format string) ([]Token, error) {
|
||||
return nil
|
||||
}
|
||||
flush()
|
||||
if ref, name, binds := CutOutside(u.body, AsWord); binds && IndexOutside(u.body, '(') < 0 {
|
||||
if ref, name, binds := cutOutside(u.body, AsWord); binds && indexOutside(u.body, '(') < 0 {
|
||||
toks = append(toks, Token{Kind: NameBind, Body: u.body, BoundRef: ref, Bound: name})
|
||||
return nil
|
||||
}
|
||||
if IndexOutside(u.body, '(') < 0 {
|
||||
toks = append(toks, Token{Kind: NameRead, Body: u.body, Arms: SplitOutside(u.body, '|')})
|
||||
if indexOutside(u.body, '(') < 0 {
|
||||
toks = append(toks, Token{Kind: NameRead, Body: u.body, Arms: splitOutside(u.body, '|')})
|
||||
return nil
|
||||
}
|
||||
name, args, ok := FuncCall(u.body)
|
||||
@@ -124,16 +124,16 @@ func ParseFormat(format string) ([]Token, error) {
|
||||
// FuncCall splits a "{token}" body shaped name(args) into its parts; ok is false
|
||||
// for a name-read body. A '(' without a trailing ')' yields ok=false.
|
||||
func FuncCall(body string) (name string, args []string, ok bool) {
|
||||
lp := IndexOutside(body, '(')
|
||||
lp := indexOutside(body, '(')
|
||||
if lp < 0 || !strings.HasSuffix(body, ")") {
|
||||
return "", nil, false
|
||||
}
|
||||
return body[:lp], SplitArgs(body[lp+1 : len(body)-1]), true
|
||||
return body[:lp], splitArgs(body[lp+1 : len(body)-1]), true
|
||||
}
|
||||
|
||||
// SplitArgs parses a function arg list: comma-separated outside a selector or a
|
||||
// splitArgs parses a function arg list: comma-separated outside a selector or a
|
||||
// quoted layout, trimmed; empty -> none.
|
||||
func SplitArgs(s string) []string {
|
||||
func splitArgs(s string) []string {
|
||||
if strings.TrimSpace(s) == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -16,8 +16,6 @@ var reservedList = strings.Join(strings.Split(reservedInName, ""), " ")
|
||||
|
||||
// CheckName rejects a name the dot path, {token} and JSON grammars cannot spell, or a struct
|
||||
// tag cannot read.
|
||||
// Both a category or folder and a field go through it, so there is one answer to
|
||||
// what a name may contain.
|
||||
func CheckName(name string) error {
|
||||
if name == "" {
|
||||
return fmt.Errorf("%q is empty, which is not a path segment, so List never offers it", name)
|
||||
|
||||
@@ -82,8 +82,8 @@ func checkClose(path string, i, open int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// IndexOutside is the first c in s outside a [selector], or -1.
|
||||
func IndexOutside(s string, c byte) int {
|
||||
// indexOutside is the first c in s outside a [selector], or -1.
|
||||
func indexOutside(s string, c byte) int {
|
||||
depth := 0
|
||||
for i := 0; i < len(s); i++ {
|
||||
switch {
|
||||
@@ -98,8 +98,8 @@ func IndexOutside(s string, c byte) int {
|
||||
return -1
|
||||
}
|
||||
|
||||
// CutOutside cuts s around the first sep outside a [selector].
|
||||
func CutOutside(s, sep string) (before, after string, found bool) {
|
||||
// cutOutside cuts s around the first sep outside a [selector].
|
||||
func cutOutside(s, sep string) (before, after string, found bool) {
|
||||
depth := 0
|
||||
for i := 0; i < len(s); i++ {
|
||||
switch {
|
||||
@@ -114,10 +114,10 @@ func CutOutside(s, sep string) (before, after string, found bool) {
|
||||
return s, "", false
|
||||
}
|
||||
|
||||
func SplitOutside(s string, c byte) []string {
|
||||
func splitOutside(s string, c byte) []string {
|
||||
var parts []string
|
||||
for {
|
||||
i := IndexOutside(s, c)
|
||||
i := indexOutside(s, c)
|
||||
if i < 0 {
|
||||
return append(parts, s)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user