| // Copyright 2014 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. |
| |
| // Package bind implements a code generator for gobind. |
| // |
| // See the documentation on the gobind command for usage details |
| // and the list of currently supported types. |
| // (http://godoc.org/golang.org/x/mobile/cmd/gobind) |
| package bind // import "golang.org/x/mobile/bind" |
| |
| // TODO(crawshaw): slice support |
| // TODO(crawshaw): channel support |
| |
| import ( |
| "bytes" |
| "go/format" |
| "go/token" |
| "go/types" |
| "io" |
| ) |
| |
| type ( |
| GeneratorConfig struct { |
| Writer io.Writer |
| Fset *token.FileSet |
| Pkg *types.Package |
| AllPkg []*types.Package |
| } |
| |
| fileType int |
| ) |
| |
| const ( |
| Java fileType = iota |
| JavaC |
| JavaH |
| |
| ObjcM |
| ObjcH |
| ObjcGoH |
| ) |
| |
| // GenJava generates a Java API from a Go package. |
| func GenJava(conf *GeneratorConfig, javaPkg string, ft fileType) error { |
| buf := new(bytes.Buffer) |
| g := &javaGen{ |
| javaPkg: javaPkg, |
| generator: &generator{ |
| printer: &printer{buf: buf, indentEach: []byte(" ")}, |
| fset: conf.Fset, |
| allPkg: conf.AllPkg, |
| pkg: conf.Pkg, |
| }, |
| } |
| g.init() |
| var err error |
| switch ft { |
| case Java: |
| err = g.genJava() |
| case JavaC: |
| err = g.genC() |
| case JavaH: |
| err = g.genH() |
| default: |
| panic("invalid fileType") |
| } |
| if err != nil { |
| return err |
| } |
| _, err = io.Copy(conf.Writer, buf) |
| return err |
| } |
| |
| // GenGo generates a Go stub to support foreign language APIs. |
| func GenGo(conf *GeneratorConfig) error { |
| buf := new(bytes.Buffer) |
| g := &goGen{ |
| generator: &generator{ |
| printer: &printer{buf: buf, indentEach: []byte("\t")}, |
| fset: conf.Fset, |
| allPkg: conf.AllPkg, |
| pkg: conf.Pkg, |
| }, |
| } |
| g.init() |
| if err := g.gen(); err != nil { |
| return err |
| } |
| src := buf.Bytes() |
| srcf, err := format.Source(src) |
| if err != nil { |
| conf.Writer.Write(src) // for debugging |
| return err |
| } |
| _, err = conf.Writer.Write(srcf) |
| return err |
| } |
| |
| // GenObjc generates the Objective-C API from a Go package. |
| func GenObjc(conf *GeneratorConfig, prefix string, ft fileType) error { |
| buf := new(bytes.Buffer) |
| g := &objcGen{ |
| generator: &generator{ |
| printer: &printer{buf: buf, indentEach: []byte("\t")}, |
| fset: conf.Fset, |
| allPkg: conf.AllPkg, |
| pkg: conf.Pkg, |
| }, |
| prefix: prefix, |
| } |
| g.init() |
| var err error |
| switch ft { |
| case ObjcH: |
| err = g.genH() |
| case ObjcM: |
| err = g.genM() |
| case ObjcGoH: |
| err = g.genGoH() |
| default: |
| panic("invalid fileType") |
| } |
| if err != nil { |
| return err |
| } |
| _, err = io.Copy(conf.Writer, buf) |
| return err |
| } |