github.com/c-darwin/mobile@v0.0.0-20160313183840-ff625c46f7c9/bind/bind.go (about)

     1  // Copyright 2014 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package bind implements a code generator for gobind.
     6  //
     7  // See the documentation on the gobind command for usage details
     8  // and the list of currently supported types.
     9  // (http://godoc.org/github.com/c-darwin/mobile/cmd/gobind)
    10  package bind // import "github.com/c-darwin/mobile/bind"
    11  
    12  // TODO(crawshaw): slice support
    13  // TODO(crawshaw): channel support
    14  
    15  import (
    16  	"bytes"
    17  	"go/format"
    18  	"go/token"
    19  	"go/types"
    20  	"io"
    21  )
    22  
    23  // GenJava generates a Java API from a Go package.
    24  func GenJava(w io.Writer, fset *token.FileSet, pkg *types.Package) error {
    25  	buf := new(bytes.Buffer)
    26  	g := &javaGen{
    27  		printer: &printer{buf: buf, indentEach: []byte("    ")},
    28  		fset:    fset,
    29  		pkg:     pkg,
    30  	}
    31  	if err := g.gen(); err != nil {
    32  		return err
    33  	}
    34  	_, err := io.Copy(w, buf)
    35  	return err
    36  }
    37  
    38  // GenGo generates a Go stub to support foreign language APIs.
    39  func GenGo(w io.Writer, fset *token.FileSet, pkg *types.Package) error {
    40  	buf := new(bytes.Buffer)
    41  	g := &goGen{
    42  		printer: &printer{buf: buf, indentEach: []byte("\t")},
    43  		fset:    fset,
    44  		pkg:     pkg,
    45  	}
    46  	if err := g.gen(); err != nil {
    47  		return err
    48  	}
    49  	src := buf.Bytes()
    50  	srcf, err := format.Source(src)
    51  	if err != nil {
    52  		w.Write(src) // for debugging
    53  		return err
    54  	}
    55  	_, err = w.Write(srcf)
    56  	return err
    57  }
    58  
    59  // GenObjc generates the Objective-C API from a Go package.
    60  func GenObjc(w io.Writer, fset *token.FileSet, pkg *types.Package, isHeader bool) error {
    61  	buf := new(bytes.Buffer)
    62  	g := &objcGen{
    63  		printer: &printer{buf: buf, indentEach: []byte("\t")},
    64  		fset:    fset,
    65  		pkg:     pkg,
    66  	}
    67  	var err error
    68  	if isHeader {
    69  		err = g.genH()
    70  	} else {
    71  		err = g.genM()
    72  	}
    73  	if err != nil {
    74  		return err
    75  	}
    76  	_, err = io.Copy(w, buf)
    77  	return err
    78  }