Merge pull request #17757 from caesarxuchao/go2idl-add-functions

Auto commit by PR queue bot
pull/6/head
k8s-merge-robot 2015-11-27 00:22:36 -08:00
commit 14bebe343c
2 changed files with 38 additions and 5 deletions

View File

@ -293,12 +293,15 @@ func (b *Builder) FindTypes() (types.Universe, error) {
for _, n := range s.Names() {
obj := s.Lookup(n)
tn, ok := obj.(*tc.TypeName)
if !ok {
continue
}
if ok {
t := b.walkType(u, nil, tn.Type())
t.CommentLines = b.priorCommentLines(obj.Pos())
}
tf, ok := obj.(*tc.Func)
if ok {
b.addFunc(u, nil, tf)
}
}
for p := range b.importGraph[pkgName] {
u.AddImports(pkgName, p)
}
@ -316,6 +319,12 @@ func (b *Builder) priorCommentLines(pos token.Pos) string {
return ""
}
func tcFuncNameToName(in string) types.Name {
name := strings.TrimLeft(in, "func ")
nameParts := strings.Split(name, "(")
return tcNameToName(nameParts[0])
}
func tcNameToName(in string) types.Name {
// Detect anonymous type names. (These may have '.' characters because
// embedded types may have packages, so we detect them specially.)
@ -495,3 +504,14 @@ func (b *Builder) walkType(u types.Universe, useName *types.Name, in tc.Type) *t
return out
}
}
func (b *Builder) addFunc(u types.Universe, useName *types.Name, in *tc.Func) *types.Type {
name := tcFuncNameToName(in.String())
if useName != nil {
name = *useName
}
out := u.Get(name)
out.Kind = types.Func
out.Signature = b.convertSignature(u, in.Type().(*tc.Signature))
return out
}

View File

@ -70,6 +70,9 @@ type Object struct {
common.Object
}
func AFunc(obj1 common.Object, obj2 Object) Frobber {
}
`,
"base/common/proto/common.go": `
package common
@ -88,11 +91,16 @@ package o
}
{{end}}
{{range $t := .}}{{if eq $t.Kind "Struct"}}{{template "Struct" $t}}{{end}}{{end}}`
{{define "Func"}}{{$s := .Signature}}func {{Raw .}}( {{range $s.Parameters}}{{Raw .}} {{end}}) {{range $s.Results}}{{Raw .}} {{end}}{}
{{end}}
{{range $t := .}}{{if eq $t.Kind "Struct"}}{{template "Struct" $t}}{{end}}{{end}}
{{range $t := .}}{{if eq $t.Kind "Func"}}{{template "Func" $t}}{{end}}{{end}}`
var expect = `
package o
type CommonObject interface {
ID() Int64
SetID(Int64)
@ -119,8 +127,12 @@ type FooObject interface {
CommonObject
}
func proto.AFunc( proto.Object proto.Object ) proto.Frobber {}
`
testNamer := namer.NewPublicNamer(1, "proto")
rawNamer := namer.NewRawNamer("o", nil)
_, u, o := construct(t, testFiles, testNamer)
t.Logf("\n%v\n\n", o)
tmpl := template.Must(
@ -128,6 +140,7 @@ type FooObject interface {
Funcs(
map[string]interface{}{
"Name": testNamer.Name,
"Raw": rawNamer.Name,
}).
Parse(tmplText),
)