mirror of https://github.com/golang/go.git
all: merge master into release-branch.go1.7
Change-Id: I177856ea2bc9943cbde28ca9afa145b6ea5b0942
This commit is contained in:
commit
ae68090d00
|
|
@ -61,6 +61,7 @@ var tests = []test{
|
|||
`var ExportedVariable = 1`, // Simple variable.
|
||||
`var VarOne = 1`, // First entry in variable block.
|
||||
`func ExportedFunc\(a int\) bool`, // Function.
|
||||
`func ReturnUnexported\(\) unexportedType`, // Function with unexported return type.
|
||||
`type ExportedType struct { ... }`, // Exported type.
|
||||
`const ExportedTypedConstant ExportedType = iota`, // Typed constant.
|
||||
`const ExportedTypedConstant_unexported unexportedType`, // Typed constant, exported for unexported type.
|
||||
|
|
@ -89,9 +90,10 @@ var tests = []test{
|
|||
"full package with u",
|
||||
[]string{`-u`, p},
|
||||
[]string{
|
||||
`const ExportedConstant = 1`, // Simple constant.
|
||||
`const internalConstant = 2`, // Internal constants.
|
||||
`func internalFunc\(a int\) bool`, // Internal functions.
|
||||
`const ExportedConstant = 1`, // Simple constant.
|
||||
`const internalConstant = 2`, // Internal constants.
|
||||
`func internalFunc\(a int\) bool`, // Internal functions.
|
||||
`func ReturnUnexported\(\) unexportedType`, // Function with unexported return type.
|
||||
},
|
||||
[]string{
|
||||
`Comment about exported constant`, // No comment for simple constant.
|
||||
|
|
@ -221,6 +223,7 @@ var tests = []test{
|
|||
`func \(ExportedType\) ExportedMethod\(a int\) bool`,
|
||||
`const ExportedTypedConstant ExportedType = iota`, // Must include associated constant.
|
||||
`func ExportedTypeConstructor\(\) \*ExportedType`, // Must include constructor.
|
||||
`io.Reader.*Comment on line with embedded Reader.`,
|
||||
},
|
||||
[]string{
|
||||
`unexportedField`, // No unexported field.
|
||||
|
|
@ -228,6 +231,7 @@ var tests = []test{
|
|||
`Comment about exported method.`, // No comment about exported method.
|
||||
`unexportedMethod`, // No unexported method.
|
||||
`unexportedTypedConstant`, // No unexported constant.
|
||||
`error`, // No embedded error.
|
||||
},
|
||||
},
|
||||
// Type -u with unexported fields.
|
||||
|
|
@ -243,6 +247,8 @@ var tests = []test{
|
|||
`\*ExportedEmbeddedType.*Comment on line with exported embedded \*field.`,
|
||||
`unexportedType.*Comment on line with unexported embedded field.`,
|
||||
`\*unexportedType.*Comment on line with unexported embedded \*field.`,
|
||||
`io.Reader.*Comment on line with embedded Reader.`,
|
||||
`error.*Comment on line with embedded error.`,
|
||||
`func \(ExportedType\) unexportedMethod\(a int\) bool`,
|
||||
`unexportedTypedConstant`,
|
||||
},
|
||||
|
|
@ -274,6 +280,8 @@ var tests = []test{
|
|||
`type ExportedInterface interface`, // Interface definition.
|
||||
`Comment before exported method.*\n.*ExportedMethod\(\)` +
|
||||
`.*Comment on line with exported method`,
|
||||
`io.Reader.*Comment on line with embedded Reader.`,
|
||||
`error.*Comment on line with embedded error.`,
|
||||
`Has unexported methods`,
|
||||
},
|
||||
[]string{
|
||||
|
|
@ -293,6 +301,8 @@ var tests = []test{
|
|||
`Comment before exported method.*\n.*ExportedMethod\(\)` +
|
||||
`.*Comment on line with exported method`,
|
||||
`unexportedMethod\(\).*Comment on line with unexported method.`,
|
||||
`io.Reader.*Comment on line with embedded Reader.`,
|
||||
`error.*Comment on line with embedded error.`,
|
||||
},
|
||||
[]string{
|
||||
`Has unexported methods`,
|
||||
|
|
|
|||
|
|
@ -317,7 +317,9 @@ func (pkg *Package) funcSummary(funcs []*doc.Func, showConstructors bool) {
|
|||
isConstructor = make(map[*doc.Func]bool)
|
||||
for _, typ := range pkg.doc.Types {
|
||||
for _, constructor := range typ.Funcs {
|
||||
isConstructor[constructor] = true
|
||||
if isExported(typ.Name) {
|
||||
isConstructor[constructor] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -494,14 +496,19 @@ func trimUnexportedElems(spec *ast.TypeSpec) {
|
|||
}
|
||||
switch typ := spec.Type.(type) {
|
||||
case *ast.StructType:
|
||||
typ.Fields = trimUnexportedFields(typ.Fields, "fields")
|
||||
typ.Fields = trimUnexportedFields(typ.Fields, false)
|
||||
case *ast.InterfaceType:
|
||||
typ.Methods = trimUnexportedFields(typ.Methods, "methods")
|
||||
typ.Methods = trimUnexportedFields(typ.Methods, true)
|
||||
}
|
||||
}
|
||||
|
||||
// trimUnexportedFields returns the field list trimmed of unexported fields.
|
||||
func trimUnexportedFields(fields *ast.FieldList, what string) *ast.FieldList {
|
||||
func trimUnexportedFields(fields *ast.FieldList, isInterface bool) *ast.FieldList {
|
||||
what := "methods"
|
||||
if !isInterface {
|
||||
what = "fields"
|
||||
}
|
||||
|
||||
trimmed := false
|
||||
list := make([]*ast.Field, 0, len(fields.List))
|
||||
for _, field := range fields.List {
|
||||
|
|
@ -511,12 +518,23 @@ func trimUnexportedFields(fields *ast.FieldList, what string) *ast.FieldList {
|
|||
// Nothing else is allowed.
|
||||
switch ident := field.Type.(type) {
|
||||
case *ast.Ident:
|
||||
if isInterface && ident.Name == "error" && ident.Obj == nil {
|
||||
// For documentation purposes, we consider the builtin error
|
||||
// type special when embedded in an interface, such that it
|
||||
// always gets shown publicly.
|
||||
list = append(list, field)
|
||||
continue
|
||||
}
|
||||
names = []*ast.Ident{ident}
|
||||
case *ast.StarExpr:
|
||||
// Must have the form *identifier.
|
||||
if ident, ok := ident.X.(*ast.Ident); ok {
|
||||
// This is only valid on embedded types in structs.
|
||||
if ident, ok := ident.X.(*ast.Ident); ok && !isInterface {
|
||||
names = []*ast.Ident{ident}
|
||||
}
|
||||
case *ast.SelectorExpr:
|
||||
// An embedded type may refer to a type in another package.
|
||||
names = []*ast.Ident{ident.Sel}
|
||||
}
|
||||
if names == nil {
|
||||
// Can only happen if AST is incorrect. Safe to continue with a nil list.
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ type ExportedType struct {
|
|||
*ExportedEmbeddedType // Comment on line with exported embedded *field.
|
||||
unexportedType // Comment on line with unexported embedded field.
|
||||
*unexportedType // Comment on line with unexported embedded *field.
|
||||
io.Reader // Comment on line with embedded Reader.
|
||||
error // Comment on line with embedded error.
|
||||
}
|
||||
|
||||
// Comment about exported method.
|
||||
|
|
@ -96,6 +98,8 @@ type ExportedInterface interface {
|
|||
// Comment before exported method.
|
||||
ExportedMethod() // Comment on line with exported method.
|
||||
unexportedMethod() // Comment on line with unexported method.
|
||||
io.Reader // Comment on line with embedded Reader.
|
||||
error // Comment on line with embedded error.
|
||||
}
|
||||
|
||||
// Comment about unexported type.
|
||||
|
|
@ -119,3 +123,6 @@ const unexportedTypedConstant unexportedType = 1 // In a separate section to tes
|
|||
// For case matching.
|
||||
const CaseMatch = 1
|
||||
const Casematch = 2
|
||||
|
||||
func ReturnUnexported() unexportedType { return 0 }
|
||||
func ReturnExported() ExportedType { return ExportedType{} }
|
||||
|
|
|
|||
|
|
@ -196,15 +196,16 @@ timeloop:
|
|||
|
||||
systime:
|
||||
// Fall back to system call (usually first call in this thread)
|
||||
LEAL 12(SP), AX // must be non-nil, unused
|
||||
LEAL 16(SP), AX // must be non-nil, unused
|
||||
MOVL AX, 4(SP)
|
||||
MOVL $0, 8(SP) // time zone pointer
|
||||
MOVL $0, 12(SP) // required as of Sierra; Issue 16570
|
||||
MOVL $116, AX
|
||||
INT $0x80
|
||||
CMPL AX, $0
|
||||
JNE inreg
|
||||
MOVL 12(SP), AX
|
||||
MOVL 16(SP), DX
|
||||
MOVL 16(SP), AX
|
||||
MOVL 20(SP), DX
|
||||
inreg:
|
||||
// sec is in AX, usec in DX
|
||||
// convert to DX:AX nsec
|
||||
|
|
|
|||
|
|
@ -157,6 +157,7 @@ systime:
|
|||
// Fall back to system call (usually first call in this thread).
|
||||
MOVQ SP, DI
|
||||
MOVQ $0, SI
|
||||
MOVQ $0, DX // required as of Sierra; Issue 16570
|
||||
MOVL $(0x2000000+116), AX
|
||||
SYSCALL
|
||||
CMPQ AX, $0
|
||||
|
|
|
|||
Loading…
Reference in New Issue