cmd/gobind: add experimental, objective-C code generation option.
Change-Id: Ia0e66ee0964bd40d868261994f7cb70260f3cbe9 Reviewed-on: https://go-review.googlesource.com/10841 Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
8f4eb9eb49
commit
26f6ffe0b5
@ -5,7 +5,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -48,21 +47,35 @@ func genPkg(pkg *build.Package) {
|
|||||||
}
|
}
|
||||||
p := program.Created[0].Pkg
|
p := program.Created[0].Pkg
|
||||||
|
|
||||||
w, closer, err := writer(*lang, p)
|
fname := defaultFileName(*lang, p)
|
||||||
if err != nil {
|
|
||||||
errorf("%v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch *lang {
|
switch *lang {
|
||||||
case "java":
|
case "java":
|
||||||
err = bind.GenJava(w, fset, p)
|
w, closer := writer(fname, p)
|
||||||
|
processErr(bind.GenJava(w, fset, p))
|
||||||
|
closer()
|
||||||
case "go":
|
case "go":
|
||||||
err = bind.GenGo(w, fset, p)
|
w, closer := writer(fname, p)
|
||||||
|
processErr(bind.GenGo(w, fset, p))
|
||||||
|
closer()
|
||||||
|
case "objc":
|
||||||
|
if fname == "" {
|
||||||
|
processErr(bind.GenObjc(os.Stdout, fset, p, true))
|
||||||
|
processErr(bind.GenObjc(os.Stdout, fset, p, false))
|
||||||
|
} else {
|
||||||
|
hname := fname[:len(fname)-2] + ".h"
|
||||||
|
w, closer := writer(hname, p)
|
||||||
|
processErr(bind.GenObjc(w, fset, p, true))
|
||||||
|
closer()
|
||||||
|
w, closer = writer(fname, p)
|
||||||
|
processErr(bind.GenObjc(w, fset, p, false))
|
||||||
|
closer()
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
errorf("unknown target language: %q", *lang)
|
errorf("unknown target language: %q", *lang)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func processErr(err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if list, _ := err.(bind.ErrorList); len(list) > 0 {
|
if list, _ := err.(bind.ErrorList); len(list) > 0 {
|
||||||
for _, err := range list {
|
for _, err := range list {
|
||||||
@ -72,9 +85,6 @@ func genPkg(pkg *build.Package) {
|
|||||||
errorf("%v", err)
|
errorf("%v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := closer(); err != nil {
|
|
||||||
errorf("error in closing output: %v", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var fset = token.NewFileSet()
|
var fset = token.NewFileSet()
|
||||||
@ -103,32 +113,46 @@ func parseFiles(dir string, filenames []string) []*ast.File {
|
|||||||
return files
|
return files
|
||||||
}
|
}
|
||||||
|
|
||||||
func writer(lang string, pkg *types.Package) (w io.Writer, closer func() error, err error) {
|
func writer(fname string, pkg *types.Package) (w io.Writer, closer func()) {
|
||||||
if *outdir == "" {
|
if fname == "" {
|
||||||
return os.Stdout, func() error { return nil }, nil
|
return os.Stdout, func() { return }
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(hakim): support output of multiple files e.g. .h/.m files for objc.
|
dir := filepath.Dir(fname)
|
||||||
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||||
if err := os.MkdirAll(*outdir, 0755); err != nil {
|
errorf("invalid output dir: %v", err)
|
||||||
return nil, nil, fmt.Errorf("invalid output dir: %v\n", err)
|
os.Exit(exitStatus)
|
||||||
}
|
}
|
||||||
fname := defaultFileName(lang, pkg)
|
|
||||||
f, err := os.Create(filepath.Join(*outdir, fname))
|
f, err := os.Create(fname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, fmt.Errorf("invalid output dir: %v\n", err)
|
errorf("invalid output dir: %v", err)
|
||||||
|
os.Exit(exitStatus)
|
||||||
}
|
}
|
||||||
return f, f.Close, nil
|
closer = func() {
|
||||||
|
if err := f.Close(); err != nil {
|
||||||
|
errorf("error in closing output file: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return f, closer
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultFileName(lang string, pkg *types.Package) string {
|
func defaultFileName(lang string, pkg *types.Package) string {
|
||||||
|
if *outdir == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
switch lang {
|
switch lang {
|
||||||
case "java":
|
case "java":
|
||||||
firstRune, size := utf8.DecodeRuneInString(pkg.Name())
|
firstRune, size := utf8.DecodeRuneInString(pkg.Name())
|
||||||
className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:]
|
className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:]
|
||||||
return className + ".java"
|
return filepath.Join(*outdir, className+".java")
|
||||||
case "go":
|
case "go":
|
||||||
return "go_" + pkg.Name() + ".go"
|
return filepath.Join(*outdir, "go_"+pkg.Name()+".go")
|
||||||
|
case "objc":
|
||||||
|
firstRune, size := utf8.DecodeRuneInString(pkg.Name())
|
||||||
|
className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:]
|
||||||
|
return filepath.Join(*outdir, "Go"+className+".m")
|
||||||
}
|
}
|
||||||
errorf("unknown target language: %q", lang)
|
errorf("unknown target language: %q", lang)
|
||||||
os.Exit(exitStatus)
|
os.Exit(exitStatus)
|
||||||
|
@ -13,7 +13,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
lang = flag.String("lang", "java", "target language for bindings, either java or go.")
|
lang = flag.String("lang", "java", "target language for bindings, either java, go, or objc (experimental).")
|
||||||
outdir = flag.String("outdir", "", "result will be written to the directory instead of stdout.")
|
outdir = flag.String("outdir", "", "result will be written to the directory instead of stdout.")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user