1
0
mirror of https://github.com/golang/go synced 2024-11-23 18:10:04 -07:00

cmd/doc: don't log on constraint type elements

Fixes #50256

Change-Id: I2327a0b28f8173c801ed2946bec8083967667027
Reviewed-on: https://go-review.googlesource.com/c/go/+/373314
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Ian Lance Taylor 2021-12-18 15:54:38 -08:00
parent 9901d9e87a
commit 6713b5dbbc
3 changed files with 32 additions and 1 deletions

View File

@ -7,6 +7,7 @@ package main
import (
"bytes"
"flag"
"log"
"os"
"path/filepath"
"regexp"
@ -125,6 +126,9 @@ var tests = []test{
`func MultiLineFunc\(x interface{ ... }\) \(r struct{ ... }\)`, // Multi line function.
`var LongLine = newLongLine\(("someArgument[1-4]", ){4}...\)`, // Long list of arguments.
`type T1 = T2`, // Type alias
`type SimpleConstraint interface{ ... }`,
`type TildeConstraint interface{ ... }`,
`type StructConstraint interface{ ... }`,
},
[]string{
`const internalConstant = 2`, // No internal constants.
@ -199,6 +203,9 @@ var tests = []test{
`Comment about exported method`,
`type T1 = T2`,
`type T2 int`,
`type SimpleConstraint interface {`,
`type TildeConstraint interface {`,
`type StructConstraint interface {`,
},
[]string{
`constThree`,
@ -822,13 +829,19 @@ var tests = []test{
func TestDoc(t *testing.T) {
maybeSkip(t)
defer log.SetOutput(log.Writer())
for _, test := range tests {
var b bytes.Buffer
var flagSet flag.FlagSet
var logbuf bytes.Buffer
log.SetOutput(&logbuf)
err := do(&b, &flagSet, test.args)
if err != nil {
t.Fatalf("%s %v: %s\n", test.name, test.args, err)
}
if logbuf.Len() > 0 {
t.Errorf("%s %v: unexpected log messages:\n%s", test.name, test.args, logbuf.Bytes())
}
output := b.Bytes()
failed := false
for j, yes := range test.yes {

View File

@ -865,6 +865,7 @@ func trimUnexportedFields(fields *ast.FieldList, isInterface bool) *ast.FieldLis
if len(names) == 0 {
// Embedded type. Use the name of the type. It must be of the form ident or
// pkg.ident (for structs and interfaces), or *ident or *pkg.ident (structs only).
// Or a type embedded in a constraint.
// Nothing else is allowed.
ty := field.Type
if se, ok := field.Type.(*ast.StarExpr); !isInterface && ok {
@ -872,6 +873,7 @@ func trimUnexportedFields(fields *ast.FieldList, isInterface bool) *ast.FieldLis
// embedded types in structs.
ty = se.X
}
constraint := false
switch ident := ty.(type) {
case *ast.Ident:
if isInterface && ident.Name == "error" && ident.Obj == nil {
@ -885,8 +887,12 @@ func trimUnexportedFields(fields *ast.FieldList, isInterface bool) *ast.FieldLis
case *ast.SelectorExpr:
// An embedded type may refer to a type in another package.
names = []*ast.Ident{ident.Sel}
default:
// An approximation or union or type
// literal in an interface.
constraint = true
}
if names == nil {
if names == nil && !constraint {
// Can only happen if AST is incorrect. Safe to continue with a nil list.
log.Print("invalid program: unexpected type for embedded field")
}

View File

@ -238,3 +238,15 @@ type ExportedFormattedType struct {
// Text after pre-formatted block.
ExportedField int
}
type SimpleConstraint interface {
~int | ~float64
}
type TildeConstraint interface {
~int
}
type StructConstraint interface {
struct { F int }
}