From b662dce74c950be8022ae026cb00000571856f85 Mon Sep 17 00:00:00 2001 From: Cody Schroeder Date: Fri, 15 Sep 2023 10:42:25 -0400 Subject: [PATCH] fix(go_indexer): mark variadics in all contexts (#5845) --- kythe/go/indexer/emit.go | 33 +++++++++++++--------- kythe/go/indexer/testdata/code/rendered.go | 5 ++++ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/kythe/go/indexer/emit.go b/kythe/go/indexer/emit.go index 2d2e84596f..ebc2d2be78 100644 --- a/kythe/go/indexer/emit.go +++ b/kythe/go/indexer/emit.go @@ -153,13 +153,14 @@ func (pi *PackageInfo) Emit(ctx context.Context, sink Sink, opts *EmitOptions) e opts = &EmitOptions{} } e := &emitter{ - ctx: ctx, - pi: pi, - sink: sink, - opts: opts, - impl: make(map[impl]struct{}), - anchored: make(map[ast.Node]struct{}), - fmeta: make(map[*ast.File]bool), + ctx: ctx, + pi: pi, + sink: sink, + opts: opts, + impl: make(map[impl]struct{}), + anchored: make(map[ast.Node]struct{}), + fmeta: make(map[*ast.File]bool), + variadics: make(map[*types.Slice]bool), } // Emit a node to represent the package as a whole. @@ -239,6 +240,8 @@ type emitter struct { anchored map[ast.Node]struct{} // see writeAnchor firstErr error cmap ast.CommentMap // current file's CommentMap + + variadics map[*types.Slice]bool } type refKind int @@ -474,7 +477,11 @@ func (e *emitter) emitType(typ types.Type) *spb.VName { case *types.Array: v = e.emitTApp(arrayTAppMS(typ.Len()), nodes.TBuiltin, govname.ArrayConstructorType(typ.Len()), e.emitType(typ.Elem())) case *types.Slice: - v = e.emitTApp(sliceTAppMS, nodes.TBuiltin, govname.SliceConstructorType(), e.emitType(typ.Elem())) + if e.variadics[typ] { + v = e.emitTApp(variadicTAppMS, nodes.TBuiltin, govname.VariadicConstructorType(), e.emitType(typ.Elem())) + } else { + v = e.emitTApp(sliceTAppMS, nodes.TBuiltin, govname.SliceConstructorType(), e.emitType(typ.Elem())) + } case *types.Pointer: v = e.emitTApp(pointerTAppMS, nodes.TBuiltin, govname.PointerConstructorType(), e.emitType(typ.Elem())) case *types.Chan: @@ -495,14 +502,14 @@ func (e *emitter) emitType(typ types.Type) *spb.VName { }}, } - params := e.visitTuple(typ.Params()) - if typ.Variadic() && len(params) > 0 { - // Convert last parameter type from slice type to variadic type. - last := len(params) - 1 + if typ.Variadic() { + // Mark last parameter type as variadic. + last := typ.Params().Len() - 1 if slice, ok := typ.Params().At(last).Type().(*types.Slice); ok { - params[last] = e.emitTApp(variadicTAppMS, nodes.TBuiltin, govname.VariadicConstructorType(), e.emitType(slice.Elem())) + e.variadics[slice] = true } } + params := e.visitTuple(typ.Params()) var ret *spb.VName if typ.Results().Len() == 1 { diff --git a/kythe/go/indexer/testdata/code/rendered.go b/kythe/go/indexer/testdata/code/rendered.go index acb60994ba..7a06d35096 100644 --- a/kythe/go/indexer/testdata/code/rendered.go +++ b/kythe/go/indexer/testdata/code/rendered.go @@ -59,3 +59,8 @@ func G[T comparable](t T) *Set[T] { return nil } // - StrF.code/rendered/callsite_signature "Str[T](t)" // - StrF.code/rendered/signature "func Str[T Stringer](t T) string" func Str[T fmt.Stringer](t T) string { return t.String() } + +// - @VA defines/binding VA +// - VA.code/rendered/callsite_signature "VA(args)" +// - VA.code/rendered/signature "func VA(args ...any)" +func VA(args ...any) {}