Source File
selection.go
Belonging Package
go/types
// Code generated by "go test -run=Generate -write=all"; DO NOT EDIT.// Source: ../../cmd/compile/internal/types2/selection.go// Copyright 2013 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.// This file implements Selections.package typesimport ()// SelectionKind describes the kind of a selector expression x.f// (excluding qualified identifiers).//// If x is a struct or *struct, a selector expression x.f may denote a// sequence of selection operations x.a.b.c.f. The SelectionKind// describes the kind of the final (explicit) operation; all the// previous (implicit) operations are always field selections.// Each element of Indices specifies an implicit field (a, b, c)// by its index in the struct type of the field selection operand.//// For a FieldVal operation, the final selection refers to the field// specified by Selection.Obj.//// For a MethodVal operation, the final selection refers to a method.// If the "pointerness" of the method's declared receiver does not// match that of the effective receiver after implicit field// selection, then an & or * operation is implicitly applied to the// receiver variable or value.// So, x.f denotes (&x.a.b.c).f when f requires a pointer receiver but// x.a.b.c is a non-pointer variable; and it denotes (*x.a.b.c).f when// f requires a non-pointer receiver but x.a.b.c is a pointer value.//// All pointer indirections, whether due to implicit or explicit field// selections or * operations inserted for "pointerness", panic if// applied to a nil pointer, so a method call x.f() may panic even// before the function call.//// By contrast, a MethodExpr operation T.f is essentially equivalent// to a function literal of the form://// func(x T, args) (results) { return x.f(args) }//// Consequently, any implicit field selections and * operations// inserted for "pointerness" are not evaluated until the function is// called, so a T.f or (*T).f expression never panics.type SelectionKind intconst (FieldVal SelectionKind = iota // x.f is a struct field selectorMethodVal // x.f is a method selectorMethodExpr // x.f is a method expression)// A Selection describes a selector expression x.f.// For the declarations://// type T struct{ x int; E }// type E struct{}// func (e E) m() {}// var p *T//// the following relations exist://// Selector Kind Recv Obj Type Index Indirect//// p.x FieldVal T x int {0} true// p.m MethodVal *T m func() {1, 0} true// T.m MethodExpr T m func(T) {1, 0} falsetype Selection struct {kind SelectionKindrecv Type // type of xobj Object // object denoted by x.findex []int // path from x to x.findirect bool // set if there was any pointer indirection on the path}// Kind returns the selection kind.func ( *Selection) () SelectionKind { return .kind }// Recv returns the type of x in x.f.func ( *Selection) () Type { return .recv }// Obj returns the object denoted by x.f; a *Var for// a field selection, and a *Func in all other cases.func ( *Selection) () Object { return .obj }// Type returns the type of x.f, which may be different from the type of f.// See Selection for more information.func ( *Selection) () Type {switch .kind {case MethodVal:// The type of x.f is a method with its receiver type set// to the type of x.:= *.obj.(*Func).typ.(*Signature):= *.recv.typ = .recv.recv = &return &case MethodExpr:// The type of x.f is a function (without receiver)// and an additional first argument with the same type as x.// TODO(gri) Similar code is already in call.go - factor!// TODO(gri) Compute this eagerly to avoid allocations.:= *.obj.(*Func).typ.(*Signature):= *.recv.recv = nil.typ = .recvvar []*Varif .params != nil {= .params.vars}.params = NewTuple(append([]*Var{&}, ...)...)return &}// In all other cases, the type of x.f is the type of x.return .obj.Type()}// Index describes the path from x to f in x.f.// The last index entry is the field or method index of the type declaring f;// either://// 1. the list of declared methods of a named type; or// 2. the list of methods of an interface type; or// 3. the list of fields of a struct type.//// The earlier index entries are the indices of the embedded fields implicitly// traversed to get from (the type of) x to f, starting at embedding depth 0.func ( *Selection) () []int { return .index }// Indirect reports whether any pointer indirection was required to get from// x to f in x.f.//// Beware: Indirect spuriously returns true (Go issue #8353) for a// MethodVal selection in which the receiver argument and parameter// both have type *T so there is no indirection.// Unfortunately, a fix is too risky.func ( *Selection) () bool { return .indirect }func ( *Selection) () string { return SelectionString(, nil) }// SelectionString returns the string form of s.// The Qualifier controls the printing of// package-level objects, and may be nil.//// Examples://// "field (T) f int"// "method (T) f(X) Y"// "method expr (T) f(X) Y"func ( *Selection, Qualifier) string {var stringswitch .kind {case FieldVal:= "field "case MethodVal:= "method "case MethodExpr:= "method expr "default:panic("unreachable")}var bytes.Buffer.WriteString().WriteByte('(')WriteType(&, .Recv(), )fmt.Fprintf(&, ") %s", .obj.Name())if := .Type(); .kind == FieldVal {.WriteByte(' ')WriteType(&, , )} else {WriteSignature(&, .(*Signature), )}return .String()}
![]() |
The pages are generated with Golds v0.7.9-preview. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |