d2c9089812
This JSON-flavored ContextString implementation returns a chain of property names using JavaScript-style attribute access syntax.
42 lines
864 B
Go
42 lines
864 B
Go
package json
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
type navigation struct {
|
|
root *objectVal
|
|
}
|
|
|
|
// Implementation of zcled.ContextString
|
|
func (n navigation) ContextString(offset int) string {
|
|
steps := navigationStepsRev(n.root, offset)
|
|
if steps == nil {
|
|
return ""
|
|
}
|
|
|
|
// We built our slice backwards, so we'll reverse it in-place now.
|
|
half := len(steps) / 2 // integer division
|
|
for i := 0; i < half; i++ {
|
|
steps[i], steps[len(steps)-1-i] = steps[len(steps)-1-i], steps[i]
|
|
}
|
|
|
|
return strings.Join(steps, ".")
|
|
}
|
|
|
|
func navigationStepsRev(obj *objectVal, offset int) []string {
|
|
// Do any of our properties have an object that contains the target
|
|
// offset?
|
|
for k, attr := range obj.Attrs {
|
|
ov, ok := attr.Value.(*objectVal)
|
|
if !ok {
|
|
continue
|
|
}
|
|
|
|
if ov.SrcRange.ContainsOffset(offset) {
|
|
return append(navigationStepsRev(ov, offset), k)
|
|
}
|
|
}
|
|
return nil
|
|
}
|