Resolve entered command routes to canonical paths

This commit is contained in:
2026-10-19 17:37:59 +00:00
parent 6ea8c4dd3f
commit 58b71c390f
8 changed files with 399 additions and 5 deletions

View File

@@ -132,3 +132,39 @@ func (resolver *Resolver) Resolve(path commandpath.Path) commandpath.Path {
current = next
}
}
// ResolveWithProvenance resolves a command path and carries the input token
// indexes that contributed to each output component. Rewritten target
// components inherit the origins of the matched source prefix.
func (resolver *Resolver) ResolveWithProvenance(path commandpath.Path) (commandpath.Path, [][]int) {
current := path.Clone()
origins := make([][]int, len(path))
for index := range path {
origins[index] = []int{index}
}
for {
next, mapping, matched := resolver.ResolveOnce(current)
if !matched {
return current, origins
}
matchedOrigins := make([]int, 0)
seen := make(map[int]struct{})
for _, componentOrigins := range origins[:len(mapping.Source)] {
for _, origin := range componentOrigins {
if _, exists := seen[origin]; exists {
continue
}
seen[origin] = struct{}{}
matchedOrigins = append(matchedOrigins, origin)
}
}
nextOrigins := make([][]int, 0, len(mapping.Target)+len(origins)-len(mapping.Source))
for range mapping.Target {
nextOrigins = append(nextOrigins, append([]int(nil), matchedOrigins...))
}
nextOrigins = append(nextOrigins, origins[len(mapping.Source):]...)
current = next
origins = nextOrigins
}
}