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