github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/go/types/selection.go (about) 1 // "go test -run=Generate -write=all" によって生成されたコードです。編集しないでください。 2 3 // Copyright 2013 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // このファイルは選択操作を実装しています。 8 9 package types 10 11 // SelectionKindは、セレクタ式x.fの種類を記述します 12 // (修飾識別子は除く)。 13 // 14 // xがstructまたは*structの場合、セレクタ式x.fは 15 // 一連の選択操作x.a.b.c.fを表す可能性があります。SelectionKindは 16 // 最終的な(明示的な)操作の種類を記述します。すべての 17 // 以前の(暗黙的な)操作は常にフィールド選択です。 18 // Indicesの各要素は、暗黙的なフィールド(a、b、c)を 19 // フィールド選択オペランドのstruct型のインデックスで指定します。 20 // 21 // FieldVal操作の場合、最終的な選択はSelection.Objで指定されたフィールドを参照します。 22 // 23 // MethodVal操作の場合、最終的な選択はメソッドを参照します。 24 // メソッドの宣言されたレシーバの"ポインタ性"が、暗黙のフィールド 25 // 選択後の実効レシーバと一致しない場合、&または*操作が暗黙的に 26 // レシーバ変数または値に適用されます。 27 // したがって、fがポインタレシーバを必要とするがx.a.b.cが非ポインタ変数である場合、 28 // x.fは(&x.a.b.c).fを表します。また、fが非ポインタレシーバを必要とするが 29 // x.a.b.cがポインタ値である場合、x.fは(*x.a.b.c).fを表します。 30 // 31 // 暗黙的または明示的なフィールド選択、または"ポインタ性"のために挿入された*操作による 32 // すべてのポインタ間接参照は、nilポインタに適用されるとパニックを引き起こします。 33 // したがって、メソッド呼び出しx.f()は、関数呼び出しの前にパニックを引き起こす可能性があります。 34 // 35 // 対照的に、MethodExpr操作T.fは基本的に以下の形式の関数リテラルと等価です: 36 // 37 // func(x T, args) (results) { return x.f(args) } 38 // 39 // その結果、"ポインタ性"のために挿入された任意の暗黙的なフィールド選択と*操作は、 40 // 関数が呼び出されるまで評価されません。したがって、T.fまたは(*T).fの式は決してパニックしません。 41 type SelectionKind int 42 43 const ( 44 FieldVal SelectionKind = iota 45 MethodVal 46 MethodExpr 47 ) 48 49 // Selection(セレクション)は、セレクタ式 x.f を表します。 50 // 次の宣言に対して: 51 // 52 // type T struct{ x int; E } 53 // type E struct{} 54 // func (e E) m() {} 55 // var p *T 56 // 57 // 以下の関係が存在します: 58 // 59 // Selector Kind Recv Obj Type Index Indirect 60 // 61 // p.x FieldVal T x int {0} true 62 // p.m MethodVal *T m func() {1, 0} true 63 // T.m MethodExpr T m func(T) {1, 0} false 64 type Selection struct { 65 kind SelectionKind 66 recv Type 67 obj Object 68 index []int 69 indirect bool 70 } 71 72 // Kindは選択の種類を返します。 73 func (s *Selection) Kind() SelectionKind 74 75 // Recvはx.fの型を返します。 76 func (s *Selection) Recv() Type 77 78 // Obj は x.f によって指定されたオブジェクトを返します。フィールドの選択には *Var を、それ以外の場合は *Func を返します。 79 func (s *Selection) Obj() Object 80 81 // Typeはx.fの型を返しますが、fの型とは異なる場合があります。 82 // 詳細はSelectionを参照してください。 83 func (s *Selection) Type() Type 84 85 // Index はxからfへのパスを記述します。 86 // 最後のindexエントリは、fを宣言している型のフィールドまたはメソッドのindexです。 87 // 以下のいずれかです: 88 // 89 // 1. 名前付き型の宣言されたメソッドのリスト 90 // 2. インターフェース型のメソッドのリスト 91 // 3. 構造体型のフィールドのリスト 92 // 93 // より早いindexエントリは、埋め込まれたフィールドのindexであり、 94 // xからfに移動するために(xの型から)暗黙的にトラバースされる埋め込みの深さ0から始まります。 95 func (s *Selection) Index() []int 96 97 // Indirectは、x.fでxからfへ移動するためにポインタ間接参照が必要だったかどうかを報告します。 98 // 99 // 注意:レシーバ引数とパラメータの両方が型*Tを持つMethodVal選択で、 100 // 間接参照がないにもかかわらず、Indirectが誤ってtrueを返す(Go issue #8353)ことがあります。 101 // 残念ながら、修正はリスクが高すぎます。 102 func (s *Selection) Indirect() bool 103 104 func (s *Selection) String() string 105 106 // SelectionStringはsの文字列形式を返します。 107 // Qualifierはパッケージレベルのオブジェクトの出力を制御し、nilである場合もあります。 108 // 109 // 例: 110 // 111 // "field (T) f int" 112 // "method (T) f(X) Y" 113 // "method expr (T) f(X) Y" 114 func SelectionString(s *Selection, qf Qualifier) string