// Copyright 2012 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. // The package e is a go/doc test for embedded methods. package e // ---------------------------------------------------------------------------- // Conflicting methods M must not show up. type t1 struct{} // t1.M should not appear as method in a Tx type. func (t1) M() {} type t2 struct{} // t2.M should not appear as method in a Tx type. func (t2) M() {} // T1 has no embedded (level 1) M method due to conflict. type T1 struct { t1 t2 } // ---------------------------------------------------------------------------- // Higher-level method M wins over lower-level method M. // T2 has only M as top-level method. type T2 struct { t1 } // T2.M should appear as method of T2. func (T2) M() {} // ---------------------------------------------------------------------------- // Higher-level method M wins over lower-level conflicting methods M. type t1e struct { t1 } type t2e struct { t2 } // T3 has only M as top-level method. type T3 struct { t1e t2e } // T3.M should appear as method of T3. func (T3) M() {} // ---------------------------------------------------------------------------- // Don't show conflicting methods M embedded via an exported and non-exported // type. // T1 has no embedded (level 1) M method due to conflict. type T4 struct { t2 T2 } // ---------------------------------------------------------------------------- // Don't show embedded methods of exported anonymous fields unless AllMethods // is set. type T4 struct{} // T4.M should appear as method of T5 only if AllMethods is set. func (*T4) M() {} type T5 struct { T4 } // ---------------------------------------------------------------------------- // Recursive type declarations must not lead to endless recursion. type U1 struct { *U1 } // U1.M should appear as method of U1. func (*U1) M() {} type U2 struct { *U3 } // U2.M should appear as method of U2 and as method of U3 only if AllMethods is set. func (*U2) M() {} type U3 struct { *U2 } // U3.N should appear as method of U3 and as method of U2 only if AllMethods is set. func (*U3) N() {} type U4 struct { *u5 } // U4.M should appear as method of U4. func (*U4) M() {} type u5 struct { *U4 } // ---------------------------------------------------------------------------- // A higher-level embedded type (and its methods) wins over the same type (and // its methods) embedded at a lower level. type V1 struct { *V2 *V5 } type V2 struct { *V3 } type V3 struct { *V4 } type V4 struct { *V5 } type V5 struct { *V6 } type V6 struct{} // V4.M should appear as method of V2 and V3 if AllMethods is set. func (*V4) M() {} // V6.M should appear as method of V1 and V5 if AllMethods is set. func (*V6) M() {}