File tree Expand file tree Collapse file tree 2 files changed +49
-0
lines changed Expand file tree Collapse file tree 2 files changed +49
-0
lines changed Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ type Transformer interface {
4
+ Reset ()
5
+ }
6
+
7
+ type Encoder struct {
8
+ Transformer
9
+ }
10
+
11
+ type nop struct {}
12
+
13
+ func (nop ) Reset () { println ("Reset" ) }
14
+
15
+ func f (e Transformer ) {
16
+ e .Reset ()
17
+ }
18
+
19
+ func main () {
20
+ e := Encoder {Transformer : nop {}}
21
+ f (e )
22
+ }
23
+
24
+ // Output:
25
+ // Reset
Original file line number Diff line number Diff line change @@ -1950,10 +1950,12 @@ func getMethodByName(n *node) {
1950
1950
}
1951
1951
val = v
1952
1952
}
1953
+
1953
1954
if met := val .value .MethodByName (name ); met .IsValid () {
1954
1955
getFrame (f , l ).data [i ] = met
1955
1956
return next
1956
1957
}
1958
+
1957
1959
typ := val .node .typ
1958
1960
if typ .node == nil && typ .cat == valueT {
1959
1961
// happens with a var of empty interface type, that has value of concrete type
@@ -1963,10 +1965,32 @@ func getMethodByName(n *node) {
1963
1965
}
1964
1966
return next
1965
1967
}
1968
+
1966
1969
m , li := typ .lookupMethod (name )
1970
+
1971
+ // Try harder to find a matching embedded valueInterface.
1972
+ // TODO (marc): make sure it works for arbitrary depth and breadth.
1973
+ if m == nil && isStruct (val .node .typ ) {
1974
+ v := val .value
1975
+ for v .Type ().Kind () == reflect .Ptr {
1976
+ v = v .Elem ()
1977
+ }
1978
+ nf := v .NumField ()
1979
+ for i := 0 ; i < nf ; i ++ {
1980
+ var ok bool
1981
+ if val , ok = v .Field (i ).Interface ().(valueInterface ); ! ok {
1982
+ continue
1983
+ }
1984
+ if m , li = val .node .typ .lookupMethod (name ); m != nil {
1985
+ break
1986
+ }
1987
+ }
1988
+ }
1989
+
1967
1990
if m == nil {
1968
1991
panic (n .cfgErrorf ("method not found: %s" , name ))
1969
1992
}
1993
+
1970
1994
fr := f .clone (! fork )
1971
1995
nod := * m
1972
1996
nod .val = & nod
You can’t perform that action at this time.
0 commit comments