diff --git a/v1/server/failtracer/failtracer.go b/v1/server/failtracer/failtracer.go index 08a205dd60..47b4a604d8 100644 --- a/v1/server/failtracer/failtracer.go +++ b/v1/server/failtracer/failtracer.go @@ -85,6 +85,13 @@ func (b *failTracer) Hints(unknowns []ast.Ref) []Hint { continue } miss := string(tblPart) + if slices.Contains(candidates, miss) { + // The top-level segment is already a declared unknown, so the + // failure comes from something deeper in the ref that this + // fuzzy match can't see. Suggesting the ref itself as a "fix" + // would be a no-op, so skip it. + continue + } rs := ref[1:].String() if _, ok := seenRefs[rs]; ok { continue diff --git a/v1/server/failtracer/hints_test.go b/v1/server/failtracer/hints_test.go index b299c013d3..6f9ae7e803 100644 --- a/v1/server/failtracer/hints_test.go +++ b/v1/server/failtracer/hints_test.go @@ -84,6 +84,14 @@ func TestHints(t *testing.T) { {Message: "input.fruit.colour undefined, did you mean input.fruits.colour?"}, }, }, + { + note: "top-level ref already correct, no self-referential hint", + evts: []topdown.Event{ + evtFromExpr(`__local1__ = input.resource.heading`), + }, + unknowns: []string{"input.resource"}, + exp: nil, + }, { note: "same typo, multiple fail events", evts: []topdown.Event{