func simpleCompound(pn *parse.Primary) (*parse.Compound, string) { thisIndexing, ok := pn.Parent().(*parse.Indexing) if !ok { return nil, "" } thisCompound, ok := thisIndexing.Parent().(*parse.Compound) if !ok { return nil, "" } head := "" for _, in := range thisCompound.Indexings { if len(in.Indicies) > 0 { return nil, "" } typ := in.Head.Type if typ != parse.Bareword && typ != parse.SingleQuoted && typ != parse.DoubleQuoted { return nil, "" } head += in.Head.Value if in == thisIndexing { break } } return thisCompound, head }
func primaryInSimpleCompound(pn *parse.Primary) (*parse.Compound, string) { thisIndexing, ok := pn.Parent().(*parse.Indexing) if !ok { return nil, "" } thisCompound, ok := thisIndexing.Parent().(*parse.Compound) if !ok { return nil, "" } ok, head, _ := simpleCompound(thisCompound, thisIndexing) if !ok { return nil, "" } return thisCompound, head }
func simpleCompound(pn *parse.Primary) (*parse.Compound, string) { thisIndexing, ok := pn.Parent().(*parse.Indexing) if !ok { return nil, "" } thisCompound, ok := thisIndexing.Parent().(*parse.Compound) if !ok { return nil, "" } tilde := false head := "" for _, in := range thisCompound.Indexings { if len(in.Indicies) > 0 { return nil, "" } switch in.Head.Type { case parse.Tilde: tilde = true case parse.Bareword, parse.SingleQuoted, parse.DoubleQuoted: head += in.Head.Value } if in == thisIndexing { break } } if tilde { i := strings.Index(head, "/") if i == -1 { return nil, "" } uname := head[:i] home, err := osutil.GetHome(uname) if err != nil { // TODO report error return nil, "" } head = home + head[i:] } return thisCompound, head }