From f3c56bcb60390d59d2ba6daf1229d2425ae89d52 Mon Sep 17 00:00:00 2001 From: Cody Schroeder Date: Tue, 12 Sep 2023 15:08:43 -0400 Subject: [PATCH] feat(go_indexer): add anchor scope to func literals (#5840) --- kythe/go/indexer/emit.go | 9 ++++++--- kythe/go/indexer/testdata/basic/scopes.go | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/kythe/go/indexer/emit.go b/kythe/go/indexer/emit.go index 3c4fd2c708..2d2e84596f 100644 --- a/kythe/go/indexer/emit.go +++ b/kythe/go/indexer/emit.go @@ -596,7 +596,10 @@ func (e *emitter) visitFuncLit(flit *ast.FuncLit, stack stackFunc) { info.vname.Language = govname.Language info.vname.Signature += "$" + strconv.Itoa(fi.numAnons) e.pi.function[flit] = info - e.writeDef(flit, info.vname) + def := e.writeDef(flit, info.vname) + if e.opts.emitAnchorScopes() { + e.writeEdge(def, fi.vname, edges.ChildOf) + } e.writeFact(info.vname, facts.NodeKind, nodes.Function) if sig, ok := e.pi.Info.Types[flit].Type.(*types.Signature); ok { @@ -1247,8 +1250,8 @@ func (e *emitter) writeBinding(id *ast.Ident, kind string, parent *spb.VName) *s // writeDef emits a spanning anchor and defines edge for the specified node. // This function does not create the target node. -func (e *emitter) writeDef(node ast.Node, target *spb.VName) { - e.writeRef(node, target, edges.Defines) +func (e *emitter) writeDef(node ast.Node, target *spb.VName) *spb.VName { + return e.writeRef(node, target, edges.Defines) } // writeDoc adds associations between comment groups and a documented node. diff --git a/kythe/go/indexer/testdata/basic/scopes.go b/kythe/go/indexer/testdata/basic/scopes.go index 099f7d0703..084d21435f 100644 --- a/kythe/go/indexer/testdata/basic/scopes.go +++ b/kythe/go/indexer/testdata/basic/scopes.go @@ -8,4 +8,8 @@ func F() { //- IdentRef=@Ident ref/writes Ident //- IdentRef childof F Ident = true + + //- AnonDef=@"func() {}" defines _Anon + //- AnonDef childof F + _ = func() {} }